SpringBoot-数据访问系列
文章平均质量分 89
SpringBoot数据源自动配置原理、自动配置脚本、整合JDBC、整合MyBatis、整合Spring-Data-JPA及相关应用
ZWZhangYu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【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在 Oracle 中使用 IN 语句不能超过 1000 问题
在 Oracle 数据库中,IN 语句常用于查询某个字段是否属于一组特定的值。对于大多数开发者而言,IN 是一种简单直观的查询方式,能够提升开发效率,避免过多的 OR 语句。然而,许多人在使用 IN 语句时可能遇到一个问题,即查询中的 IN 子句无法处理超过 1000 个元素。这一限制是 Oracle 数据库的内在设计问题,虽然不常见,但一旦遇到,可能会造成应用程序崩溃或性能问题。原创 2024-12-15 13:01:57 · 1640 阅读 · 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异常体系中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 评论 -
【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插件开发——解析和记录输出完整的SQL语句
自定义MyBatis插件,该插件实现当MyBatis执行SQL发生异常时输出错误原因,SQL参数以及完整的SQL语句。在日常的开发中我们可以通过mybatis配置设置是否输出SQL,但是对于正常运行的SQL全部输出出来日志量过大,所以这里实现了仅针对于发生异常的时候输出执行的SQL语句。对于日志输出的SQL框架仅提供了带有占位符的SQL以及对应的参数,如果想要测试运行这个SQL还需要自己手动拼接下,所以为了提高效率,在插件中对于SQL进行解析和占位符的替换,最终输出的SQL语句是可以直接在数据库中运行的。原创 2023-06-18 14:25:00 · 3783 阅读 · 0 评论 -
整合Druid数据和数据源监控
(一)切换数据源引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version></d...原创 2020-03-14 22:38:15 · 1785 阅读 · 0 评论 -
整合JDBC与数据源自动配置原理
(一)整合连接SpringBoot依赖启动选择:1:web-SpringWeb2:SQL: JDBC、MySQL参考依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-start...原创 2020-03-14 22:35:28 · 1323 阅读 · 0 评论
分享