
mybatis专题
文章平均质量分 89
码炫课堂-码哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
【Mybatis源码分析】13-记一次PageHelper reasonable参数使用不当造成的死循环
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!上一篇Mybatis源码分析刚讲过PageHelper分页机制,但是没有分析reasonable参数,碰到这次自己遇上个坑总结一下。原创 2024-05-11 14:53:02 · 927 阅读 · 0 评论 -
【Mybatis源码分析】12-插件PageHelper机制
形式的sql语句,因为AbstractHelperDialect内的countSqlParser提供了这样的能力(有兴趣的自己看下具体实现,这里不再展开)。1.PageHelper的getLocalPage()方法是调用ThreadLocal的get()方法,如果返回一个Page对象,说明我们在调用查询接口之前使用了PageHelper的startPage等可以调用 ThreadLocal的set()方法。这句是分页的核心方法,用于加入分页语句,对于mysql就是limit xx,yy。原创 2024-05-11 14:50:38 · 1141 阅读 · 0 评论 -
【Mybatis源码分析】11-插件机制
关键点就在于Mybatis为我们提供的Plugin类,其中调用静态wrap方法返回一个动态代理对象,这个动态代理对象使用的是JDK动态代理来实现,只能对接口级别的方法进行拦截,并且是@Intercepts注解指定的方法和类型。其中插件可拦截的四个类:Executor,ParameterHandler,ResultSetHandler,StatementHandler的对象是通过Configuration对象的newXXX方法创建的,并且对创建的方法应用了拦截器链。学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-11 14:48:43 · 617 阅读 · 0 评论 -
【Mybatis源码分析】10-CglibProxyFactory
我们着重分析一下重要的intercept方法,首先判断如果调用了懒加载对象的writeReplace方法,则返回CglibSerialStateHolder对象,这个对象实现了writeExternal和readExternal用于支持对象的序列化,这不是我们分析的重点。EnhancedResultObjectProxyImpl实现了MethodInterceptor接口,此接口是Cglib拦截目标对象方法的入口,对目标对象方法的调用都会通过此接口的intercept的方法。最后调用目标对象的真实方法。原创 2024-05-11 14:47:16 · 460 阅读 · 0 评论 -
【Mybatis源码分析】09-ResultSetHandler
首先根据ResultMap的type利用反射创建一个对象,然后查看ResultMap的映射关系是否存在select属性且开启了懒加载开关,将原始对象resultObject替换由ProxyFactory创建的代理对象,此处就是利用动态代理创建懒加载对象的起点,以后我们再分析这个动态代理的懒加载对象,回过头继续分析getRowValue方法。结果嵌套就是下面这种情况。其实并不是后续没有操作,只是隐藏的比较隐蔽,还记得本文上面分析的创建对象的时候如果有懒加载映射会将该空对象替换为一个代理的对象吧。原创 2024-05-11 10:41:04 · 1160 阅读 · 0 评论 -
【Mybatis源码分析】08-SimpleExecutor的query分析
上一篇分析到如果二级缓存没有命中,则会调用一个Executor(默认是SimpleExecutor)的query方法,SimpleExecutor继承了BaseExecutor,直接调用BaseExecutor的query方法。从boundSql获取parameterMappings遍历每个参数,从参数对通过参数名取出相应的值,调用typeHandler的setParameter方法对PreparedStatement设置对应的参数值。学习必须往深处挖,挖的越深,基础越扎实!作者简介:大家好,我是。原创 2024-05-11 10:39:21 · 917 阅读 · 0 评论 -
【Mybatis源码分析】07-SqlSession执行过程之二级缓存
2.flushCacheIfRequired根据ms判断是否需要清空Cache的缓存,默认查询是不清除的,分析到这就会发现一个问题:默认情况下更新一张表的一条数据就会将整个这个表对应的整个Cache缓存的内容都清空,所以Mybatis二级缓存只适合数据不太变动的缓存。可以看到只是用了一个Map简单的将CacheKey和结果对象做了一个映射,而是在commit方法中将结果放入Cache中的,我们看一下commit的调用链。如果缓存中存在结果对象则直接返回,否则调用委托对象的query方法获取结果在放入缓存。原创 2024-05-11 10:33:03 · 719 阅读 · 0 评论 -
【Mybatis源码分析】06-SqlSession执行过程之获取BoundSql代理对象
1.根据PropertyTokenizer判断是否是一个多层级的属性访问,如果是则先取顶层对象将其重新包裹为一个MetaObject对象,然后对这个对象再次调用getValue方法,这个时候getValue的参数为去除第一层级的字符串了,直到入参name为单层级的字符串也是就不带"."的字符串然后调用objectWrapper的get方法取出name所对应的属性值。的语句,并将变量占位符信息抽像为ParameterMapping。MetaClass内部使用的是反射技术,有兴趣的可以看看这个类的实现。原创 2024-05-10 15:13:51 · 913 阅读 · 0 评论 -
【Mybatis源码分析】05-SqlSession执行过程之获取Mapper代理对象
其中包括方法的返回类型,返回类型是否为void,返回类型是否为Collection或数组或游标,如果参数中含有RowBounds类型保存其在参数列表的索引值,ResultHandler同理,最后还new了一个ParamNameResolver对象,MethodSignature通过此对象可以对外提供获取参数索引值或参数名的方法,因为此对象内部缓存了方法参数列表中除了RowBounds和ResultHandler类型参数的索引值与参数名的键值对。否则参数名为arg0,arg1...的形式了。原创 2024-05-10 15:11:50 · 834 阅读 · 0 评论 -
【Mybatis源码分析】04-SqlSession的创建过程
executor包含了刚刚创建的Transaction,所以Transaction关联了Connection和Executor,如果为指定executorType则使用默认的SimpleExecutor,如果开启了二级缓存(默认开启),则CachingExecutor会包装SimpleExecutor,然后依次调用拦截器的plugin方法返回一个被代理过的Executor对象。联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-10 15:09:28 · 317 阅读 · 0 评论 -
【Mybatis源码分析】03-DataSourceFactory与DataSource
Mybatis中DataSourceFactory是负责创建DataSource对象的,Mybatis一共为我们提供了3种DataSourceFactory的实现,不同的DataSourceFactory创建不同的DataSource,分别为UnpooledDataSourceFactory,PooledDataSourceFactory和JndiDataSourceFactory。下面分别看看这两种DataSource,UnpooledDataSource和PooledDataSource。原创 2024-05-09 15:23:54 · 668 阅读 · 0 评论 -
【Mybatis源码分析】02-Mapper映射的解析过程
有两种情况,一种是TextSqlNode含有${..}一种是含有这种元素。到现在为止我们知道调用Mapper对象的方法实际就是调用apperMethodM对象的execute方法就可以了,后面分析完mapper的xml解析后再详细看一下MapperMethod,因为MapperMethod会用到解析mapper的xml文件解析出来的MappedStatement,毕竟调用Mapper接口的代理对象的方法才会出发execute方法,那时Mapper映射文件早已经解析好放入Configuration中了。原创 2024-05-09 15:21:46 · 965 阅读 · 0 评论 -
【Mybatis源码分析】01-SqlSessionFactory的创建过程
方法负责解析Mybatis配置文件的标签,将属性放入内存对象configuration中,通过Properties的putAll方法可以看出属性优先级,XMLConfigBuilder构造函数中传入的属性 > resource或url指定的属性 > 子标签的属性。可以看到调用了父类的构造方法,并传入一个new Configuration()对象,这个对象也就是最终的Mybatis配置对象,在看一下默认注册的TypeAlias,这个是TypeAliasRegistry对象构造函数默认注册的。原创 2024-05-09 15:20:13 · 1504 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 类型模块
① MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。② 类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及:在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。原创 2024-05-09 07:44:43 · 783 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 日志模块
无论在开发测试环境中,还是在线上生产环境中,日志在整个系统中的地位都是非常重要的。良好的日志功能可以帮助开发人员和测试人员快速定位 Bug 代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的 Java 世界中存在很多优秀的日志框架,例如 Log4j、 Log4j2、Slf4j 等。MyBatis 作为一个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。原创 2024-05-09 07:42:10 · 444 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 缓存模块
在优化系统性能时,优化数据库性能是非常重要的一个环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理地使用缓存可以将一部分数据库请求拦截在缓存这一层。MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓 存模块实现的。这里需要读者注意的是,MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。原创 2024-05-09 07:40:51 · 1163 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 事务模块
MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务。原创 2024-05-09 07:38:57 · 804 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 异常模块
定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。原创 2024-05-09 07:37:13 · 640 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 反射模块
Java 中的反射虽然功能强大,但对大多数开发人员来说,写出高质量的反射代码还是 有一定难度的。MyBatis 中专门提供了反射模块,该模块对 Java 原生的反射进行了良好的封装,提了更加简洁易用的 API,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。原创 2024-05-08 18:37:13 · 609 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 解析器模块
解析器模块,主要提供了两个功能:一个功能,是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。另一个功能,是为处理动态 SQL 语句中的占位符提供支持。源码对应 parsing 包。原创 2024-05-08 18:35:33 · 626 阅读 · 0 评论 -
精尽 MyBatis 源码分析 —— 项目结构一览
MyBatis 的整体架构分为三层:基础支持层核心处理层接口层。原创 2024-05-08 18:33:55 · 623 阅读 · 0 评论 -
Mybatis 核心流程图解
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-08 17:10:38 · 322 阅读 · 0 评论 -
Mybatis 核心流程-数据读取阶段
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-08 07:49:54 · 1108 阅读 · 0 评论 -
Mybatis 核心流程-代理阶段
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-08 07:46:31 · 850 阅读 · 0 评论 -
Mybatis 核心流程-初始化阶段
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-08 07:42:47 · 897 阅读 · 0 评论 -
Mybatis源码分析(四大对象-ResultSetHandler结果集映射)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-07 21:41:48 · 1013 阅读 · 0 评论 -
Mybatis源码分析(ParameterHandler参数读取)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-07 21:40:00 · 896 阅读 · 0 评论 -
Mybatis源码分析(StatementHandler数据库访问)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-07 21:35:34 · 788 阅读 · 0 评论 -
Mybatis源码和设计模式(SqlSession模块与策略模式)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-07 07:59:41 · 844 阅读 · 0 评论 -
Mybatis源码和设计模式(插件模块和代理模式、责任链模式)
如下是Mybatis分页插件里面实现的一个插件,我们从这里开始看实现自定义插件的方法/*** QueryInterceptor 规范* 详细说明见文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/Interceptor.md*/@Override//由于逻辑关系,只会进入一次//4 个参数时} else {//6 个参数时//TODO 自己要进行的各种处理。原创 2024-05-07 07:56:36 · 753 阅读 · 0 评论 -
Mybatis源码和设计模式(Executor组件与模板模式,装饰器模式)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-07 07:54:33 · 958 阅读 · 0 评论 -
Mybatis源码和设计模式(数据源创建和和策略模式)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 15:01:06 · 1215 阅读 · 0 评论 -
Mybatis源码和设计模式(缓存模块和装饰器模式)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 14:58:04 · 771 阅读 · 0 评论 -
Mybatis源码和设计模式(日志模块和适配器模式,代理模式)
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 14:55:58 · 865 阅读 · 0 评论 -
MyBatis使用#和$操作符模拟sql注入
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 07:16:51 · 393 阅读 · 0 评论 -
MyBatis新增数据时自增id的两种写法
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 07:14:09 · 1568 阅读 · 0 评论 -
MyBatis多属性查询的三种方式
学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析阶段5、深入jvm源码解析码哥源码部分码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】码哥源码-原理源码篇【Doug Lea为什么要将成员变量原创 2024-05-06 07:12:38 · 395 阅读 · 0 评论 -
Mybatis 动态SQL
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-06 07:11:09 · 701 阅读 · 0 评论 -
Mybatis 映射文件
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-05 18:43:42 · 667 阅读 · 0 评论 -
Mybatis 配置文件
作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!原创 2024-05-05 18:42:14 · 655 阅读 · 0 评论