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

摘要:
mybatis基础流程_真正开始执行查询拿查询来看Mybatis执行的源码流程a.比如selectOne方法,其实底层还是会调用selectList()方法.a.虽然会调用SelectList,但是会确定结果集是否为1个,不是的话会抛出异常.a.可以看到与前几章不同的是,之前都是this.configuration.setMapperStatement(),这个地方终于去get了.b.这里用的是之
mybatis基础流程_真正开始执行查询

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

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

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

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

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

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

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

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

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

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

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

b . 继续往下看

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

免责声明:文章转载自《mybatis基础流程_真正开始执行查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mpVue小程序全栈开发Selenium WebDriver问题Internet Explorer保护模式设置问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

16、mybatis学习——mybatis的动态sql之&amp;lt;if&amp;gt;、&amp;lt;where&amp;gt;和&amp;lt;trim&amp;gt;

Student.java:  StudentMapper接口定义方法:  StudentMapper配置文件进行配置 <select id="getStuByIf" resultType="student"> select * from student where <!-- test:判断...

Spring+SpringMVC+MyBatis深入学习及搭建(十)——MyBatis逆向工程

转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6973266.html  前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合 使用官方网站的mapper自动生成工具mybatis-generator-core-1.3.2来生成po类和mapper映射文...

mybatis的关联查询以及count

1.多表查询,1对1的时候,最简单的做法 <resultMap id="postInfo" type="postInfoEntity"> <id property="postId" column="post_id"/> <result property="userName" column="us...

使用Mybatis出现的问题+配置优化+ResultMap

一、可能出现的问题 1、Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 原因:jdbc.properties 文件 url=jdbc:mysql://localhost...

Java—SSH(MVC)

Java—SSH(MVC) 1. 谈谈你mvc的理解 MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序 的输入、处理和输出分开。 MVC中的模型、视图、控制器它们分别担负着不同的任务。 视图: 视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何...

JAVA MyBatis配置文件用properties引入外部配置文件

方式一:通过properties 元素的子元素来传递数据 例如: 1 <properties> 2 <property name="driver" value="com.mysql.jdbc.Driver" /> <!-- 驱动类型 --> 3 <property nam...