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(); } } }
All that work will definitely pay off