# MyBatis 配置步驟及簡單使用 1. `pom.xml` 添加 MyBatis 依賴 ```xml= <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency> ``` 2. 創建 MyBatis 核心配置文件 存放在 `src/main/resources` 目錄底下,習慣命名 `mybatis-config.xml` ```xml= <?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 引入 MyBatis 的映射文件 --> <mappers> <mapper resource=""/> </mappers> </configuration> ``` 3. 創建 Mapper 接口 需先有一個 pojo 類 (位於 `src/main/java` 的 `com.example.demo` package 中的 `pojo` 目錄) 如 `User.java` 再於和 `pojo` 的同一層創建 `mapper` 目錄,在目錄中創建 `UserMapper` Interface ```java= package com.example.demo.mapper; public interface UserMapper { /** * 添加用戶 * @rewturn * / int insertUser(); } ``` 4. 創建 MyBatis 的映射文件 存放於 `src/main/resources/mappers` 目錄下,範例檔名為 `UserMapper.xml` ```xml= <?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 對應創建的 Mapper Interface 的位置 --> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- 映射文件 和 mapper 接口要保證兩個一致: 1. 映射文件的 namespace 要和 mpaaer 接口的全類名保持一致 2. 映射文件中 SQL 語句的 id 要和 mapper 接口中的方法名一致 資料表->實體類->Mapper接口->映射文件 --> <!-- int insertUser(); --> <insert id="insertUser"> insert into t_user values(null,'admin','123456',23,'男','12345@qq.com') </insert> </mapper> ``` 5. 把映射文件引入核心配置文件 `mybatis-config.xml` 中 添加 19~21 行 ```xml= <?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!-- 引入 MyBatis 的映射文件 --> <mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers> </configuration> ``` 6. 創建測試類 在 `src/test/java` 目錄底下創建 `com.example.demo.test.MyBatisTest` ```java= package com.example.demo.test; import org.apache.ibatis.io.Resources; import org.junit.Test; public class MyBatisTest { @Test public void testInsert() throws IOException { // 獲取核心配置文件的輸入流 (要處理異常) InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 獲取 SqlSessionFactoryBuilder 對象,再透過 `build()` 構建 SqlSessionFactory 對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取 sql 的會話對象 SqlSession,是 MyBatis 提供的操作數據庫的對象 // openSession() 無參數方法是預設不會自動提交事務 // 若使用 openSession(true) 會自動提交事務 try (SqlSession session = sqlSessionFactory.openSession(true)) { // 獲取 UserMapper 的代理實現類對象 (使用代理模式) UserMapper mapper = session.getMapper(UserMapper.class); // 調用 mapper 接口中的方法,實現添加用戶的功能 int result = mapper.insertUser(); System.out.println("結果: " + result); // 提交事務 // session.commit(); // 因為使用 try-with-resources 自動關閉資源,所以省略 // session.close(); } } } ``` 部分參考自 [mybatis 入門](https://mybatis.org/mybatis-3/zh/getting-started.html) --- ### 查詢功能 1. 在 `mapper` 目錄下的 `UserMapper` Interface 中新增 `getUserById()` ```java= package com.example.demo.mapper; public interface UserMapper { /** * 添加用戶 * @rewturn * / int insertUser(); /** * 根據 id 查詢用戶資訊 * @rewturn * / User getUserById(); } ``` 2. `src/main/resources/mappers` 目錄下的`UserMapper.xml` 中新增 `select` 標籤 ```xml= <?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 對應創建的 Mapper 接口的位置 --> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- mapper 接口和映射文件要保證兩個一致: 1. mpaaer 接口的全類名和映射文件的 namespace 一致 2. mapper 接口中的方法名要和映射文件中的 sql 的 id 一致 --> <!-- int insertUser(); --> <insert id="insertUser"> insert into t_user values(null,'admin','123456',23,'男','12345@qq.com') </insert> <!-- User getUserById(); --> <select id="getUserById"> select * from t_user where id = 1 </select> </mapper> ``` 3. 在 `src/test/java` 目錄底下的 `com.example.demo.test.MyBatisTest` 中新增 `testGetUserById()` ```java= package com.example.demo.test; import org.apache.ibatis.io.Resources; import org.junit.Test; public class MyBatisTest { @Test public void testInsert() throws IOException { // 獲取核心配置文件的輸入流 (要處理異常) InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 獲取 SqlSessionFactoryBuilder 對象,再透過 `build()` 構建 SqlSessionFactory 對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取 sql 的會話對象 SqlSession,是 MyBatis 提供的操作數據庫的對象 // openSession() 無參數方法是預設不會自動提交事務 // 若使用 openSession(true) 會自動提交事務 try (SqlSession session = sqlSessionFactory.openSession(true)) { // 獲取 UserMapper 的代理實現類對象 (使用代理模式) UserMapper mapper = session.getMapper(UserMapper.class); // 調用 mapper 接口中的方法,實現添加用戶的功能 int result = mapper.insertUser(); System.out.println("結果: " + result); // 提交事務 // session.commit(); // 因為使用 try-with-resources 自動關閉資源,所以省略 // session.close(); } } @Test public void testGetUserById() throws IOException { // 獲取核心配置文件的輸入流 (要處理異常) InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 獲取 SqlSessionFactoryBuilder 對象,再透過 `build()` 構建 SqlSessionFactory 對象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 獲取 sql 的會話對象 SqlSession,是 MyBatis 提供的操作數據庫的對象 // openSession() 無參數方法是預設不會自動提交事務 // 若使用 openSession(true) 會自動提交事務 try (SqlSession session = sqlSessionFactory.openSession(true)) { // 獲取 UserMapper 的代理實現類對象 (使用代理模式) UserMapper mapper = session.getMapper(UserMapper.class); // 調用 mapper 接口中的方法,實現查詢用戶的功能 User user = mapper.getUserById(); System.out.println(user); // 提交事務 // session.commit(); // 因為使用 try-with-resources 自動關閉資源,所以省略 // session.close(); } } } ``` 此時測試會出現異常 ``` A query was run and no Result Maps were found for the Mapped Statement '***'. It's likely that neither a Result Type nor a Result Map was specified. ``` 4. 原因是**沒有**在 `select` 標籤中設置 `resultType` 將查詢數據轉換為 java 類型 ```xml= <?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 對應創建的 Mapper 接口的位置 --> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- mapper 接口和映射文件要保證兩個一致: 1. mpaaer 接口的全類名和映射文件的 namespace 一致 2. mapper 接口中的方法名要和映射文件中的 sql 的 id 一致 --> <!-- int insertUser(); --> <insert id="insertUser"> insert into t_user values(null,'admin','123456',23,'男','12345@qq.com') </insert> <!-- User getUserById(); --> <!-- resultType: 設置結果類型,即查詢的數據要轉換為的 java 類型 resultMap: 自定義映射,處理多對一及一對多的映射關係 --> <select id="getUserById" resultType="com.example.demo.pojo.User"> select * from t_user where id = 1 </select> </mapper> ``` 設置後就能查詢成功 5. 即使是查詢所有 `User` 的 `List<User> getAllUser()`,`resultType` 也是一樣設置為 `User` ```xml= <?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 對應創建的 Mapper 接口的位置 --> <mapper namespace="com.example.demo.mapper.UserMapper"> <!-- mapper 接口和映射文件要保證兩個一致: 1. mpaaer 接口的全類名和映射文件的 namespace 一致 2. mapper 接口中的方法名要和映射文件中的 sql 的 id 一致 --> <!-- int insertUser(); --> <insert id="insertUser"> insert into t_user values(null,'admin','123456',23,'男','12345@qq.com') </insert> <!-- User getUserById(); --> <!-- resultType: 設置結果類型,即查詢的數據要轉換為的 java 類型 resultMap: 自定義映射,處理多對一及一對多的映射關係 --> <select id="getUserById" resultType="com.example.demo.pojo.User"> select * from t_user where id = 1 </select> <!-- List<User> getAllUser(); --> <select id="getAllUser" resultType="com.example.demo.pojo.User"> select * from t_user </select> </mapper> ``` ###### tags: `MyBatis`