MyBatis源码分析
文章平均质量分 91
MyBatis源码分析
ZWZhangYu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【MyBatis源码】从0到1手写自定义 MyBatis 框架
本文将基于之前的源码分析和开源文章构建一个简化版的MyBatis框架,帮助大家更好地理解MyBatis的工作原理,并掌握自定义ORM框架的基本步骤。mybatis-config.xml 是 MyBatis 的全局配置文件,用于定义 MyBatis 的各种配置选项,如数据库连接信息、事务管理、缓存、插件、Mapper 的扫描等。Executor 是执行 SQL 语句的核心组件,负责将映射的 SQL 语句发送到数据库,并处理查询结果。执行器是 MyBatis 核心的一部分,处理实际的数据库操作。原创 2025-01-06 22:40:16 · 1219 阅读 · 0 评论 -
【MyBatis源码分析】Spring与MyBatis整合深入解析
MapperScannerConfigurer 是 MyBatis-Spring 框架中的一个非常重要的组件,它帮助开发者自动扫描并注册 MyBatis 的 Mapper 接口。通过 MapperScannerConfigurer,我们不需要手动配置每一个 Mapper 接口的 Bean,而是通过配置扫描路径,自动为每个接口创建代理实例,并将其注册为 Spring 的 Bean。原创 2025-01-01 19:19:21 · 1365 阅读 · 0 评论 -
SqlSession的线程安全问题源码分析
ExecutionPlaceholder.EXECUTION_PLACEHOLDER 是一个查询标记,这个占位符可以避免在查询缓存时出现“脏读”,当多个线程同时查询同一个 key 的缓存,线程 A 还在数据库查询过程中,线程 B 也开始查询相同的 key,但此时线程 A 还没完成查询,缓存中的数据尚未更新,假设此时是同一个 SqlSession,因为cacheKey 是一模一样的,线程B会去一级缓存中取值,取出的数据就是旧的值。SqlSession 中包含了对事务的管理,事务在数据库连接上下文中是绑定的。原创 2025-01-01 15:08:28 · 1205 阅读 · 0 评论 -
Mybatis 为什么不需要给Mapper接口写实现类,为什么要使用代理而不是硬编码?
在 MyBatis 中,使用代理的方式相比于直接在方法内部获取 namespace 对应的 XML 并解析 SQL,具有几个显著的优点。虽然通过手动解析 SQL 也能实现功能,但代理机制的使用带来了更多的灵活性、简洁性和可维护性。原创 2024-12-30 21:38:25 · 1861 阅读 · 1 评论 -
【MyBatis源码分析】使用 Java 动态代理,实现一个简单的插件机制
通过使用 Java 动态代理,我们可以实现一个灵活的插件机制,允许在运行时动态地拦截和增强目标对象的方法。这个机制非常适合用于类似 MyBatis 的插件系统,可以方便地在目标方法执行前后加入自定义逻辑,而无需修改目标对象的代码。通过这种方式,可以轻松扩展系统功能,增强代码的可维护性和灵活性。原创 2024-12-21 21:36:06 · 662 阅读 · 0 评论 -
MyBatis主键自增回填功能源码分析
*** 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,* 如Oracle、DB2,KeyGenerator提供了processBefore()方法。*//*** 针对自增主键的表,在插入时不需要主键,而是在插入过程自动获取一个自增的主键,* 比如MySQL、PostgreSQL,KeyGenerator提供了processAfter()方法*/原创 2024-12-21 16:11:23 · 898 阅读 · 0 评论 -
MyBatis通过注解配置执行SQL语句原理源码分析
parseStatement 方法是 MyBatis 中 MapperAnnotationBuilder 类的一个重要方法,用于解析 Mapper 接口中的 SQL 注解(如 @Select、@Insert 等),并根据注解创建 SqlSource 和相关的 SQL 配置(MappedStatement)。parse() 方法的功能是遍历 Mapper 接口中的每个方法,解析其中的 SQL 注解,并将对应的 SQL 语句注册到 MyBatis 的配置中,使得接口方法能够直接执行对应的 SQL 语句。原创 2024-12-20 22:48:57 · 1203 阅读 · 0 评论 -
【MyBatis源码】transaction包JdbcTransaction和 ManagedTransaction源码分析
MyBatis的transaction包是负责进行事务管理的包,该包内包含两个子包:jdbc子包中包含基于 JDBC进行事务管理的类,managed子包中包含基于容器进行事务管理的类。事务功能是由数据库提供的。以 MySQL 数据库为例,MySQL 主要有两种引擎:MyISAM和 InnoDB。MySQL默认操作模式就是自动提交模式。在这种模式下,除非显式地开始一个事务,否则每个查询都被当作一个单独的事务自动提交执行。原创 2024-12-04 21:33:32 · 973 阅读 · 0 评论 -
【MyBatis源码】详解datasource包,DataSourceFactory,数据库连接池
在数据库连接池中,activeConnections(活跃池)是用来存储当前正在被应用程序使用的数据库连接的容器。在 MyBatis 的 PooledDataSource 中,activeConnections 是一个关键的成员变量,它通过管理活跃连接来优化数据库连接的使用效率,并且帮助处理连接的获取、释放及生命周期管理。原创 2024-12-03 20:33:12 · 1429 阅读 · 0 评论 -
【MyBatis源码】异常拆包工具ExceptionUtil
ExceptionUtil 是一个异常工具类,它提供一个拆包异常的工具方法unwrapThrowable。该方法将 InvocationTargetException 和UndeclaredThrowableException 这两类异常进行拆包,得到其中包含的真正的异常。/*** 异常拆包工具*//*** 将 InvocationTargetException 和UndeclaredThrowableException 这两类异常进行拆包,得到其中包含的真正的异常。*/} else {原创 2024-12-01 20:05:11 · 669 阅读 · 0 评论 -
MyBatis异常体系中ErrorContext和ExceptionFactory原理分析
该类是负责生产 Exception的工厂。ExceptionFactory类只有两个方法。构造方法由 private修饰,确保该方法无法在类的外部被调用,也就永远无法生成该类的实例。通常,会对一些工具类、工厂类等仅提供静态方法的类进行这样的设置,因为这些类不需要实例化就可以使用。wrapException方法就是 ExceptionFactory类提供的静态方法,它用来生成并返回一个RuntimeException对象。原创 2024-12-01 20:03:17 · 1553 阅读 · 0 评论 -
自定义MyBatis分页插件和自定义慢SQL统计插件实践
在 MyBatis 项目中,自定义分页插件是一种灵活且高效的方式,用于满足项目的分页需求。实现思路• 拦截 SQL 执行利用 MyBatis 的插件机制,通过拦截器对 StatementHandler 进行拦截,修改原始 SQL,加入分页逻辑。• 动态拼接分页语句根据数据库类型(如 MySQL、Oracle 等),拼接对应的分页 SQL。• 设置分页参数使用 ThreadLocal 或其他方式传递分页参数。原创 2024-11-25 21:37:27 · 1122 阅读 · 0 评论 -
MyBatis插件原理及应用
MyBatis框架在应用启动时会对标签进行解析。MyBatis 的 XMLConfigBuilder 类是用来解析 MyBatis 配置文件的核心组件之一,其中 pluginElement() 方法的主要功能是解析 标签,并将其中定义的插件实例化后添加到 MyBatis 配置中,形成插件链原创 2024-11-25 21:34:24 · 1056 阅读 · 0 评论 -
【MyBatis源码】MyBatis缓存机制源码分析
MyBatis提供了一个配置参数localCacheScope,用于控制一级缓存的级别,该参数的取值为SESSION、STATEMENT,当指定localCacheScope参数值为SESSION时,缓存对整个SqlSession有效,只有执行DML语句(更新语句)时,缓存才会被清除。MyBatis的一级缓存,用户只能控制缓存的级别,并不能关闭。需要注意的是,PerpetualCache类重写了Object类的equals()方法,当两个缓存对象的Id相同时,即认为缓存对象相同。原创 2024-11-18 22:09:55 · 781 阅读 · 0 评论 -
【MyBatis源码】MapperRegistry详解
MapperAnnotationBuilder#parse 是 MyBatis 中用来解析 @Mapper 接口中注解的方法,它的作用是扫描并处理 @Select, @Insert, @Update, @Delete 等 SQL 操作注解,生成对应的 MappedStatement 并将其注册到 Configuration 中。语言驱动用于解析 SQL 语句,可以是注解中的 SQL,也可以是 XML 配置中的 SQL。原创 2024-11-17 15:49:56 · 1014 阅读 · 0 评论 -
【MyBatis源码】SqlSession执行Mapper过程
通过每次调用 getMapper 创建新的代理对象,MyBatis 可以确保每个 SqlSession 使用的是独立的代理实例,避免不同的会话之间共享相同的代理对象,从而保持隔离性。如果直接存储代理实例,则每次获取时只能使用已创建的代理,无法实现这种灵活的控制。【1】 代理类的创建开销:如果在 addMapper 时就直接将代理类实例化并存入 knownMappers 中,这意味着每次添加 Mapper 时都会实例化一个代理对象,这在某些情况下是不必要的,尤其是在大规模的应用程序中,可能会增加性能负担。原创 2024-11-17 12:32:33 · 1096 阅读 · 0 评论 -
【MyBatis源码】深入分析TypeHandler原理和源码
TypeReference 类是 BaseTypeHandler 的父类,因此所有的类型处理器都继承了TypeReference 的功能。这意味着对任何一个类型处理器调用getSuperclassTypeParameter方法,都可以得到该处理器用来处理的目标类型。原创 2024-11-12 22:25:38 · 1393 阅读 · 0 评论 -
【MyBatis源码】StatementHandler详解
BaseStatementHandler是一个抽象类,封装了通用的处理逻辑及方法执行流程,具体方法的实现由子类完成,这里使用到了设计模式中的模板方法模式。使用PreparedStatement实例执行SQL语句时,可以使用“?Statement接口中定义了执行SQL语句的方法,这些方法不支持参数输入,PreparedStatement接口中增加了设置SQL参数的方法,CallableStatement接口继承自PreparedStatement,在此基础上增加了调用存储过程以及检索存储过程调用结果的方法。原创 2024-11-11 20:19:34 · 619 阅读 · 0 评论 -
【MyBatis源码】MyBatis核心组件架构设计
StatementHandler组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler组件从Statement对象中获取ResultSet对象,然后将ResultSet对象转换为Java对象。SqlSession:SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。【2】 序号2的位置是mybatis的具体执行流程相关组件。原创 2024-11-10 20:58:01 · 957 阅读 · 0 评论 -
【MyBatis源码】SQL 语句构建器AbstractSQL
当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查询条件不固定时,还需要根据不同条件拼接不同的SQL语句。在MyBatis中已经为我们提供了这类开发工具类。MyBatis 中的 AbstractSQL 类是 MyBatis 提供的一个用于构建动态 SQL 语句的工具类。原创 2024-11-09 21:56:55 · 1690 阅读 · 0 评论 -
【MyBatis源码】ScriptRunner工具分析
SqlRunner 是 MyBatis 提供的一个工具类,主要用于在不依赖 Mapper 接口的情况下直接执行 SQL 语句。它的设计初衷是为了简化操作,适合在某些需要直接执行原生 SQL 的场景中使用。原创 2024-11-09 17:50:27 · 938 阅读 · 0 评论 -
【MyBatis源码】CacheKey缓存键的原理分析
MyBatis生成的 CacheKey 对象中包含了这次查询的所有信息,包括查询语句的 id、查询的翻页限制、数据总量、完整的 SQL语句,这些信息一致就保证了两次查询的一致。结合 CacheKey的 equals方法,我们知道只要通过 equals方法判断两个CacheKey对象相等,则两次查询操作的条件必定是完全一致的。因此,准确度和效率之间往往是相互制约的。CacheKey首先类设计了多个重要属性,这些属性为结合传入的参数信息进行组合计算以提高缓存key的唯一性,并能够以较高的性能进行比较计算。原创 2024-11-02 21:11:10 · 1346 阅读 · 0 评论 -
WeakReference与SoftReference以及结合ReferenceQueue实践整理
强引用 (Strong Reference):是最常见的引用形式,通常我们通过 new 关键字创建的对象引用都是强引用。只要一个对象有强引用指向它,垃圾回收器就不会回收这个对象// obj 是一个强引用软引用 (Soft Reference):软引用是比强引用弱一些的引用类型,适合用来实现缓存。只有在内存不足时,垃圾回收器才会回收软引用指向的对象。使用 SoftReference 类来实现。弱引用 (Weak Reference):比软引用更弱的引用类型。原创 2024-11-02 17:25:29 · 845 阅读 · 0 评论 -
【MyBatis源码】BoundSql分析
BoundSql除了封装了Mapper解析后的SQL语句和参数映射信息外,还封装了Mapper调用时传入的参数对象。另外,MyBatis任意一个Mapper都有两个内置的参数,即_parameter和_databaseId。_parameter代表整个参数,包括标签绑定的参数信息,这些参数存放在BoundSql对象的additionalParameters属性中。BoundSql是对SQL语句及参数信息的封装,它是SqlSource解析后的结果。原创 2024-11-01 21:56:34 · 746 阅读 · 0 评论 -
【MyBatis源码】SqlSession实例创建过程
在MyBatis中,openSession()方法是开启数据库会话的入口,主要作用是生成SqlSession对象。我们从SqlSessionFactory接口入手,其实现类DefaultSqlSessionFactory的openSession()方法用于创建SqlSession实例.原创 2024-10-30 22:05:59 · 996 阅读 · 1 评论 -
【MyBatis源码】SqlSource对象创建流程
languageRegistry:用于注册LanguageDriver,LanguageDriver用于解析SQL配置,将配置信息转换为SqlSource对象。MyBatis中的SqlSource用于描述SQL资源,MyBatis可以通过两种方式配置SQL信息,一种是通过@Selelect、@Insert、@Delete、@Update或者@SelectProvider、@InsertProvider、@DeleteProvider、@UpdateProvider等注解;另一种是通过XML配置文件。原创 2024-10-29 22:48:36 · 1266 阅读 · 0 评论 -
【MyBatis源码】SqlSessionFactoryBuilder源码分析
SqlSessionFactory 是 MyBatis 的核心接口之一,提供创建 SqlSession 的方法。SqlSession 则是与数据库交互的主要接口,负责执行 SQL 命令和映射结果。SqlSessionFactoryBuilder 类的作用就是从 XML 配置文件或者其他配置源中加载配置信息,构建出 SqlSessionFactory 实例。原创 2024-10-27 18:17:19 · 1459 阅读 · 0 评论 -
Class.getResource和ClassLoader.getResource的区别
• Class.getResource(String name): 这是一个实例方法,属于Class类。它是通过当前类所处路径来查找资源,并返回一个URL对象。• ClassLoader.getResource(String name): 这是一个属于ClassLoader类的方法。它直接通过类加载器查找资源。由于它是类加载器的静态方法,所以通常是通过ClassLoader的实例或类加载器的类名来调用。原创 2024-10-27 17:25:25 · 830 阅读 · 0 评论
分享