1. 程式人生 > >MyBatis_執行原理

MyBatis_執行原理

注:本筆記是根據尚矽谷的MyBatis視訊記錄的

一、Mybatis架構圖

二、Mybatis的工作原理

三、Mybatis的執行原理原始碼分析

Mybatis執行資料庫查詢時,我們需要編寫的程式碼:

一共分為四步:

  • 獲取sqlSessionFactory物件
  • 獲取sqlSession物件
  • 獲取介面的實現類mapper代理物件
  • 介面的實現類物件執行資料庫方法進行增刪改查操作
​public SqlSessionFactory getSqlSessionFactory() throws IOException {
	String resource = "mybatis-config.xml";
	InputStream inputStream = Resources.getResourceAsStream(resource);
	return new SqlSessionFactoryBuilder().build(inputStream);
}
​
@Test
public void test01() throws IOException {
	// 1、獲取sqlSessionFactory物件
	SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
	// 2、獲取sqlSession物件
	SqlSession openSession = sqlSessionFactory.openSession();
	try {
		// 3、獲取介面的實現類物件
		//會為介面自動的建立一個代理物件,代理物件去執行增刪改查方法
		EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        //4、介面的實現類物件執行資料庫方法進行增刪改查操作
		Employee employee = mapper.getEmpById(1);
		System.out.println(mapper);
		System.out.println(employee);
	} finally {
		openSession.close();
	}

}

那執行原理就按這四步依次debug進行分析......

1、獲取sqlSessionFactory物件

解析檔案的每一個資訊儲存在Configuration中,返回包含Configuration的DefaultSqlSession;
注意:【MappedStatement】:代表一個增刪改查的詳細資訊

其中:

Configuration物件儲存了所有配置檔案的詳細資訊:

mapperdStatements物件:

knownMappers物件:

2、獲取sqlSession物件

返回一個DefaultSQlSession物件,包含Executor和Configuration;
這一步會建立Executor物件;

3、獲取介面的實現類mapper代理物件(MapperProxy)

getMapper,使用MapperProxyFactory建立一個MapperProxy的代理物件
代理物件裡面包含了,DefaultSqlSession(Executor)

4、介面的實現類物件執行資料庫方法進行增刪改查操作

boundSql物件:

快取中儲存的key:方法id+sql+引數xxx:

四、查詢流程總結

(1)、根據配置檔案(全域性,sql對映)初始化出Configuration物件
(2)、建立一個DefaultSqlSession物件,
    他裡面包含Configuration以及
    Executor(根據全域性配置檔案中的defaultExecutorType創建出對應的Executor)
(3)、DefaultSqlSession.getMapper():拿到Mapper介面對應的MapperProxy;
(4)、MapperProxy裡面有(DefaultSqlSession);
(5)、執行增刪改查方法:
        1)、呼叫DefaultSqlSession的增刪改查(Executor);
        2)、會建立一個StatementHandler物件。
            (同時也會創建出ParameterHandler和ResultSetHandler)
        3)、呼叫StatementHandler預編譯引數以及設定引數值;
            使用ParameterHandler來給sql設定引數
        4)、呼叫StatementHandler的增刪改查方法;
        5)、ResultSetHandler封裝結果
注意:


    四大物件每個建立的時候都有一個interceptorChain.pluginAll(parameterHandler);