MyBatis功能架構設計
image.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或者基本資料型別),Mybatis會根據SQL的ID找到對應的MappedStatement,然後根據傳入引數物件對MappedStatement進行解析,解析後可以得到最終要執行的SQL語句和引數。
(3)SQL執行:將最終得到的SQL和引數拿到資料庫進行執行,得到操作資料庫的結果。
(4)結果對映:將操作資料庫的結果按照對映的配置進行轉換,可以轉換成HashMap、JavaBean或者基本資料型別,並將最終結果返回。
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
SqlSession 作為MyBatis工作的主要頂層API,表示和資料庫互動的會話,完成必要資料庫增刪改查功能
Executor MyBatis執行器,是MyBatis 排程的核心,負責SQL語句的生成和查詢快取的維護
StatementHandler 封裝了JDBC Statement操作,負責對JDBCstatement的操作,如設定引數、將Statement結果集轉換成List集合。
ParameterHandler 負責對使用者傳遞的引數轉換成JDBC Statement 所需要的引數
ResultSetHandler *負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合;
TypeHandler 負責java資料型別和jdbc資料型別之間的對映和轉換
MappedStatement MappedStatement維護了一條<select|update|delete|insert>節點的封
SqlSource 負責根據使用者傳遞的parameterObject,動態地生成SQL語句,將資訊封裝到BoundSql物件中,並返回
BoundSql 表示動態生成的SQL語句以及相應的引數資訊
Configuration MyBatis所有的配置資訊都維持在Configuration物件之中
免費獲取學習Java高架構、分散式架構、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師視訊免費獲取請加架構群:863621962