mybatis源码
文章平均质量分 70
隐0士
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Mybatis所用到设计模式-源码分析
虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的使用: 构造器模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、- XMLStatementBuilder、CacheBuilder; 工厂模式,例如SqlSessionFactory、ObjectFactory转载 2021-08-28 18:46:42 · 189 阅读 · 0 评论 -
mybatis自定义插件
插件扩展概念 mybatis为了自身支持扩展,为自身的四个关键流程提供了基于动态代理的扩展接口实现,他们分别是: Executor:执行器 StatementHandler:JDBC处理器 ParameterHandler:参数处理器 ResultSetHandler:结果集处理器 这四个执行器的在mybatis体系中产生的作用如下: 自定义插件实现 将需要实现自定义逻辑的类实现 Interceptor 接口,并指定想要拦截的方法签名即可实现拦截。 @Intercepts({@Signature(原创 2021-08-28 16:50:53 · 309 阅读 · 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 · 1283 阅读 · 1 评论 -
mybatis 懒加载
懒加载原理 懒加载是为改善,解析对象属性时大量的嵌套子查询的并发问题。设置懒加载后,只有在使用指定属性时才会加载,从而分散SQL请求。 通过对Bean的动态代理,重写所有属性的getXxx方法。在获取属性前先判断属性是否被加载,如果否则加载。 调用流程图如下: 其中第一步的Bean代理过程发生在结果集解析 交创建对象之后(DefaultResultSetHandler.createResultObject),如果对应的属性设置了懒加载,则会通过ProxyFactory 创建代理对象,该对象继承自原对象,然原创 2021-08-21 18:38:20 · 431 阅读 · 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 · 1687 阅读 · 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 · 285 阅读 · 0 评论 -
一级缓存源码分析
一级缓存触发流程: 我们注意到这里一级缓存使用的是map结构来存储缓存,为何不用ConcurrentHashMap呢,因为sqlSession本身不是线程安全的,它不线程安全是由于JDBC的Connection对象本身也不是线程安全的,所以既然都不安全了,所以这里也没必要做线程安全的map结构。 我们来看看缓存的key里面有什么: 我们可以看到,有statementid,分页条件,查询语句内容,查询参数,环境(environment的id),这个也对应了缓存的命中场景的内容。 一级缓存的判断主要发生在B原创 2021-08-15 19:21:19 · 238 阅读 · 0 评论 -
一级缓存命中场景
我们都知道,mybatis有一级缓存(自动)和二级缓存(需要手动配置),一级缓存在BaseExecutor中默认实现,那在哪些场景中我们的一级缓存才会命中呢,大致分为如下几点: sql参数是相同的(参数不一样不走缓存) 必须是相同的statementId,也就是sql语句的id要一样(语句不一样不走缓存,本来也不是同个东西) sqlSession必须一样,也就是要在相同的会话内。(如果新产生了个会话则缓存失效) rowBounds 分页返回的范围必须相同(分页条件不一致导致结果集不一致所以不走缓存) 没有原创 2021-08-15 10:50:03 · 297 阅读 · 0 评论 -
mybatis执行器及流程说明
mybatis执行器Executor接口有六个实现,分别为: 类结构图: 下面对以上类图中的类进行说明: **执行器接口Executor:**提供改查(常说的“增、删、改、查”可以合并为“改、查”),提交,回滚,关闭等操作。 **抽象父类BaseExecutor:**主要提供获取连接,一级缓存等公用功能。query方法提供缓存的使用。这也是经常说的mybatis基于sqlSeesion的一级缓存 **简单执行器SimpleExecutor:**每执行一次update或select,就开启一个Statem原创 2021-08-15 09:25:01 · 344 阅读 · 0 评论
分享