1. 程式人生 > >MyBatis詳細原始碼解析(上篇)

MyBatis詳細原始碼解析(上篇)

# 前言 我會一步一步帶你剖析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維護一條

最近訪問