MyBatis3源码深度解析
文章平均质量分 97
MyBatis3源码深度解析
灰色孤星A
卷又卷不赢,躺又躺不平。
展开
-
MyBatis3源码深度解析(二十七)MyBatis整合Spring框架
通常情况下,我们并不会单独使用MyBatis框架,而是与Spring、SpringBoot等框架进行整合。MyBatis框架与Spring框架整合需要使用mybatis-spring模块。整合后,MyBatis中的Mapper动态代理对象会作为Spring框架的Bean注册到Spring容器中。原创 2024-03-29 06:00:00 · 1244 阅读 · 0 评论 -
MyBatis3源码深度解析(二十六)级联映射与关联查询(三)懒加载的使用与实现原理
上一节【MyBatis3源码深度解析(二十五)级联映射与关联查询(二)级联映射的实现原理】详细解读了MyBatis级联映射的实现原理,在使用外部Mapper的方式实现级联映射时,会为关联的Java实体对象执行一次额外的查询。但在一些场景下,可能会需要按需加载。例如查询用户信息时,不需要立刻查询用户关联的订单信息,而是在调用订单信息的Getter方法时,才执行订单信息的查询操作。MyBatis提供了懒加载机制来实现这种需求,这种方式能够在一定程度上减少数据库的IO次数,提升系统性能。原创 2024-03-28 09:35:50 · 990 阅读 · 2 评论 -
MyBatis3源码深度解析(二十五)级联映射与关联查询(二)级联映射的实现原理
上一节【MyBatis3源码深度解析(二十四)级联映射与关联查询(一)级联映射的使用】通过编写一个测试案例,学习了如何使用标签实现MyBatis的一对多、一对一级联映射。本节来研究一下MyBatis级联映射的实现原理。原创 2024-03-27 16:05:38 · 1002 阅读 · 0 评论 -
MyBatis3源码深度解析(二十四)级联映射与关联查询(一)级联映射的使用
MyBatis其中一个比较强大的功能是支持查询结果的级联映射。使用MyBatis级联映射,可以轻松地实现一对多、一对一、多对多关联查询,甚至实现懒加载。所谓懒加载,就是当一个实体对象中关联了其他实体对象时,如果没有使用这个被关联的实体对象,则不为被关联的实体对象执行额外的查询操作。而一旦调用当前实体的Getter方法获取被关联的实体对象时,再执行一次额外的查询操作。通过这种方式在一定程度上能够减轻数据库的压力。原创 2024-03-27 07:00:00 · 900 阅读 · 0 评论 -
MyBatis3源码深度解析(二十三)MyBatis拦截器的原理及应用(二)自定义分页插件、慢SQL插件
第一种是从数据库中查询出所有满足条件的数据,然后通过应用程序进行分页处理,这种方式在数据量过大时效率比较低,而且可能会造成内存溢出,所以不太常用。第二种是通过数据库提供的分页语句进行物理分页,这种该方式效率较高且查询数据量较少,所以是一种比较查用的分页方式。本节基于数据库物理分页的方式编写一个MyBatis分页插件。由于面向对象设计原则中提倡面向接口编程,因此首先可以编写一个接口,定义有关分页的一些基本方法。/** 总记录数 *//** 总页数 *//** 每页记录数 */原创 2024-03-26 14:52:08 · 906 阅读 · 0 评论 -
MyBatis3源码深度解析(二十二)MyBatis拦截器的原理及应用(一)拦截器的实现原理与执行过程
MyBatis框架支持用户通过自定义插件的方式改变SQL的执行行为,例如在SQL执行时追加SQL分页语法,从而达到简化分页查询的目的。用户自定义的插件也被称为MyBatis拦截器。本章研究MyBatis拦截器的实现原理及其应用。为方便阅读,本文均采用“拦截器”这一话语,而不使用“插件”这一话语。原创 2024-03-25 18:49:05 · 1080 阅读 · 0 评论 -
MyBatis3源码深度解析(二十一)动态SQL实现原理(二)动态SQL解析过程、#{}和${}的区别
在【MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件】中研究了MyBatis动态SQL相关的组件,如SqlSource用于描述通过XML文件或Java注解配置的SQL信息,SqlNode用于描述动态SQL中的<if>、<where>等标签信息,LanguageDriver用于对SQL配置进行解析,将SQL配置转换为SqlSource对象。研究了MyBatis动态SQL相关的组件,下面来研究一下动态SQL的解析过程。原创 2024-03-24 15:59:42 · 954 阅读 · 0 评论 -
MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件
在使用JDBC API进行编程时,通常都要对SQL语句进行拼接,甚至还要根据不同的查询条件动态地拼接SQL语句,这个过程是比较繁琐且容易出错的,以致于花费更多的时间。MyBatis的动态SQL特性就用于解决这个问题。本节先对动态SQL的基本使用,以及涉及到的核心组件进行研究,下一节完整地研究动态SQL的解析过程。原创 2024-03-23 15:00:47 · 781 阅读 · 0 评论 -
MyBatis3源码深度解析(十九)MyBatis日志实现
日志是Java应用中必不可少的部分,它能够记录系统运行状况,有助于准确定位系统异常,不同的项目可能会使用不同的日志框架。在整合了MyBatis的项目中,经常可以在日志文件中看到打印出来的SQL语句,那本节就来研究一下MyBatis的日志实现。原创 2024-03-22 10:06:08 · 1109 阅读 · 0 评论 -
MyBatis3源码深度解析(十八)MyBatis缓存(二)二级缓存对象的创建与MyBatis使用Redis
MyBatis的一级缓存在BaseExecutor类中实现,其内部维护了两个PerpetualCache实例;二级缓存在CachingExecutor类中实现,其内部维护了一个TransactionalCacheManager实例,用于管理所有的二级缓存对象。在CachingExecutor的query()方法中,,即从MappedStatement对象中获取Cache对象,因此MappedStatement对象中必然组合了二级缓存对象实例。原创 2024-03-21 09:49:38 · 1008 阅读 · 0 评论 -
MyBatis3源码深度解析(十七)MyBatis缓存(一)一级缓存和二级缓存的实现原理
缓存是MyBatis中非常重要的特性。合理使用缓存,可以减少数据库IO,显著提升系统性能;但在分布式环境下,如果使用不当则会带来数据一致性问题。在上一节【MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程】中提到,MyBatis提供了一级缓存和二级缓存来提升查询效率,一级缓存在BaseExecutor类中完成,二级缓存在CachingExecutor类中完成。原创 2024-03-20 16:56:51 · 1379 阅读 · 0 评论 -
MyBatis3源码深度解析(十六)SqlSession的创建与执行(三)Mapper方法的调用过程
上一节【MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取】已经知道,调用SqlSession对象的方法,传入指定的Mapper接口对应的Class对象,即可获得一个动态代理对象,然后通过代理对象调用方法即可完成对数据库的操作。</select></mapper>@Test// 获取Mapper接口的动态代理对象// 操作数据库。原创 2024-03-19 19:24:35 · 1306 阅读 · 0 评论 -
MyBatis3源码深度解析(十五)SqlSession的创建与执行(二)Mapper接口和XML配置文件的注册与获取
SqlSession对象创建后,接下来是执行Mapper。执行Mapper的过程可以拆解为三步:注册Mapper接口与XML配置文件;注册MappedStatement对象;调用Mapper方法。原创 2024-03-19 07:00:00 · 1023 阅读 · 0 评论 -
MyBatis3源码深度解析(十四)SqlSession的创建与执行(一)Configuration与SqlSession的创建过程
MyBatis的核心组件之一SqlSession对象,表示框架与数据库建立的绘画,通过该对象的实例可以完成对数据库的增删改查操作。SqlSession对象的创建过程可以拆解为3个阶段:Configuration实例的创建过程、SqlSessionFactory实例的创建过程和SqlSession实例化的过程。原创 2024-03-18 15:19:44 · 1146 阅读 · 1 评论 -
MyBatis3源码深度解析(十三)MyBatis的核心组件(二)
MyBatis框架的配置信息有两种,一种是配置MyBatis框架属性的主配置文件,另一种是配置可执行的SQL语句的Mapper配置文件。Configuration组件的作用除了描述主配置文件mybatis-config.xml的信息,还描述Mapper配置文件的信息。原创 2024-03-17 22:12:21 · 854 阅读 · 0 评论 -
MyBatis3源码深度解析(十二)MyBatis的核心组件(一)Configuration
具体做法是:实现。原创 2024-03-16 18:02:49 · 1093 阅读 · 0 评论 -
MyBatis3源码深度解析(十一)MyBatis常用工具类(四)ObjectFactory&ProxyFactory
本节研究ObjectFactory和ProxyFactory的基本用法,因为它们在MyBatis的源码中比较常见。这里不深究ObjectFactory和ProxyFactory的源码,而是放到后续章节再展开。原创 2024-03-14 07:00:00 · 976 阅读 · 0 评论 -
MyBatis3源码深度解析(十)MyBatis常用工具类(三)MetaObject&MetaClass
文章目录3.4 MetaObject3.5 MetaClass3.4 MetaObjectMetaObject是MyBatis提供的反射工具类,可以方便地获取和设置对象的属性值。该工具类在MyBatis源码中出现的概率非常高。假设有两个实体类:用户信息User和订单信息Order,一个用户可以有多笔订单,因此User类中通过一个List对象记录用户的订单信息。public class User { private List<Order> orderList; priv原创 2024-03-13 11:31:40 · 1841 阅读 · 0 评论 -
MyBatis3源码深度解析(九)MyBatis常用工具类(二)ScriptRunner&SqlRunner
ScriptRunner是MyBatis提供的读取脚本文件中的SQL语句并执行的工具类。源码1:org/apache/ibatis/jdbc/ScriptRunner.java// 执行脚本遇到异常时是否中断执行// 是否抛出SQLWarning警告// 是否自动提交// 属性为true时,批量执行文件中的SQL语句// 属性为false时,逐条执行文件中的SQL语句// 是否取出windows系统换行符中的 \r// 设置Statement属性是否支持转义处理。原创 2024-03-11 19:35:23 · 1475 阅读 · 0 评论 -
MyBatis3源码深度解析(八)MyBatis常用工具类(一)SQL工具类
如果SQL语句比较复杂,则需要在代码中对SQL语句进行拼接,当条件不固定时,还需要根据条件进行不同的拼接,同时还要注意空格、逗号等的使用。由 源码3 可知,AbstractSQL类负责完成SQL语句的构造工作,其内部维护了一个内部类SQLStatement对象的实例,和一系列上面列举的构造SQL语句的方法。方法处理 UPDATE 子句,由其传入的参数可知,关键字keyword是"UPDATE",关键字子集parts是名为tables的集合,这个集合保存了表的名称。如上面的示例所示,SQL工具类可以调用。原创 2024-03-11 06:45:00 · 1510 阅读 · 0 评论 -
MyBatis3源码深度解析(七)JDBC单连接事务
DatabaseMetaData接口中有一个方法,用于判断当前数据源是否支持事务。事务用于提供数据完整性、正确的应用程序语义和并发访问的数据一致性。所有遵循JDBC规范的驱动程序都需要提供事务支持。本节研究JDBC中的单连接事务。原创 2024-03-10 07:00:00 · 1794 阅读 · 0 评论 -
MyBatis3源码深度解析(六)DatabaseMetaData
本节研究DatabaseMetaData接口。该接口是一个模板接口,用于提供底层数据源相关的信息,具体实现由JDBC驱动程序来实现(本文的示例均是MySQL的驱动程序实现)。该接口的作用在于,为应用程序或工具确定如何与底层数据源交互,应用程序也可以使用该接口提供的方法获取数据源信息。原创 2024-03-09 12:42:42 · 708 阅读 · 0 评论 -
MyBatis3源码深度解析(五)ResultSet
上一节中,在执行方法时均会返回一个ResultSet对象,并且在方法中还可以对ResultSet对象的处理逻辑进行配置。本节来详细研究一下ResultSet对象的特性。原创 2024-03-08 10:44:46 · 1413 阅读 · 2 评论 -
MyBatis3源码深度解析(四)Statement
本节研究JDBC API中的Statement接口及其子接口PreparedStatement和CallableStatement。为方便测试验证,从本节开始不再使用MyBatis内置的HSQLDB数据库作为测试数据库,改用MySQL作为测试数据库。age INT,// 创建连接(用户名和密码需换成自己的)// 关闭相关资源try {try {try {原创 2024-03-06 16:53:47 · 1247 阅读 · 0 评论 -
MyBatis3源码深度解析(三)Connnection
本节将详细研究Connection接口的相关内容,例如JDBC驱动程序的类型、DriverManager类、Driver接口以及DataSource接口等。DataSource是比较推荐的获取数据源连接的一种方式。JDBC驱动程序都会实现DataSource接口,通过DataSource接口实现类的实例,返回一个Connection对象的实例。DataSource对象表示能够提供数据源连接的数据源对象。原创 2024-03-05 14:56:10 · 829 阅读 · 0 评论 -
MyBatis3源码深度解析(二)JDBC API简介
MyBatis框架对JDBC做了轻量级的封装,因此在开始学习MyBatis源码之前,有必要全面地了解JDBC规范。本章使用的JDBC版本是4.2。JDBC(Java Database Connectivity)是Java语言中提供的访问关系型数据库的接口。使用JDBC API可以执行SQL语句、检索SQL执行结果以及将数据更改写回底层数据源。JDBC API基于X/Open SQL CLI,是ODBC的基础,为Java程序提供了访问一个或多个数据源的方法。原创 2024-02-23 14:56:24 · 837 阅读 · 0 评论 -
MyBatis3源码深度解析(一)搭建MyBatis源码环境
笔者作为一名Java开发人员,工作中的项目几乎都将MyBatis作为持久层框架,但笔者对MyBatis框架的理解仅局限于使用,并不理解框架底层的实现原理。为此,为提升自身编码能力,笔者决定深入学习MyBatis的底层源码,并在CSDN发表学习笔记。学习参考书是:MyBatis 3源码深度解析 江荣波 清华大学出版社2002年,iBatis框架发布,引入SQL映射;2010年,iBatis框架改名为MyBatis,迁移到Google Code;2013年,MyBatis迁移到Github。原创 2024-02-21 11:04:45 · 1242 阅读 · 0 评论