目錄
- Mybatis
- 1、簡介
- 1.1、什么是Mybatis
- 1.2、持久層
- 1.4、為什么需要Mybatis?
- 2、第一個Mybatis程式
- 2.1、搭建環境
- 2.2、創建一個模塊
- 2.4、測驗
- 3、CRUD
- 1.namespace
- 2、select
- 3、Insert
- 4、Update
- 5、Delete
- 6、分析錯誤
- 7、萬能Map
- 8、思考題
Mybatis
環境:
- JDK1.8
- Mysql
- maven
- IDEA
回顧:
- JDBC
- Mysql
- Java基礎
- Maven
- Junit
SSM框架:組態檔的,最好的方式:看官網檔案;
1、簡介
1.1、什么是Mybatis
- MyBatis 是一款優秀的持久層框架
- 它支持自定義 SQL、存盤程序以及高級映射,
- MyBatis 免除了幾乎所有的 JDBC 代碼以及設定引數和獲取結果集的作業,
- MyBatis 可以通過簡單的 XML 或注解來配置和映射原始型別、介面和 Java POJO(Plain Old Java Objects,普通老式 Java 物件)為資料庫中的記錄,
- MyBatis本是apache的一個開源專案iBatis,2010年這個專案由apache software foundation遷移到了[google code](https://baike.baidu.com/item/google code/2346604?fromModule=lemma_inlink),并且改名為MyBatis,
- 2013年11月遷移到Github,
如何獲得Mybatis?
-
maven倉庫:
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> -
Github:Search · Mybatis · GitHub
-
Mybatis中文檔案:mybatis – MyBatis 3 | 簡介
1.2、持久層
資料持久化:
- 持久化就是將程式的資料在持久狀態和瞬時狀態轉化的程序
- 記憶體:斷電即失
- 資料庫,iOS檔案持久化,
- 生活:冷藏,罐頭,
為什么需要持久化?
-
有一些物件,不能讓他丟掉,
-
記憶體太貴了
1.3、持久層
Dao層,Service層,controller層....
- 完成持久化作業的代碼塊
- 層界限十分明顯
1.4、為什么需要Mybatis?
- 幫助程式猿將資料存入資料庫中
- 方便
- 傳統的JDBC代碼太復雜了,簡化,皇家,自動化,
- 不用Mybatis也可以,更容上手,技術沒有高低之分
- 優點:
- 簡單易學
- 靈活
- sql和代碼的分離,提高了可維護性,
- 提供映射標簽,支持物件與資料庫的ORM欄位關系映射,
- 提供物件關系映射標簽,支持物件關系組建維護,
- 提供xml標簽,支持撰寫動態sql,
最重要的一點:使用的人多!
2、第一個Mybatis程式
思路:搭建環境-->匯入Mybatis--->撰寫代碼-->測驗!
2.1、搭建環境
搭建資料庫
<!--匯入依賴-->
<dependencies>
<!-- mysql驅動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!-- mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2.2、創建一個模塊
-
撰寫mybatis的核心組態檔
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <!--configuration核心組態檔--> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/21/com.mysql.jdbc.Driver"/> <property name="url" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/21/jdbc:mysql://localhost:3306/mybatis?useSSL=true& useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/21/root"/> <property name="password" value="https://www.cnblogs.com/zhongjianYuan/archive/2023/03/21/123456"/> </dataSource> </environment> </environments> </configuration> -
撰寫mybatis工具類
//SqlSessionFactory --->SqlSession
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//使用Mybatis第一步:獲取SqlSessionFactory物件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實體,
// SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法,
public static SqlSession getSqlSession(){
//SqlSession sqlSession = sqlSessionFactory.openSession();
//return sqlSession;
return sqlSessionFactory.openSession();
}
}
2.3、撰寫代碼
-
物體類
package com.jan.pojo; //物體類 public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } } -
Dao介面
package com.jan.dao; import com.jan.pojo.User; import java.util.List; //Dao == Mapper public interface UserDao { List<User> getUserList(); } -
介面實作類由原來的UserDaoImpl轉變為一個Mapper組態檔
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--命名空間namespace=系結一個對應的Dao/Mapper介面-->
<mapper namespace="com.jan.dao.UserDao">
<!--select查詢陳述句-->
<select id="getUserList" resultType="com.jan.pojo.User" >
select * from mybatis.user
</select>
</mapper>
2.4、測驗
注意點;報錯:
-
org.apache.ibatis.binding.BindingException: Type interface com.jan.dao.UserDao is not known to the MapperRegistry.
MapperRegistry是什么?
核心檔案中注冊mappers(我的是resources里的mybatis-config.xml里面配置的)
<!-- 每一個Mapper.XML都需要在Mybatis核心組態檔中注冊--> <mappers> <mapper resource="com/jan/dao/UserMapper.xml"/> </mappers>加入后,執行又出錯了:(資源過濾問題)java.lang.ExceptionInInitializerError
The error may exist in com/jan/dao/UserMapper.xml
原因在于:target 中的 dao 檔案了沒有 UserMapper.xml

