引言
學習知識,就是分解、整合的過程。
概述
想要全面深入的理解mybatis框架,首要前提是學習它的核心組件,mybatis的核心組件包括:SqlSessionFactoryBuilder(構造器)、SqlSessionFactory(工廠接口)、SqlSession(會話接口)、SQL Mapper(映射器)。接下來通過一張圖來整體展示四個核心組件的關係:
內容
一 SqlSessionFactoryBuilder(構造器)
(1)作用:根據配置信息或者代碼來生成SqlSessionFactory
(2)實現原理:SqlSessionFactoryBuilder類負責構建SqlSessionFactory,通過源碼分析,該類下提供了多個build的重載方法。其實這些方法可以歸結爲一個簽名的方法,但是這些方法的參數不統一,爲了方便調用,故重載了多個方法。如下圖:
究其根源,SqlSessionFactoryBuilder真正重載build方法只有如下三種,分別是InputStream(字節流)、Reader(字符流)、Configuration(類),字節流和字符流都是通過讀取XML配置文件的形式創建SqlSessionFactory,而Configuration採用的是java代碼方式創建SqlSessionFactory,我們一般常用的是讀取配置文件的形式:
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
public SqlSessionFactory build(Reader reader, String environment, Properties properties)
public SqlSessionFactory build(Configuration config)
讀取xml配置文件的方式構造SqlSessionFactory,構造過程中注入了configuration的實例對象,之後configuration實例對象解析XML配置文件來構建SqlSessionFactory,示例代碼String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = null;
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
通過分析,SqlSessionFactoryBuilder創建SqlSessionFactory採用了建造者的設計模式,相信大家一定非常熟悉,這裏SqlSessionFactoryBuilder扮演具體的建造者,Configuration類則負責建造的細節工作,SqlSession則是構造出來的產品。如下圖所示
二 SqlSessionFactory(工廠接口)
(1)作用:生產SqlSession會話
(2)實例代碼:sqlSession = sqlSessionFactory.openSession();
三 SqlSession(會話)
(1)作用:1)獲取映射器,讓映射器通過命名空間和方法名稱找到對應的SQL,發送給數據庫執行後返回結果;2)通過update、insert、select、delete等方法,帶上SQL的id來操作在XML中配置好的SQL,從而完成工作,與此同時它也支持事務,通過commit、rollback方法提交或者回滾事務。
(2)四大對象:
1)執行器(Executor):調度StatementHandler、ParameterHandler、ResultHandler等來執行對應的SQL。
種類:SIMPLE:簡易執行器,默認執行器
REUSE:一種執行器重用預處理語句
BATCH:執行器重用語句和批量更新,針對批量專用的執行器。
執行過程:步驟一,MyBatis根據Configuration來構建StatementHandler
步驟二,使用prepareStatement方法,對SQL編譯並對參數進行初始化
步驟三,調用prepareStatement的prepare()進行預編譯和基礎設置,再通過StatementHandler的parameterize()來設置參數並執行
步驟四,resultHandler再組裝查詢結果返回給調用者。
2)數據庫會話器(StatementHandler):使用數據庫的Statement(PrepareStatement)執行操作,四大對象的核心,起到承上啓下的作用。
種類:SimpleStatementHandler:對應SIMPLE執行器
PrepareStatementHandler:對應REUSE執行器
CallableStatementHandler:對應BATCH執行器
3)參數處理器(ParameterHandler):用於SQL對參數的處理
4)結果處理器(ResultSetHandler):進行最後數據集(ResultSet)的封裝返回處理。
(3)運行原理:SqlSession通過Executor(執行器)創建StatementHandler來運行的,具體原理請看下圖
四 Sql Mapper(映射器)
(1) 作用:1)定義參數、2)描述緩存、3)描述SQL語句、4)定義查詢結果和POJO的映射關係
(2) 主要元素:通過一個表格簡單介紹
(3)引入映射器mapper的方法
1)用文件路徑引入映射器
<mappers>
<mapper resource="對應mapper接口全路徑的配置文件">
</mappers>
2)用包名引入映射器 <mappers>
<mapper resource="對應mapper接口包的全路基">
</mappers>
3)用類註冊引入映射器 <mappers>
<mapper resource="對應mapper接口類的路徑">
</mappers>
4)用xml配置文件引入映射器 <mappers>
<mapper url="file:///var/mappers+文件路徑">
</mappers>
(4)引入映射器步驟
1)定義映射器接口RoleMapper.java
package com.liming.domain.mapper;
import com.liming.domain.po.Role;
public interface RoleMapper{
public Role getRole(Long id);
}
2)對應映射器接口的配置文件RoleMapper.xml:定義mapper映射規則和SQL語句
<?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">
<mapper namespace="com.liming.domain.mapper.RoleMapper">
<select id="getRole" parameterType="long" resultType="role">
select id, role_name as roleName from t_role where id = #{id}
</select>
</mapper>
3)在覈心配置SqlMapConfig.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>
<!-- 別名定義 -->
<typeAliases>
<typeAlias alias="role" type="com.liming.domain.po.Role"/>
</typeAliases>
<!--定義數據庫信息,默認使用development數據庫構建環境-->
<environments default="development">
<environment id="development">
<!--採用jdbc事務管理-->
<transactionMapper type="JDBC"/>
<!--配置數據庫鏈接信息-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="****"/>
</dataSource>
</environment>
</environments>
<!--定義映射器-->
<mappers>
<mapper resource="com/liming/domain/mapper/roleMapper.xml"/>
</mappers>
</configuration>
總結
mybatis的核心組件,重點是SqlSession和映射器。SqlSession的運行原理要有所瞭解,會使用SqlSession,同時也要理解mapper的原理,理解mybatis訪問數據看的具體原理。
下一篇博客總結有關配置元素以及屬性的知識點,敬請期待。