阅读mybatis的源码的思路

简介: 阅读mybatis的源码的思路

■ 阅读源码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会话工厂对象的时候还创建了一个全局配置对象。咱还顺带看了一下全局配置的创建过程啦
    7.png

(2)创建SqlSessoin会话对象

  • 查看源码得知,表名上是创建了一个SqlSessoin会话对象, 实际上在创建SqlSessoin会话对象的时候还创建了一个全执行器对象。咱还顺带看了一下执行器的创建过程啦
  • 执行器对象ExecutorCachingExcutor(Simple)带有缓存的执行器】,是mybatis的调度中心,负责sql的生成和查询缓存维护。在创建SqlSessoin会话对象创建,会执行pluginAll方法
    8.png

(3)创建mapper对象

  • 查看源码得知,创建mapper对象, 实际上通过jdk的代理机制创建了一个mapper的代理对象。


9.png10.png



(4) 执行sql操作:mapper.get(1L);

  • 先判断传入的方法类型,不是Object类型,就使用映射方法进行执行

11.png


执行的时候会根据元素类型进行选择


image.png


咱执行mapper.get(1L)实际上是会话对象调用selectOne方法


image.png


  • selectOne 返回一个集合list,观察selectList
    14.png
  • 映射语句mapperStatement封装了元素的信息
    15.png
  • 在selectList方法看到执行器调用查询方法
    16.png
  • 发现执行查询的过程,先经过CachingExcutor(带有二级缓存的执行器),先从二级缓存中寻找是否有数据
    17.png
  • 发现执行查询的过程,经过BaseExcutor(底层的执行器),先从一级缓存localCache中寻找是否有数据,若是没有在从数据库中查询
    18.png
  • 从数据库查询,是简单的执行器,调用doQuery方法
    19.png
  • 构建语句处理器对象
    20.png
  • 构建RoutingStatementHandler语句处理器对象
    21.png
  • 构建PreparedStatementHandler预编译语句处理器对象
    22.png
  • 构建ParameterHandler参数处理器对象、构建ParameterHandler参数处理器对象
    26.png


  • ★ Statement(PreparedStatement 预编译语句对象)创建对象之前,先创建参数处理器和结果处理器
    □ ParamterHandler 参数处理器,先把用户传入的参数转成JDBC需要的参数值,在创建对象之前,会执行pluginAll方法
    □ ResultSetHandler 结果集处理器,把结果集中的数据封装到list集合,在创建对象之前,会执行pluginAll方法

  • 实例化一个语句对象
    25.png

。。。


✿ 总结阅读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方法


目录
相关文章
|
9天前
|
SQL XML Java
mybatis-源码深入分析(一)
mybatis-源码深入分析(一)
|
2月前
|
XML Java 数据库连接
mybatis源码研究、搭建mybatis源码运行的环境
这篇文章详细介绍了如何搭建MyBatis源码运行的环境,包括创建Maven项目、导入源码、添加代码、Debug运行研究源码,并提供了解决常见问题的方法和链接到搭建好的环境。
mybatis源码研究、搭建mybatis源码运行的环境
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
供应链 前端开发 Java
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
该博客文章介绍了一个使用Mybatis、Layui、MVC和JSP技术栈开发的服装库存管理系统,包括注册登录、权限管理、用户和货号管理、库存管理等功能,并提供了源码下载链接。
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
|
2月前
|
缓存 Java 数据库连接
我要手撕mybatis源码
该文章深入分析了MyBatis框架的初始化和数据读写阶段的源码,详细阐述了MyBatis如何通过配置文件解析、建立数据库连接、映射接口绑定、动态代理、查询缓存和结果集处理等步骤实现ORM功能,以及与传统JDBC编程相比的优势。
我要手撕mybatis源码
|
5月前
|
SQL Java 数据库连接
深入源码:解密MyBatis数据源设计的精妙机制
深入源码:解密MyBatis数据源设计的精妙机制
85 1
深入源码:解密MyBatis数据源设计的精妙机制
|
5月前
|
SQL 缓存 Java
|
5月前
|
XML Java 数据库连接
探秘MyBatis:手写Mapper代理的源码解析与实现
探秘MyBatis:手写Mapper代理的源码解析与实现
48 1
|
5月前
|
SQL Java 数据库连接
一文细说Mybatis八大核心源码
以上 是V哥给大家整理的8大核心组件的全部内容,为什么说选择 Java 就是选择未来,真正爱 Java 的人,一定喜欢深入研究,学习源码只是第一步,要有一杆子捅到操作系统才够刺激。
|
5月前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
下一篇
无影云桌面