mybatis框架(二)——核心組件及其作用

引言

            學習知識,就是分解、整合的過程。

概述

             想要全面深入的理解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訪問數據看的具體原理。

      下一篇博客總結有關配置元素以及屬性的知識點,敬請期待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章