zoukankan      html  css  js  c++  java
  • mybatis基础流程_真正开始执行查询

    mybatis基础流程_真正开始执行查询

                拿查询来看Mybatis执行的源码流程

               

     a . 比如selectOne方法, 其实底层还是会调用selectList()方法.

     a . 虽然会调用SelectList ,但是会确定结果集是否为1个,不是的话会抛出异常.

     a . 可以看到与前几章不同的是,之前都是 this.configuration.setMapperStatement(), 这个地方终于去get了.

     b . 这里用的是之前封装的mapperStatement的map ,key为sql的Id ,Value为Statemnet对象.

     c . 同时下面开始才有执行器Executor(负责sql语句的生成查询和缓存的处理),开始进行真正的查询.

    a . 从上面的代码可以看到, 这里存在两个实现类. 比较容易理解, 一个CachingExecutor 和 BaseExecutor . CachingExecutor是二级缓存开启的时候 , 相应的BaseExecutor就是当二级缓存关闭的时候会走的流程.

    b . 继续往下看

    a . 动态生成后的sql语句是被封装在BoundSql内的.而BoundSql又是被封装在SqlSource对象内的. 这里根据传入的 object  parameterObject. 已经动态生成sql语句了.(BoundSql负责把占位符换成我们实际的参数)

    b . 接下来看createCacheKey() 这个方法其实很容易理解是要与缓存相关了.

     a . 可以看到CacheKey都有sql语句的id . sql语句,参数等信息. 调用同一个sql语句,参数一样, 生成的CacheKey是一样的.

    a . 这里就是二次缓存判断的地方了 . 如果不等于空, 接下来 ms.isFlushCacheRequired() 和 ms.isUseCache() 这两个判断, 是我们自己配置的<select/>标签内的属性. 是否刷新缓存, 这个sql是否使用缓存.

    b . 如果允许使用缓存 , 直接根据CacheKey 调用getObject()方法,获取到结果集.(其实还是一个Map)

    c . 如果去到的List为null . 将再执行一次query()查询,这次就是成员变量的Executor了. 应该是SimpleExecutor(委派模式,我不行就找个行的来).

    d .SimpleExecutor 执行query()方法,会进入父类baseExecutor的query()方法.

    a .因为一级缓存默认开启, 这里如果能存一级缓存内获取到list.返回,如果为空,则从方法名很容易看出来 要从数据库查询了.

       先看 this.localCache.getObject(key) . 其实这里的localCache也是一个map. 这里就跟二级缓存一样了. 不过也是同样的. 这个对象重写了自己的equals 和 hashCode方法.

       是因为 无论是一级缓存还是二级缓存,都采用的对象作为Key (CacheKey) , 而想要hashmap中key是需要经过hashcode计算,再equals的. 所以这需要重写.否则equals并不为true. (如果不重写的话,对象的hashcode方法好像与地址值有关系)

     a . 这里是不管查询出来没有,先在map内占个坑. 然后就是JDBC的操作了 .....1 注册驱动 2 获取连接 3 创建会话对象 也就是上面提到的statement 或者是可以防止注入攻击的prepareStatement 4 执行sql语句 5 处理结果集 6 关闭连接

    截止到这里,其实select的大体流程就是这样了..存在着一级和二级缓存..增删改都会导致缓存清空.

    人总得做点什么 ,不是么
  • 相关阅读:
    客户端加锁
    三次握手
    ForkJoinTask
    主从Reactor多线程模型
    Happen-before
    Enum
    Java 8
    Netty
    分布式一致性算法
    VisualStudio 2013 快捷键
  • 原文地址:https://www.cnblogs.com/liweibing/p/12739610.html
Copyright © 2011-2022 走看看