![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mybatis源码
文章平均质量分 70
隐0士
这个作者很懒,什么都没留下…
展开
-
Mybatis所用到设计模式-源码分析
虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。Mybatis至少遇到了以下的设计模式的使用:构造器模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、-XMLStatementBuilder、CacheBuilder;工厂模式,例如SqlSessionFactory、ObjectFactory转载 2021-08-28 18:46:42 · 122 阅读 · 0 评论 -
mybatis自定义插件
插件扩展概念mybatis为了自身支持扩展,为自身的四个关键流程提供了基于动态代理的扩展接口实现,他们分别是:Executor:执行器StatementHandler:JDBC处理器ParameterHandler:参数处理器ResultSetHandler:结果集处理器这四个执行器的在mybatis体系中产生的作用如下:自定义插件实现将需要实现自定义逻辑的类实现 Interceptor 接口,并指定想要拦截的方法签名即可实现拦截。@Intercepts({@Signature(原创 2021-08-28 16:50:53 · 215 阅读 · 0 评论 -
mybatis的联合查询与嵌套映射
联合查询与嵌套映射场景联合查询时指查询语句有left join 或者全表连接等多个表关联的查询,这种查询由于涉及到多个表,且一般都会查出多个表的字段,而相应的resultMap会需要映射成多个对象,如下所示: <resultMap id="blogComplexMap" type="com.entity.Blog" autoMapping="true"> <id column="id" property="id"></id> <原创 2021-08-22 12:44:27 · 960 阅读 · 1 评论 -
mybatis 懒加载
懒加载原理懒加载是为改善,解析对象属性时大量的嵌套子查询的并发问题。设置懒加载后,只有在使用指定属性时才会加载,从而分散SQL请求。通过对Bean的动态代理,重写所有属性的getXxx方法。在获取属性前先判断属性是否被加载,如果否则加载。调用流程图如下:其中第一步的Bean代理过程发生在结果集解析 交创建对象之后(DefaultResultSetHandler.createResultObject),如果对应的属性设置了懒加载,则会通过ProxyFactory 创建代理对象,该对象继承自原对象,然原创 2021-08-21 18:38:20 · 325 阅读 · 1 评论 -
mybatis 结果集中嵌套查询中的循环依赖问题分析
循环依赖实例mybatis的循环依赖,即是mapper.xml里面的A查询的resultMap包含了B属性(B属性是通过子查询得到的),而B属性中又包含了A(B查询的resultMap中又包含了A的查询),就会造成A-B-A的情况。实际的代码样例如下:mapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN原创 2021-08-21 11:04:20 · 1364 阅读 · 0 评论 -
spring mybatis集成为什么一级缓存会失效
我们举例子看一下,下面是我的调用实例: ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); BlogMapper blogMapper=context.getBean(BlogMapper.class); Blog blog1=blogMapper.selectBlog(1); Blog blog原创 2021-08-15 19:21:57 · 199 阅读 · 0 评论 -
一级缓存源码分析
一级缓存触发流程:我们注意到这里一级缓存使用的是map结构来存储缓存,为何不用ConcurrentHashMap呢,因为sqlSession本身不是线程安全的,它不线程安全是由于JDBC的Connection对象本身也不是线程安全的,所以既然都不安全了,所以这里也没必要做线程安全的map结构。我们来看看缓存的key里面有什么:我们可以看到,有statementid,分页条件,查询语句内容,查询参数,环境(environment的id),这个也对应了缓存的命中场景的内容。一级缓存的判断主要发生在B原创 2021-08-15 19:21:19 · 146 阅读 · 0 评论 -
一级缓存命中场景
我们都知道,mybatis有一级缓存(自动)和二级缓存(需要手动配置),一级缓存在BaseExecutor中默认实现,那在哪些场景中我们的一级缓存才会命中呢,大致分为如下几点:sql参数是相同的(参数不一样不走缓存)必须是相同的statementId,也就是sql语句的id要一样(语句不一样不走缓存,本来也不是同个东西)sqlSession必须一样,也就是要在相同的会话内。(如果新产生了个会话则缓存失效)rowBounds 分页返回的范围必须相同(分页条件不一致导致结果集不一致所以不走缓存)没有原创 2021-08-15 10:50:03 · 162 阅读 · 0 评论 -
mybatis执行器及流程说明
mybatis执行器Executor接口有六个实现,分别为:类结构图:下面对以上类图中的类进行说明:**执行器接口Executor:**提供改查(常说的“增、删、改、查”可以合并为“改、查”),提交,回滚,关闭等操作。**抽象父类BaseExecutor:**主要提供获取连接,一级缓存等公用功能。query方法提供缓存的使用。这也是经常说的mybatis基于sqlSeesion的一级缓存**简单执行器SimpleExecutor:**每执行一次update或select,就开启一个Statem原创 2021-08-15 09:25:01 · 223 阅读 · 0 评论