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