Mybatis架構與原理

來源:互聯網
上載者:User

標籤:result   pool   環境   包括   blog   char   免費   rda   mapped   

MyBatis功能架構設計

mage.png

功能架構講解:

我們把Mybatis的功能架構分為三層:

(1)API介面層:提供給外部使用的介面API,開發人員通過這些本地API來操縱資料庫。介面層一接收到調用請求就會調用資料處理層來完成具體的資料處理。

(2)資料處理層:負責具體的SQL尋找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次資料庫操作。

(3)基礎支撐層:負責最基礎的功能支撐,包括串連管理、交易管理、配置載入和緩衝處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的資料處理層提供最基礎的支撐。

架構架構

架構架構講解:

這張圖從上往下看。MyBatis的初始化,會從mybatis-config.xml設定檔,解析構造成Configuration這個類,就是圖中的紅框。

(1)載入配置:配置來源於兩個地方,一處是設定檔,一處是Java代碼的註解,將SQL的配置資訊載入成為一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),儲存在記憶體中。

(2)SQL解析:當API介面層接收到調用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基礎資料型別 (Elementary Data Type)),Mybatis會根據SQL的ID找到對應的MappedStatement,然後根據傳入參數對象對MappedStatement進行解析,解析後可以得到最終要執行的SQL語句和參數。

(3)SQL執行:將最終得到的SQL和參數拿到資料庫進行執行,得到操作資料庫的結果。

(4)結果映射:將操作資料庫的結果按照映射的配置進行轉換,可以轉換成HashMap、JavaBean或者基礎資料型別 (Elementary Data Type),並將最終結果返回。

MyBatis核心類
1、SqlSessionFactoryBuilder

每一個MyBatis的應用程式的入口是SqlSessionFactoryBuilder。

它的作用是通過XML設定檔建立Configuration對象(當然也可以在程式中自行建立),然後通過build方法建立SqlSessionFactory對象。沒有必要每次訪問Mybatis就建立一次SqlSessionFactoryBuilder,通常的做法是建立一個全域的對象就可以了。樣本程式如下:

private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;private static SqlSessionFactory sqlSessionFactory;private static void init() throws IOException {    String resource = "mybatis-config.xml";    Reader reader = Resources.getResourceAsReader(resource);    sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();    sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);}
org.apache.ibatis.session.Configuration 是mybatis初始化的核心。

mybatis-config.xml中的配置,最後會解析xml成Configuration這個類。

SqlSessionFactoryBuilder根據傳入的資料流(XML)產生Configuration對象,然後根據Configuration對象建立預設的SqlSessionFactory執行個體。

2、SqlSessionFactory對象由SqlSessionFactoryBuilder建立:

它的主要功能是建立SqlSession對象,和SqlSessionFactoryBuilder對象一樣,沒有必要每次訪問Mybatis就建立一次SqlSessionFactory,通常的做法是建立一個全域的對象就可以了。SqlSessionFactory對象一個必要的屬性是Configuration對象,它是儲存Mybatis全域配置的一個設定物件,通常由SqlSessionFactoryBuilder從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 type="org.iMybatis.abc.dao.UserDao" alias="UserDao" />       <typeAlias type="org.iMybatis.abc.dto.UserDto" alias="UserDto" />   </typeAliases>   <!-- 配置環境變數 -->   <environments default="development">       <environment id="development">           <transactionManager type="JDBC" />           <dataSource type="POOLED">               <property name="driver" value="com.mysql.jdbc.Driver" />               <property name="url" value="jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK" />               <property name="username" value="iMybatis" />               <property name="password" value="iMybatis" />           </dataSource>       </environment>   </environments>   <!-- 配置mappers -->   <mappers>       <mapper resource="org/iMybatis/abc/dao/UserDao.xml" />   </mappers></configuration>

3、SqlSession

SqlSession對象的主要功能是完成一次資料庫的訪問和結果的映射,它類似於資料庫的session概念,由於不是安全執行緒的,所以SqlSession對象的範圍需限制方法內。SqlSession的預設實作類別是DefaultSqlSession,它有兩個必須配置的屬性:Configuration和Executor。Configuration前文已經描述這裡不再多說。SqlSession對資料庫的操作都是通過Executor來完成的。

SqlSession :預設建立DefaultSqlSession 並且開啟一級緩衝,建立執行器 、賦值。

SqlSession有一個重要的方法getMapper,顧名思義,這個方式是用來擷取Mapper對象的。什麼是Mapper對象?根據Mybatis的官方手冊,應用程式除了要初始並啟動Mybatis之外,還需要定義一些介面,介面裡定義訪問資料庫的方法,存放介面的包路徑下需要放置同名的XML設定檔。

SqlSession的getMapper方法是聯絡應用程式和Mybatis紐帶,應用程式訪問getMapper時,Mybatis會根據傳入的介面類型和對應的XML設定檔產生一個代理對象,這個代理對象就叫Mapper對象。應用程式獲得Mapper對象後,就應該通過這個Mapper對象來訪問Mybatis的SqlSession對象,這樣就達到裡插入到Mybatis流程的目的。

SqlSession session= sqlSessionFactory.openSession();  UserDao userDao = session.getMapper(UserDao.class);  UserDto user = new UserDto();  user.setUsername("iMybatis");  List<UserDto> users = userDao.queryUsers(user);  public interface UserDao {    public List<UserDto> queryUsers(UserDto user) throws Exception;}<?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="org.iMybatis.abc.dao.UserDao">      <select id="queryUsers" parameterType="UserDto" resultType="UserDto"          useCache="false">          <![CDATA[         select * from t_user t where t.username = #{username}         ]]>      </select>  </mapper>

4、Executor

Executor對象在建立Configuration對象的時候建立,並且緩衝在Configuration對象裡。Executor對象的主要功能是調用StatementHandler訪問資料庫,並將查詢結果存入緩衝中(如果配置了緩衝的話)。

5、StatementHandler

StatementHandler是真正訪問資料庫的地方,並調用ResultSetHandler處理查詢結果。

6、ResultSetHandler

處理查詢結果。

MyBatis成員層次&職責

image.png

1、SqlSession 作為MyBatis工作的主要頂層API,表示和資料庫互動的會話,完成必要資料庫增刪改查功能
2、Executor MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的產生和查詢快取的維護
3、StatementHandler 封裝了JDBC Statement操作,負責對JDBCstatement的操作,如設定參數、將Statement結果集轉換成List集合。
4、ParameterHandler 負責對使用者傳遞的參數轉換成JDBC Statement 所需要的參數
5、ResultSetHandler *負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;
6、TypeHandler 負責java資料類型和jdbc資料類型之間的映射和轉換
7、MappedStatement MappedStatement維護了一條<select|update|delete|insert>節點的封
8、SqlSource 負責根據使用者傳遞的parameterObject,動態地產生SQL語句,將資訊封裝到BoundSql對象中,並返回
9、BoundSql 表示動態產生的SQL語句以及相應的參數資訊
10、Configuration MyBatis所有的配置資訊都維持在Configuration對象之中

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:855801563

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導

同時大家可以多多關注一下小編 純乾貨 大家一起學習進步

Mybatis架構與原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.