1. 程式人生 > 實用技巧 >Mybatis執行原理

Mybatis執行原理

MyBatisTest.java

package com.aff.mybatis.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import com.aff.mybatis.bean.Employee; import com.aff.mybatis.dao.EmployeeMapper; public class MyBatisTest { //抽出 getSqlSessionFactory 方法 public SqlSessionFactory getSqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream
= Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); return sqlSessionFactory; } /** * 外掛開發,mybatis 允許使用外掛攔截四大物件的某一個方法 * Executor 執行器 (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) 執行增刪改查的但其中原理還是需要下面三個處理器來操作的 * ParameterHandler 引數處理器 (getParameterObject, setParameters) * ReultSetHandler 結果集處理器 (handleResultSets, handleOutputParameters) * StatementHandler sql語句的處理器 (prepare, parameterize, batch, update, query)
*/ /** * 1.獲取sqlSessionFactory 物件 * 解析全域性配置檔案和mapper.xml檔案的每一個資訊儲存在Configuration中,然後返回包含Configuration 的DefultSqlSession * 注意:MappedStatement 代表一個增刪改查標籤的詳細資訊(各個屬性值,sql語句等全部資訊都在) * * 2.獲取sqlSession 物件 * 返回一個DefultSqlSession物件包含Executor和Configuration * 這一步會建立Executor物件 ,如果有二級快取配置開啟的話,會有一個CachingExecutor包裝Executor, * 再接著有攔截器的話,會有一個攔截器鏈(interceptorChain)來包裝Executor ,interceptorChain.pluginAll(executor) * * 3.獲取介面的代理物件(MapperProxy) * getMapper,使用MapperProxyFactory建立一個MapperProxy的代理物件 * 代理物件裡面包含了,DefultSqlSession ,所以裡面也就包含了Executor * * 4.執行代理物件的增刪改查方法 * * * 總結: * 1.根據配置檔案(全域性,sql對映) 初始化出Configuration 物件 * 2.建立一個DefultSqlSession 物件 * 他裡面包含Configuration 以及Executor(根絕全域性配置檔案的defultExecutorType 創建出的對應得Executor) * 3. DefultSqlSession.getMapper() :拿到Mapper介面對應的MapperProxy * 4.MapperProxy 裡面有DefaultSqlSession * 5.執行增刪改查方法: * ①. 呼叫DefaultSqlSession 的增刪改查(Executor) * ②. 會建立一個StatementHandler 物件 * (同時也會建立ParameterHandler和ResultSetHandler) * ③. 呼叫StatementHandler 預編譯引數和設定引數值 * 使用ParameterHandler 來給sql設定引數 * ④. 呼叫 StatementHandler 的增刪改查方法 * ⑤. ResultSetHandler 封裝結果 * * 注意:四大物件每個建立的時候都有一個interceptorChain.pluginAll(Executor/ParameterHandler/ReultSetHandler/StatementHandler) * @throws IOException */ //解析mybatis執行原理 @Test public void test() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { //獲取介面的實現類物件 //會為介面自動的建立一個代理物件, 代理物件去執行增刪改查方法 EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); Employee employee = mapper.getEmpById(1); System.out.println(employee); } finally{ openSession.close(); } } }