讓pom.xml(總mybatis-study 和 mybatis-01)加入這段代碼 , 加入后要匯入 ctrl+shift+o
<!-- 在 build 中配置的resource,來防止我們資源匯出失敗的問題-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
-
系結介面錯誤問題
-
這里的介面是UserDao,其UserMapper.xml 需要系結UserDao的介面
<!--命名空間namespace=系結一個對應的Dao/Mapper介面--> <mapper namespace="com.jan.dao.UserDao"> <!--select查詢陳述句--> <select id="getUserList" resultType="com.jan.pojo.User" > select * from mybatis.user </select> </mapper>
-
可能遇到問題總結:
- 組態檔咩有注冊
- 系結介面錯誤
- 方法名不對
- 回傳型別不對
- Maven匯出資源問題
-
Junit測驗
public class UserDaoTest { @Test public void test(){ //第一步,獲取sqlSession物件 SqlSession sqlSession = MybatisUtils.getSqlSession(); //方式一:執行SQL UserDao userDao = sqlSession.getMapper(UserDao.class); List<User> userList = userDao.getUserList(); for (User user : userList) { //userList.for System.out.println(user); } //關閉sqlSession sqlSession.close(); } }
順序:一共就七個步驟

思考:以后哪些檔案不用修改?
UserDao 、UserMapper、Test要修改
3、CRUD
1.namespace
namespace 中的包壓迫和Dao/Mapper 介面的包名一致!
2、select
選擇,查詢陳述句;
- id: 就是對用namespace中的方法名;
- resultType: SQL陳述句執行的回傳值!
- parameterType:引數型別!
-
撰寫介面
//根據ID查詢用戶 User getUserById(int id); -
撰寫對應的Mapper中的陳述句
<select id="getUserById" parameterType="int" resultType="com.jan.pojo.User"> select * from mybatis.user where id = #{id} </select> -
測驗
@Test
public void getUserById(){
//第一步:獲取sqlSession物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行SQL(獲得介面)
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
3、Insert
<!--物件中的屬性,可以直接取出來-->
<insert id="addUser" parameterType="com.jan.pojo.User">
insert into mybatis.user (id,name,pwd)
values (#{id},#{name},#{pwd});
</insert>
4、Update
<update id="updateUser" parameterType="com.jan.pojo.User">
update mybatis.user
set name = #{name},
pwd = #{pwd}
where id = #{id};
</update>
5、Delete
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id = #{id};
</delete>
注意點:
-
增刪改需要提交事務
sqlSession.commit();
本人專治各種不服:
-
IDEA連接資料庫之后,輸入SQL陳述句沒有自動提示的解決方案:
傳統思路:path是 專案 的位置


若還是不行,接著看:

點擊進入,然后往下拉,直到看到MySQL(SQL),點擊它即可,
注意:在增刪改的 xml 語法中,必須有自動提示才能執行成功,只有系統自動提示出資料庫才能有效進行,否則自己純手動輸入將會失敗,


6、分析錯誤
- 標簽不要匹配錯
- resource 系結 mapper , 需要使用路徑!
- 程式組態檔必須符合規范!
- NullPointterException,沒有注冊到資源!
- 輸出的xml 檔案中存在中文亂碼問題!
- maven資源包沒有匯出問題!
7、萬能Map
假設,我們的物體類,或者資料庫中的表,欄位或者引數過多,我們應當考慮使用Map!
//萬能的Map
int addUser2(Map<String,Object>map);
<!--物件中的屬性,可以直接取出來 傳遞map的key -->
<insert id="addUser2" parameterType="map">
insert into mybatis.user (id,name,pwd)
values (#{userid},#{userName},#{passWord});
</insert>
@Test
public void addUser2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("userid",5);
map.put("userName","Hello");
map.put("passWord","12345516");
mapper.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
第二個例子:
User getUserById2(Map<String ,Object>map);
<select id="getUserById2" parameterType="map" resultType="com.jan.pojo.User">
select * from mybatis.user where id = #{helloId} and name = #{name};
</select>
@Test
public void getUserById2(){
//第一步:獲取sqlSession物件
SqlSession sqlSession = MybatisUtils.getSqlSession();
//執行SQL(獲得介面)
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Map<String, Object> map = new HashMap<String, Object>();
map.put("helloId",1);
map.put("name","Jan");
mapper.getUserById2(map);
sqlSession.close();
}
Map傳遞引數,直接在sql中取出key即可!【parameterType="map"】
物件傳遞引數,直接在sql中取物件的屬性即可!【parameterType="Object】
只有一共基本型別引數的情況下,可以直接在sql中取到!
多個引數用Map,或者注解!
8、思考題
模糊查詢怎么寫?
-
Java代碼執行的時候,傳遞通配符 % %
List<User> userLike = mapper.getUserLike("%李%"); -
在sql拼接中使用通配符!(我的IDEA會爆紅)
//模糊查詢
List<User> getUserLike(String value);
<!--
select * from mybatis.user where id = ?
select * from mybatis.user where id = 1 or 1=1
-->
<select id="getUserLike" resultType="com.jan.pojo.User">
select *
from mybatis.user where name like #{value};
</select>
@Test
public void getUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userLike = mapper.getUserLike("%李%");
for (User user : userLike) {
System.out.println(user);
}
sqlSession.close();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547636.html
標籤:其他
上一篇:C++入門
