Mybatis運行原理(帶你三步走)
官網地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html
第一步:初始化階段,解析並加載到Configuration實例中。
- 讀取xml配置文件和註解中的配置信息,創建配置對象,並完成各個模塊的初始化工作。
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例爲中心的。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先定製的 Configuration 的實例構建出 SqlSessionFactory 的實例。
源碼解讀入口:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
其中:
XMLConfigBuilder:解析mybatis-config.xml文件。
XMLMapperBuilder:解析所有的*mapper.xml文件。
XMLStatementBuilder:解析SQL語句(select|insert|update|delete)。
以上解析的文件均加載到Configuration實例中。
第二步:代理階段
使用jdk動態代理,封裝IBatis編程模型,找到訪問數據庫時對應的方法及傳參
- 創建SqlSession響應請求
- 動態代理封裝iBatis的編程模型
- 使用mapper接口訪問數據庫
源碼解析入口:
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
翻譯過程:
找到session中對應的方法執行 <<<----- MapperMethod.SqlCommand.type + MapperMethod.MethodSignature.returnType
找到命名空間和方法名 <<<----- MapperMethod.SqlCommand.name
傳遞參數 <<<----- MapperMethod.MethodSignature.convertArgsToSqlCommandParam
第三步:數據讀寫階段
遵循jdbc規範,通過SqlSession完成SQL的解析,參數的映射,SQL的執行、結果的解析過程。
Mybatis的四大對象:
Executor:通過對SimpleExecutor doQuery()方法的解讀發現,Executor是調度器。
StatementHandler:它的作用是使用數據庫的Statement或PrepareStatement執行操作,起承上啓下作用。
ParameterHandler:對預編譯的SQL語句進行參數設置。
ResultSetHandler:對數據庫返回的結果集(ResultSet)進行封裝,返回用戶指定的實體類型。
TransactionalCache:二級緩存
PerpetualCache:一級緩存
注:數據查詢時,先從二級緩存取數據,若取不到則再從一級緩存中取數據(這是MySQL規定),若一級緩存中再獲取不到,則從數據庫中取數據。
Executor內部運作過程:
以上只是梳理Mybatis大致處理流程,像Mybatis緩存機制等還未整理,後期會補上這塊。