✿ 读mybatis的源码的思路

■ 1、 阅读源码的过程,应该阅读哪一个,哪一个是阅读重点呢?

  • 阅读源码构建会话工厂对象的源码,咱了解到:创建了一个SqlSessoinFactory会话工厂对象是通过默认的SqlSessoinFactory创建的,在创建的时候需要传入一个配置对象【即创建会话工厂对象的时候还创建了一个配置对象】,至此,研究一下配置对象的创建过程。
  • 阅读源码构建会话工厂对象的源码,咱了解到:创建一个sqlSession会话对象是通过默认的sqlSession,在创建的时候需要传入三个参数,重点是观察哪个呢?

□ configuration 配置对象(在阅读会话工厂对象构建的源码的时候咱就了解过它了,不是重点)
□ executor 执行器(重点,因为在return 会话对象之前构建了executor执行器
□ autoCommit (是否提交,布尔值,不是重点)

  • 结合理解逻辑,还有return的提示作用,知道阅读重点是list的过程

■ 阅读源码mybatis操作数据库的过程:

 /* 测试查询 */@Testpublic void testGet() throws IOException {// 1、从classpath路径加载mybatis全局配置文件mybatis-config.xmlInputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 2、创建SqlSessoinFactory会话工厂对象,好比连接池DataSourceSqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(in);// 3、创建SqlSession会话对象,好比连接对象ConnectionSqlSession 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会话对象的时候还创建了一个全执行器对象。【咱还顺带看了一下执行器的创建过程啦

  • 执行器对象ExecutorCachingExcutor(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方法

阅读mybatis源码相关推荐

  1. 手把手带你阅读Mybatis源码(三)缓存篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...

  2. 手把手带你阅读Mybatis源码(一)构造篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 今天会给大家分享我们常用的持久层框架--MyBatis的工作原理和源码解析,后续会围 ...

  3. 手把手带你阅读Mybatis源码(二)执行篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 上一篇文章提到了MyBatis是如何构建配置类的,也说了MyBatis在运行过程中主 ...

  4. 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

    我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins.objectFa ...

  5. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  6. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

  7. mybatis源码阅读(八) ---Interceptor了解一下

    转载自  mybatis源码阅读(八) ---Interceptor了解一下 1 Intercetor MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis允许 ...

  8. mybatis源码阅读(七) ---ResultSetHandler了解一下

    转载自  mybatis源码阅读(七) ---ResultSetHandler了解一下 1.MetaObject MetaObject用于反射创建对象.反射从对象中获取属性值.反射给对象设置属性值,参 ...

  9. mybatis源码阅读(六) ---StatementHandler了解一下

    转载自  mybatis源码阅读(六) ---StatementHandler了解一下 StatementHandler类结构图与接口设计 BaseStatementHandler:一个抽象类,只是实 ...

  10. mybatis源码阅读(五) ---执行器Executor

    转载自  mybatis源码阅读(五) ---执行器Executor 1. Executor接口设计与类结构图 public interface Executor {ResultHandler NO_ ...

最新文章

  1. 聚簇索引与非聚簇索引学习总结
  2. python决策树生成规则_如何从scikit-learn决策树中提取决策规则?
  3. spark写入oracle 优化,spark读写数据库大表分区性能优化
  4. python调用java方法_python调用Java方法传入HashMap ArrayList
  5. 接口测试——Jmeter常见问题解决方法
  6. springBoot笔记(一) @SpringBootApplication的神奇魔力
  7. Spring boot with Hive
  8. 18._6索引器在接口中的使用
  9. mysql如何进行宿舍分配_手把手教你做一个Jsp Servlet Mysql实现的学生宿舍管理系统...
  10. 四款优秀的源代码扫描工具简介
  11. rose双机热备mysql,实战:ROSE HA双机热备系统安装指南
  12. 怎么把kux格式转换成mp4?优酷kux格式转换成mp4的技巧
  13. [哈佛幸福课13 听后感]
  14. 有源蜂鸣器和无源蜂鸣器的区别
  15. 阿里云服务器租用费用清单表(CPU内存带宽磁盘)
  16. 在线教育,网校平台,线上平台,线上教育的一些个人理解!
  17. 【Delphi】中使用消息Messages(八)Android 系统消息感知
  18. COM08 -如何基于Davinci工具配置CAN通信协议栈实战课程【配置方法总述】
  19. [VM]解决虚拟机声音滋滋声
  20. luogu 4084

热门文章

  1. jeb配置java环境_jeb 提示 java help space
  2. msys2(msys2-i686-20180531)32位下安装GMT4.5.6
  3. 希尔伯特变换及其性质
  4. 计算机命令秒退,win10打开命令提示符闪退怎么办-解决win10命令提示符闪退的方法 - 河东软件园...
  5. Docker安装Redis并介绍漂亮的可视化客户端进行操作
  6. gisdk学习心得(一)-简介
  7. js增量更新算法研究
  8. 软件测试中的二八定律到底是什么?
  9. cad查看_天正电气CAD教程之标注实例讲解
  10. XShell免费版的安装配置教程以及使用教程(超级详细、保姆级)