MyBatis詳細原始碼解析(上篇)
阿新 • • 發佈:2020-12-15
# 前言
我會一步一步帶你剖析MyBatis這個經典的半ORM框架的原始碼!
我是使用Spring Boot + MyBatis的方式進行測試,但並未進行整合,還是使用最原始的方式。
# 專案結構
**匯入依賴:**
1. mybatis:[mybatis](https://mvnrepository.com/artifact/org.mybatis/mybatis)
2. mysql-connector-java:[mysql-connector-java](https://mvnrepository.com/artifact/mysql/mysql-connector-java)
**Payment表:**
![](https://markdown-image-bucket.oss-cn-shanghai.aliyuncs.com/images/20201213140540.png)
**Payment實體類:**
```java
@Data
public class Payment implements Serializable {
private Integer id;
private String serial;
}
```
**PaymentMapper介面:**
```java
@Repository
public interface PaymentMapper {
// 根據Id查詢支付資訊
Payment getPaymentById(@Param("id") Integer id);
}
```
**配置檔案目錄:**
![](https://markdown-image-bucket.oss-cn-shanghai.aliyuncs.com/images/20201213141729.png)
**Payment.xml:**
```xml
```
**database.properties:**
```properties
# 配置資料庫資訊
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/spring_cloud?serverTimezone=Asia/Shanghai
username=username
password=password
```
**mybatis-config.xml:**
```xml
```
**測試類:**
```java
@SpringBootTest
class MybatisTestApplicationTests {
@Test
void contextLoads() {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
Payment payment = sqlSession.selectOne("com.gzy.mybatistest.mapper.PaymentMapper.getPaymentById", 1);
System.out.println(payment);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
```
# 相關元件
**Configuration:**MyBatis所有的配置資訊都儲存在Configuration物件之中,配置檔案中的大部分配置都會儲存到該類中。
**SqlSession:**作為MyBatis工作的主要頂層API,表示和資料庫互動時的會話,完成必要資料庫增刪改查功能。
**Executor:**MyBatis執行器,是MyBatis排程的核心,負責SQL語句的生成和查詢快取的維護。
**StatementHandler:**封裝了JDBC Statement操作,負責對JDBC Statement的操作,如設定引數等。
**ParameterHandler:**負責對使用者傳遞的引數轉換成JDBC Statement所對應的資料型別。
**ResultSetHandler:**負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合。
**TypeHandler:**負責Java資料型別和Jdbc資料型別(也可以說是資料表列型別)之間的對映和轉換。
**MappedStatement:**MappedStatement維護一條