Mybatis3源码分析(3)流程走向

分析源码我们还是从编程式demo入手

我们通过建造者模式创建一个工厂类,配置文件的解析就是在这一步完成的,包括 mybatis-config.xml 和 Mapper 适配器文件。

  1. 首先进入build
  2. 进入XMLconfigBuilder–这里就是配置文件创建的地方
  3. 可以看到这里有很多解析文件的类
  4. 解析节点–这里可以看出文件只解析了一次。

    解析文件还是比较简单的,基本上就是读取文件的内容然后做存储设置,我们来看看时序图

DefaultSqlSession–最主要的就是创建了一个执行器

  1. 创建回话时拿到全局配置文件的配置,并且创建了事务工厂和创建执行器。
  2. 对执行器做判断–两次判断的原因是因为怕有人把默认执行器设置为空–这里也判断了是否开启了二级缓存的–这里注意这个额插件调用方法先把他理解为拦截器进行了一次包装
  3. 我在baseExecutor里面还看到了模板模式–把具体的增删改查的方法都交给子类去做了

    先看看继承关系

    看看时序图

getMapper

  1. 为什么要引入mapper对象------为了解决这种硬编码的问题

    一步步走


    注意这个注册器-点进去看


    这里的代码就有点熟悉了吧。jdk的动态代理那么作为代理类一定有个规范,我们进去看

    果然实现了invocationHandler
    说明mapper对象是一个代理对象
  2. 为什么我们只需要mapper接口不需要去实现呢
    目前来看,他的作用就是标识我们去找到对应的statementID找到sql语句他的功能也就完成了。

MapperProxy

  1. 既然是代理对象肯定会走到上图中的invoke方法执行到mapperMethod.exeute中

    为什么会判断defaultMethod方法的原因是jdk1.8接口都是可以有defaultMethod方法的,这里的这个cache是为了提升获取mapper的效率—这里调用了一个computeIfAbsent map的方法构建本地缓存
  2. 判断类型准备执行的语句类型
  3. 走到selectOne
    为什么用list接收:我觉得这是一种比较前瞻的写法吧,下面那个报错应该都很熟悉,以前把查出来 的list用对象接收就是这个错误
  4. 这里可以看到传进来的是一个statementid的位置字符串,具体怎么找到的就在MappedStatement这行代码解决的。
  5. 走到query 的实现方法 --我们进入二级缓存这个实现方法


    这里的这个缓存key 就是判断我们缓存是否命中的。判断statementid和翻页信息和sql是否一样
  6. 继续走query-他会有缓存走缓存没缓存走查询

    这里是判断语句设置的一些参数做操作
  7. 走到queryFromDatabase --这样就到了baseExecutor
  8. 接下来就是基本执行器的操作了
  9. 走到默认的simple执行器

    在这里感觉已经离真相越来越近了…这里已经看到了jdbc 的statement了。
  10. 根据这个newStatementHandler进入–这里就有我们熟悉的东西赋值了。
    newParameterHandler 处理参数
    newResultSetHandler 处理结果集
  11. 四大天王–能被插件拦截的四大天王
    ParameterHandler,ResultSetHandler,StatementHandler,executor
  12. 然后对参数进行预编译–然后执行查询–这里已经调用–然后处理结果集

    已经调用ps.execute了这已经是jdbc的操作了

猜你喜欢

转载自blog.csdn.net/yakax/article/details/104399506