Mybatis
1. 簡介
1.1 什麼是Mybatis
MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)爲數據庫中的記錄。
配置Mybatis:
-
將 mybatis-x.x.x.jar 文件置於類路徑(classpath)中即可。
-
如果使用Maven構建項目則將依賴配置到pom.xml文件中。
依賴搜索網站:
https://mvnrepository.com/search?q=mybatis
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
-
官方文檔:https://mybatis.org/mybatis-3/zh/getting-started.html
1.2 持久化
數據持久化
- 持久化就是將程序的數據在持久狀態和瞬時狀態轉化的過程。
- 內存:斷電即失。
- 數據庫(jdbc),io文件持久化。
爲什麼需要持久化?
由於內存斷電即失,有些對象,不能讓他丟掉。
1.3 持久層
Dao層,Service層,Controller層
- 完成持久化工作的代碼塊
- 曾界限十分明細。
2.第一個Mybatis程序
思路:搭建環境–>導入Mybatis–>編寫代碼–>測試
2.1 搭建環境
1.搭建數據庫
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PXGZ5r4x-1591430014169)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200409192623831.png)]
- 創建項目
- 添加依賴
<!--導入依賴-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.2 創建模塊(配置)
新建一個moudle
-
編寫mybatis核心配置文件
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://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="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 每個Mapper.xml都需要在Mybatis核心配置文件中註冊--> <mappers> <mapper resource="com/dao/UserDao.xml"/> </mappers> </configuration>
-
編寫mybatis工具類
MybatisUtils
package com.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; //sqlSessionFactory public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { // 第一步 必備 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }catch (IOException e){ e.printStackTrace(); } } //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實例。 // SqlSession 提供了在數據庫執行 SQL 命令所需的所有方法。 // 你可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。例如: public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
2.3 編寫代碼
-
實體類
package com.pojo; public class User { private int id; private String name; private String pwd; public User(){ } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } 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; } }
-
dao接口
Userdao.java
package com.dao; import com.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
-
實現接口的類由UserDaoimp轉換成爲一個.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace 綁定一個對應的dao/mapper接口--> <mapper namespace="com.dao.UserDao"> <!-- select查詢語句 resultType返回結果集--> <select id="getUserList" resultType="com.pojo.User"> select * from mybatis.user </select> </mapper>
2.3 測試
package com;
import com.dao.UserDao;
import com.pojo.User;
import com.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserDaoTest {
@Test
public void test(){
//第一步 通過MybatisUtils工具類獲取SqlSession對象
SqlSession sqlSession= MybatisUtils.getSqlSession();
//執行sql
UserDao userDao=sqlSession.getMapper(UserDao.class);
List<User> userList=userDao.getUserList();
//遍歷user表
for (User user:userList){
System.out.println(user);
}
//關閉 sqlSession
sqlSession.close();
}
}
2.4 常見錯誤
錯誤1:
org.apache.ibatis.binding.BindingException:
Type interface com.dao.UserDao is not known to the MapperRegistry.
原因:沒有在Mybatis核心配置文件
<mappers>
<mapper resource="com/dao/UserDao.xml"/>
</mappers>
錯誤2:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-X15LW9BN-1591430014172)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410135615229.png)]
java.lang.ExceptionInInitializerError
at com.UserDaoTest.test(UserDaoTest.java:15)
原因:在maven 中沒有xml文件沒有生效(在target/classes目錄中沒有此配置文件)
解決:在resources目錄下 創建一個跟java目錄一樣的文件夾把xml文件放在resources的子目錄下
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sSuLhOLR-1591430014173)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410135933351.png)]
此時會自動在target/classes目錄中生成該配置文件
注意3:
namespace 中 的包名要跟Dao/Mapper中的接口包名一致。
2.5Mybatis 環境搭建總結
搭建環境–>導入Mybatis–>編寫代碼–>測試
搭建環境
-
搭建數據庫
-
創建項目(maven)
-
在pom.xml中添加依賴
依賴搜索網站:https://mvnrepository.com/search?q=mybatis
導入Mybatis
- 創建一個新的模塊
- 創建mybatis核心配置文件 mybatis-config.xml
- 編寫mybatis工具類
編寫代碼
- 實體類創建
- dao層接口
- 實現dao層接口的配置文件(實現接口的類由UserDaoimp轉換成爲一個.xml文件)
測試類及常見問題
- 測試類 中不要忘記關閉流
- .xml文件可能會存在不生效的問題,解決:在resources目錄下 創建一個跟java目錄一樣的文件夾把xml文件放在resources的子目錄下
3.增刪改查
增刪改需要提交事務
-
namespace 綁定一個對應的dao/mapper接口
-
select查詢語句 resultType返回結果集
-
id:對應的namespace中的方法名;
-
resultType :sql語句執行的返回類型
-
parameterType :參數類型
1.UserDao/Mapper接口類:
UserDao.java
public interface UserDao {
List<User> getUserList();
//查詢
User getUserById(int id);
//增加
int addUser(User user);
//刪除
int deleteUser(int id);
//修改
int updateUser(User user);
}
2.UserDao.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 綁定一個對應的dao/mapper接口-->
<mapper namespace="com.dao.UserDao">
<!-- select查詢語句 resultType返回結果集-->
<select id="getUserList" resultType="com.pojo.User">
select * from mybatis.user
</select>
<!-- 根據id查詢-->
<select id="getUserById" parameterType="int" resultType="com.pojo.User">
select * from mybatis.user where id = #{id};
</select>
<!-- 增加一個用戶-->
<insert id="addUser" parameterType="com.pojo.User">
insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});
</insert>
<!-- 修改一個用戶-->
<update id="updateUser" parameterType="com.pojo.User">
update mybatis.user set name=#{name},pwd=#{pwd} where id= #{id};
</update>
<!-- 刪除一個用戶-->
<delete id="deleteUser" parameterType="com.pojo.User">
delete from mybatis.user where id=#{id};
</delete>
</mapper>
3.測試類
public class UserDaoTest {
//查詢用戶信息
@Test
public void test(){
//第一步 通過MybatisUtils工具類獲取SqlSession對象
SqlSession sqlSession= MybatisUtils.getSqlSession();
try {
//執行sql
UserDao userDao=sqlSession.getMapper(UserDao.class);
List<User> userList=userDao.getUserList();
//遍歷user表
for (User user:userList){
System.out.println(user);
}
}
finally {
//關閉 sqlSession
sqlSession.close();
}
}
//根據id查詢用戶信息
@Test
public void getUserByid(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = dao.getUserById(2);
System.out.println(user);
sqlSession.close();
}
//增加用戶
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
int add = dao.addUser(new User(4, "張三", "12345"));
//提交事務
sqlSession.commit();
sqlSession.close();
}
//刪除用戶
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
int i = dao.deleteUser(3);
sqlSession.commit();
sqlSession.close();
}
//修改用戶信息
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
dao.updateUser(new User(2,"李四","12345"));
sqlSession.commit();
sqlSession.close();
}
}
4.萬能Map
如果實體類或者數據庫中的表,字段或者參數過多,應考慮使用Map!
用Map 避免了用實體類(實體類會調用構造方法,所有傳遞參數是固定的),即想傳幾個參數就傳遞幾個參數
接口:
int addUser2(Map<String,Object> map);
xml:
<!--對象中的屬性,可以直接取出來 傳遞map的key-->
<insert id="addUser2" parameterType="map">
insert into mybatis.user(id,name) values (#{id},#{name});
</insert>
測試類:
//使用map增加
@Test
public void mapAddUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
Map<String,Object>map=new HashMap<String, Object>();
map.put("id",6);
map.put("name","map增加");
dao.addUser2(map);
sqlSession.commit();
sqlSession.close();
}
5.模糊查詢
- java代碼執行的時候,傳遞通配符
- sql拼接的時候寫
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9McUyAmB-1591430014176)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410200922863.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZXQAgBqd-1591430014177)(C:\Users\dell\Desktop\技術棧\JAVA\Mybatis\Mybatis.assets\image-20200410201128846.png)]