欢迎大家来一乐乐的博客园
■ 阅读源码mybatis操作数据库的过程:
/* 测试查询 */
@Test
public void testGet() throws IOException {
// 1、从classpath路径加载mybatis全局配置文件mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2、创建SqlSessoinFactory会话工厂对象,好比连接池DataSource
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3、创建SqlSession会话对象,好比连接对象Connection
SqlSession session = factory.openSession();
// 4、获取mapper对象
UserMapper mapper = session.getMapper(UserMapper.class);
//执行sql操作
User user = mapper.get(1L);
System.out.println(user);
// 5、关闭资源
session.close();
}
(1)创建SqlSessoinFactory会话工厂对象
- 查看源码得知,表名上是创建了一个SqlSessoinFactory会话工厂对象, 实际上在创建SqlSessoinFactory会话工厂对象的时候还创建了一个全局配置对象。【咱还顺带看了一下全局配置的创建过程啦】
(2)创建SqlSessoin会话对象
-
查看源码得知,表名上是创建了一个SqlSessoin会话对象, 实际上在创建SqlSessoin会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦】
-
执行器对象Executor【
CachingExcutor(Simple)带有缓存的执行器
】,是mybatis的调度中心,负责sql的生成和查询缓存维护。在创建SqlSessoin会话对象创建,会执行pluginAll方法
(3)创建mapper对象
- 查看源码得知,创建mapper对象, 实际上通过jdk的代理机制创建了一个mapper的代理对象。
(4) 执行sql操作:mapper.get(1L);
-
先判断传入的方法类型,不是Object类型,就使用映射方法进行执行
-
执行的时候会根据元素类型进行选择
-
咱执行mapper.get(1L)实际上是会话对象调用selectOne方法
-
selectOne 返回一个集合list,观察selectList
-
映射语句mapperStatement封装了元素的信息
-
在selectList方法看到执行器调用查询方法
-
发现执行查询的过程,先经过CachingExcutor(带有二级缓存的执行器),先从二级缓存中寻找是否有数据
-
发现执行查询的过程,经过BaseExcutor(底层的执行器),先从一级缓存localCache中寻找是否有数据,若是没有在从数据库中查询
-
从数据库查询,是简单的执行器,调用doQuery方法
-
构建语句处理器对象
-
构建RoutingStatementHandler语句处理器对象
-
构建PreparedStatementHandler预编译语句处理器对象
-
构建ParameterHandler参数处理器对象、构建ParameterHandler参数处理器对象
- ★ Statement(PreparedStatement 预编译语句对象)创建对象之前,先创建参数处理器和结果处理器
□ ParamterHandler 参数处理器,先把用户传入的参数转成JDBC需要的参数值,在创建对象之前,会执行pluginAll方法
□ ResultSetHandler 结果集处理器,把结果集中的数据封装到list集合,在创建对象之前,会执行pluginAll方法
- 实例化一个语句对象
。。。
✿ 总结阅读mybatis执行sql的源码中的核心对象:
-
InterceptorChaiin 拦截器链,多个拦截器合成
-
Configuration 全局配置对象,封装了所有的配置信息
-
Executor 执行器,myBatis的调度中心,负责sql生成和查询缓存维护,在创建sqlSession对象之前。创建ok之后,会执行pluginAll方法
-
- BaseExecutor 底层的执行器,先从一级缓存中查询,若没有,则到数据库中查询
-
- CachingExcutor(Simple) 带有二级缓存的执行器,先去二级缓存中寻找是否有数据
-
MappedStatement 映射语句对象,封装了一个元素节点(insert|delete|update|select)的信息
-
StatementHandler 语句处理器,封装了JDBC的DML/DQL操作,参数设置,在创建对象时,执行pluginAll方法
-
- RoutingStatement
-
TypeHandler 类型转化器,把java类型和JDBC类型做相互转化操作,参数处理器、结果集处理器都会用到它。
■ 在创建StatementHandler 创建对象之前,先创建参数处理器和结果集处理器
□ ParameterHandler 参数处理器,把用户传入的参数转化为JDBC需要的参数值,在创建对象时,执行 pluginAll方法
□ ResultSetrHandler 结果集处理器,在结果集中的数据封装到List集合,在创建对象时,执行 pluginAll方法
● 转载请注明出处