MyBatis源码分析
chi_666
这个作者很懒,什么都没留下…
展开
-
XPathParser类
XPathParser类是mybatis对 javax.xml.xpath.XPath的包装类。接下来我们来看下XPathParser类的结构。原创 2024-07-30 22:07:49 · 222 阅读 · 0 评论 -
MyBatis二级缓存的命中条件
如上图两个会话在修改同一数据,当会话二修改后,假如它实时填充到二级缓存,而会话一查询时缓存中存在即返回数据,此时会话二回滚会话一读到的数据就是脏数据。所以为了保证数据一致性,二级缓存必须是会话提交之后才会真正填充,包括对缓存的清空,也必须是会话正常提交之后才生效。二级缓存的命中场景与一级缓存类似,不同在于二级缓存可以跨会话使用,既然是跨会话使用必然也会是事务级缓存。因此二级缓存的更新,必须是在会话提交之后。为什么要提交之后才能命中?原创 2024-07-16 14:35:56 · 217 阅读 · 1 评论 -
Executor执行器可以使用JDBC三个中任意一个的statement吗?
Executor可以使用JDBC三个中任意一个的statement;那Executor执行器是如何确定使用JDBC的哪个预处理器Statement呢?Executor执行器是通过MappedStatement类的statementType属性值判断使用JDBC的哪个预处理器Statement的。mybatis中具体设置statementType属性值的位置1)STATEMENT:直接操作sql,不进行预编译,获取数据:$—Statement(使用场景,动态传入表名,列名)2)PREPARED原创 2024-07-16 14:35:01 · 139 阅读 · 1 评论 -
MetaObject小试牛刀
将实例User类中属性类型为String且值为空值的重新赋值默认值“-”原创 2024-07-03 17:38:19 · 87 阅读 · 0 评论 -
Mybatis的一些问答记录
不过遗憾的是,HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。因此,根据链表中元素的顺序可以将LinkedHashMap分为:保持插入顺序的LinkedHashMap 和保持访问顺序的LinkedHashMap,其中LinkedHashMap的默认实现是按插入顺序排序的。BaseExecutor基础抽象执行器是三个具体执行器共性功能(一级缓存维护、事务管理)的抽象集合(竖向扩展),主要是MyBatis关于一级缓存相关的逻辑。为什么要进行序列化?原创 2024-01-13 16:15:27 · 958 阅读 · 0 评论 -
Mybatis异常拆包工具类ExceptionUtil——非常容易也值得我们借鉴
两个类都位于java.lang.reflect包下显示是用来处理反射相关的异常的。可在代理类中难免会在执行某些方法时抛出一些共同接口或者父类方法中没有声明的必检异常,那么我们就可以将其统一包装为 UndeclaredThrowableException进行管理,针对于这两种场景我们可以在处理反射的时候统一包装为InvocationTargetException进行管理,同样的我们可以直接拿来在项目中使用,也可以加以改造针对自己公司框架不同业务异常类型提示信息处理时用。那么这里拆包的时候为什么会用到。原创 2023-11-28 00:07:20 · 198 阅读 · 0 评论 -
MetaObject-BeanWrapper-MetaClass-Reflector的关系
MetaObject、BeanWrapper、MetaClass、Reflector之间是通过装饰器模式逐层进行装饰的。其中MetaObject、BeanWrapper是操作对象;MetaClass、Reflector是操作Class。BaseWrapper是对BeanWrapper、MapWrapper公共方法的提取及类图的优化,内部是对MetaObject的装饰。ObjectWrapper类结构图。原创 2023-11-26 22:51:42 · 296 阅读 · 0 评论 -
Mybatis反射核心类Reflector
Reflector类负责对一个类进行反射解析,并将解析后的结果在属性中存储起来。一个类反射解析后都有哪些属性呢?我们可以通过Reflector类定义的属性来查看。该类里面还有一个值的注意的小工具类可以直接拿来使用,生成方法签名。原创 2023-11-26 18:00:23 · 128 阅读 · 0 评论 -
Mybatis反射工厂类DefaultReflectorFactory
DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现,其主要是实现了对反射对象Reflector的创建和缓存。其缓存功能主要是通过ConcurrentMap实现的,ConcurrentHashMap是一个线程安全,并且是一个高效的HashMap。原创 2023-11-26 17:15:39 · 326 阅读 · 0 评论 -
PropertyTokenizer属性解析器实现,So Easy
实现原理:每次解析都会产生一个新的解析对象直至无法解析,通过构造方法充当解析方法以及实现Iterator迭代器接口。1)定义拆分后的属性字段(其中indexedName = name[ index ])3)怎么判断是否解析终结?实现Iterator迭代器接口。4)对于不需的功能,异常抛出remove()方法。2)定义解析方法,构造方法实现。原创 2023-11-25 11:19:17 · 50 阅读 · 0 评论 -
Mybatis中的PropertyNamer
PropertyNamer提供属性名称相关的操作,该类主要是校验对象属性、方法的命名是否遵循JavaBean的命名规范。原创 2023-11-25 10:46:46 · 47 阅读 · 0 评论 -
Mybatis中的PropertyCopier属性复制器
PropertyCopier属性复制器位于MyBatis中reflection包下子包property属性子包,其作用就是将一个对象的属性复制到另一个对象中。getDeclaredFields方法无法获取继承父类的字段属性。禁止改动的类定义为final类型,私有化构造方法提供静态方法。原创 2023-11-25 10:34:33 · 65 阅读 · 0 评论 -
Mybatis中reflection包下的执行器子包
GetFieldInvoker、SetFieldInvoker、MethodInvoker都是通过有参构造将传入的对象包装成相应的操作对象。reflection包下的invoker子包是执行器子包,该子包中的类是基于反射实现对对象方法的调用和属性的读写。GetFieldInvoker:负责对象属性的读操作;SetFieldInvoker:负责对象属性的写操作;MethodInvoker:负责对象方法的调用。注意这里其实使用到了。原创 2023-11-19 22:21:05 · 32 阅读 · 0 评论 -
Mybatis-reflection包下的对象工厂子包
DefaultObjectFactory中的resolveInterface方法主要是解决当传入的目标类型是一个常见的接口(List、Map、Set、Collection等)时,给出一个符合该接口的默认实现类。DefaultObjectFactory的create方法用来生产对象,其最终都是通过instantiateClass方法基于反射来生产一个对象。reflection包下的factory包是一个对象工厂子包,该包中的类用来基于反射生产出各种对象。原创 2023-11-19 17:18:47 · 37 阅读 · 0 评论 -
Mybatis异常类体系
一个类实现了Serializable接口,但是在序列化后,对类的结构进行了修改,那么反序列化时就会出现版本不一致的问题。而如果不实现Serializable接口,而是手动指定serialVersionUID的值,那么即使类的结构发生了变化,只要serialVersionUID的值不变,就可以保证序列化和反序列化的正确性。4、值得注意的一点是mybatis作为一个开源持久层框架势必会与其他框架进行整合,考虑到这一点mybatis将作为外围体系类的异常类均手动指定了serialVersionUID属性值。原创 2023-11-19 10:59:28 · 85 阅读 · 0 评论 -
Mybatis源码泛型解析器TypeParameterResolver
【代码】Mybatis源码泛型解析器TypeParameterResolver。原创 2023-11-18 18:42:47 · 79 阅读 · 0 评论 -
MyBatis二级缓存出现的原因
既然有了一级缓存,那么为什么要提供二级缓存呢?1、在一级缓存中,不同session进行相同SQL查询的时候,是查询两次数据库的。显然这是一种浪费,既然SQL查询相同,就没有必要再次查询数据库了,直接利用缓存数据即可,这种思想就是MyBatis二级缓存的初衷。2、Spring和MyBatis整合时,每次查询之后都要进行关闭sqlsession,关闭之后数据被清空。所以MyBatis和Spring整合之后,一级缓存是没有意义的。如果开启二级缓存,关闭sqlsession后,会把该sqlsession一级缓存原创 2021-04-26 22:24:00 · 579 阅读 · 0 评论 -
MyBati二级缓存LruCache组件为什么会采用LinkHashMap实现呢?
HashMap 是 Java Collection Framework 的重要成员,也是Map族(如下图所示)中我们最为常用的一种。不过遗憾的是,HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。HashMap的这一缺点往往会造成诸多不便,因为在有些场景中,我们确需要用到一个可以保持插入顺序的Map。庆幸的是,JDK为我们解决了这个问题,它为HashMap提供了一个子类 —— LinkedHashMap。虽然LinkedHashMap增加了时间和空原创 2021-04-24 23:22:04 · 178 阅读 · 0 评论 -
JDBC执行过程回顾与MyBatis执行过程
1、JDBC执行过程回顾1)获取Connection连接2)预编译SQL3)执行SQL4)读取结果1.2、预编译的三种执行器三种执行器都支持批处理1)Mysql不支持(setFetchSize)设置一次性读取多少行。2)addBatch批量操作,将多个SQL合并在一起,最后调executeBatch一起发送至数据库执行。3)setFetchSize设置从数据库每次读取的数量单位。该举措是为了防止一次性从数据库加载数据过多,导致内存溢出。1.3、关于防止SQL注入问题1)简单执行原创 2020-08-22 17:56:20 · 150 阅读 · 0 评论 -
MyBatis的二级缓存讲解
1、二级缓存的定义二级缓存也称作是应用级缓存,与一级缓存不同的是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改比较少的数据。2、二级缓存扩展性需求二级缓存的生命周期是整个应用,所以必须限制二级缓存的容量,在这里mybatis使用的是溢出淘汰机制。而一级缓存是会话级的生命周期非常短暂是没有必要实现这些功能的。相比较之下,二级缓存机制更加完善。3、二级缓存的结构二级缓存在结构设计上采用装饰器+责任链模式1)二级缓存是如何组装这些装饰器的呢?这里我们先介原创 2020-06-30 23:45:14 · 1781 阅读 · 0 评论