# 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`