1. 程式人生 > >MyBatis - 入門之原理機制

MyBatis - 入門之原理機制

MyBatis的前身叫iBatis,本是apache的一個開源專案, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis。MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJOs(Plan Old Java Objects,普通的Java物件)對映成資料庫中的記錄。

Mybatis的功能架構分為三層(圖片借用了百度百科):

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

2)       資料處理層:負責具體的SQL查詢、SQL解析、SQL執行和執行結果對映處理等。它主要的目的是根據呼叫的請求完成一次資料庫操作。

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

 

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);
}

 

2、SqlSessionFactory

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>

要注意XML頭部的宣告,需要用來驗證XML文件正確性。typeAliases 元素是包含所有typeAlias(別名)的列表,別名用來替換完整類名,這樣在需要完整類名的地方就可以用別名來代替。environment元素體中包含對事務管理和連線池的環境配置。mappers元素是包含所有mapper(對映器)的列表,這些mapper的XML檔案包含SQL程式碼和對映定義資訊。當然,在XML配置檔案中還有很多可以配置的,上面的示例指出的則是最關鍵的部分,其他配置請參考Mybatis的官方文件。

 

3、SqlSession

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

到目前為止,我們看到的都是mybatis的流程,我們的應用程式在什麼地方插入到這個流程中並獲得我們想要的結果呢?就是SqlSession這裡。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

處理查詢結果。

 

轉自:https://blog.csdn.net/hupanfeng/article/details/9068003