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的大体流程就是这样了..存在着一级和二级缓存..增删改都会导致缓存清空.

    人总得做点什么 ,不是么
  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/liweibing/p/12739610.html
Copyright © 2011-2022 走看看