MybatisPlusInterceptor(3.4.0之后版本才有)
基本概念
MybatisPlusInterceptor 类是 Mybatis Plus 中的一个重要组件,用于实现插件的拦截和增强。MybatisPlusInterceptor 类的主要作用是拦截 Mybatis 的执行过程,并提供了插件扩展的机制。通过自定义拦截器,可以在 SQL 执行前后进行一系列操作,如分页、租户隔离、逻辑删除等。
使用 MybatisPlusInterceptor 类,你可以自定义拦截器来满足特定的业务需求。自定义拦截器需要实现 Interceptor 接口,并重写其中的方法,如 intercept 和 plugin。通过拦截器,你可以在 SQL 执行过程中干预和修改参数、动态生成 SQL、记录 SQL 执行日志等。这为开发者提供了更多的灵活性,可以根据具体的业务场景来扩展和定制 Mybatis Plus 的功能。
说明
这个类从3.4.0版本才开始有。
源码
方法
public void addInnerInterceptor(InnerInterceptor innerInterceptor)
添加内部拦截器,Mybatis Plus 提供了一些内置的拦截器,如分页插件 PaginationInterceptor、乐观锁插件
OptimisticLockerInterceptor 等。
public void setProperties(Properties properties)
设置属性
功能
MybatisPlusInterceptor 提供了多种功能,通过配置不同的插件,可以在 SQL 执行过程中实现以下功能:
1、分页查询
通过拦截 SQL 查询,自动添加分页参数。
2、性能分析
在执行 SQL 前后打印 SQL 语句和执行时间,以帮助开发者分析性能瓶颈。
3、乐观锁
实现对数据的乐观锁控制,防止数据的并发修改问题。
4、填充字段
自动填充创建时间、更新时间等字段。
使用示例
下面是一个简单的例子,展示了如何使用 MybatisPlusInterceptor 来注册 MyBatis-Plus 的内置插件
PaginationInnerInterceptor,以实现分页功能。
插件支持
MybatisPlusInterceptor 支持添加多个内置插件,常用的插件包括:
PaginationInnerInterceptor:用于实现分页功能
OptimisticLockerInnerInterceptor:用于乐观锁控制
TenantLineInnerInterceptor:用于多租户场景
IllegalSQLInnerInterceptor:非法SQL拦截器
DynamicTableNameInnerInterceptor:动态表名
DataPermissionInterceptor:数据权限
BlockAttackInnerInterceptor:攻击 SQL 阻断解析器,防止全表更新与删除
注意事项
1、插件顺序: 插件的执行顺序可能会影响最终的结果,特别是在多个插件同时操作同一条 SQL 时。
2、性能考量: 在实际使用中,注意评估插件的性能开销,避免对数据库性能造成影响。
PaginationInterceptor(3.4.0之前的版本有)
说明
这个类在3.4.0版本之前有,之后的版本就修改名字了。
PaginationInnerInterceptor(3.4.0之后版本有)
基本概念
PaginationInnerInterceptor 是 MyBatis-Plus 中专门用于处理分页功能的拦截器类。它通过对 SQL 执行过程的拦截来实现自动分页,极大地简化了在应用中进行分页查询的步骤。
说明
这个类从3.4.0版本开始有的。从MyBatis-Plus 3.4.0开始,PaginationInterceptor被重命名为
PaginationInnerInterceptor,并且需要作为MybatisPlusInterceptor的一个内部拦截器来添加。
源码
功能
自动为查询添加分页参数,并在执行 SQL 查询时根据这些参数进行限制,从而实现分页效果。
工作原理
当一个包含分页信息的查询请求到达时,
PaginationInnerInterceptor 会拦截该请求并进行以下操作:
1、解析分页参数: 它会从方法参数或查询对象中提取出分页信息(如当前页码和每页大小)。
2、构建分页 SQL: 根据提取的分页信息,修改原始 SQL 语句,以增加 LIMIT 和 OFFSET 子句(对于某些数据库)来限制返回结果的数量。
3、执行查询: 修改后的 SQL 被执行,返回对应的分页结果。
使用方式
要使用
PaginationInnerInterceptor,需要在 MyBatis-Plus 的配置中添加该拦截器。
添加依赖
确保你的项目已经包含 MyBatis-Plus 的依赖,如下:
配置拦截器
在 Spring Boot 项目中,可以通过 Java 配置类来配置
PaginationInnerInterceptor:
注意事项
1、总记录数: 使用
PaginationInnerInterceptor 时,它会自动计算总记录数,并将其设置到 Page 对象中,方便后续分页信息的获取。
2、数据库兼容性:
PaginationInnerInterceptor 支持多种数据库,但具体的 SQL 生成和执行方式可能略有不同,需根据数据库类型调整。
DataPermissionInterceptor
基本概念
DataPermissionInterceptor是MyBatis-Plus提供的数据权限拦截器,用于在SQL执行前自动添加数据权限过滤条件,实现行级数据权限控制。该拦截器基于MyBatis的插件机制,在SQL执行前拦截并修改SQL语句,自动添加权限过滤条件,确保用户只能访问有权限的数据。
源码
工作原理
1. SQL执行前被拦截
2. 解析SQL语句
3. 调用DataPermissionHandler
4. 生成权限过滤条件
5. 将条件添加到WHERE子句
6. 执行修改后的SQL
SQL改写示例
配置方式
权限处理器实现
注意事项
1、性能影响
每次SQL执行都会触发拦截器,需要优化权限计算逻辑
2、SQL兼容性
需要确保生成的SQL语法正确
3、缓存策略
权限信息变更时需要及时清理缓存
4、调试困难
SQL被动态修改,调试时需要关注最终执行的SQL
5、事务一致性
在同一事务中权限条件应该保持一致
InterceptorIgnoreHelper
基本概念
InterceptorIgnoreHelper 类是 MyBatis Plus 中用来帮助判断是否应该忽略某些拦截器的功能。这个类主要是为了在执行 SQL 操作时,能够根据用户的需求决定是否应用某些拦截器。比如,你可能不想在某些特定的操作上应用分页或者租户过滤等。
作用
1、忽略指定的拦截器
在执行某些 SQL 操作时,可以指定跳过某些拦截器的处理,这在某些不需要分页或者不需要租户过滤的情况下很有用。
2、条件过滤
可以基于特定的条件来决定是否应用拦截器。例如,如果某个请求是来自管理员,那么可能不需要应用租户过滤。
使用示例
总结
InterceptorIgnoreHelper 是 MyBatis Plus 中的一个内部工具类,它帮助开发者在某些特殊情况下绕过全局设置的功能,增加了 SQL 操作的灵活性。通过使用特定注解(如 @InterceptorIgnore),开发者可以在需要的地方明确指示 MyBatis Plus 忽略某些拦截器的行为。这在需要精细控制 SQL 执行上下文时非常有用,尤其是在处理多租户环境下的数据隔离问题时。不过,请注意,实际的注解名称和属性可能会随 MyBatis Plus 的版本而有所不同。
MybatisConfiguration
基本概念
MybatisConfiguration 是 MyBatis-Plus 对 MyBatis 原生 Configuration 类的扩展实现。
源码
核心作用
配置增强:在 MyBatis 原有配置基础上,添加了 MyBatis-Plus 特有的配置项和功能。
主要功能
1、映射器注册增强
支持 MyBatis-Plus 的 BaseMapper 自动注册
2、SQL 注入器集成
内置 CRUD 方法的 SQL 自动注入
3、分页插件支持
为分页功能提供配置支持
4、字段策略配置
支持字段填充、逻辑删除等策略配置
5、性能优化
优化了映射器的加载和缓存机制
关键特性
1、继承自 MyBatis 的 Configuration
2、无缝集成 MyBatis-Plus 的增强功能
3、保持与原生 MyBatis 的兼容性
4、自动处理 BaseMapper 的方法映射
使用场景
通常不需要直接操作,由 MyBatis-Plus 框架自动创建和管理,在 Spring Boot 整合时自动配置生效。
总结
MyBatis-Plus 框架的核心配置类,负责整合和增强 MyBatis 的配置功能。
JacksonTypeHandler
基本概念
JacksonTypeHandler 是 MyBatis-Plus 内置的JSON类型处理器,用于处理 Java 对象与数据库 JSON 字段的自动转换。
源码
核心功能
自动将 Java 对象与数据库 JSON 字段相互转换。
主要特性
1、基于 Jackson
(1)使用 Jackson 作为 JSON 处理引擎
(2)支持复杂对象的序列化/反序列化
(3)性能优秀,功能强大
2、双向转换
存储时:Java 对象 → JSON 字符串 → 数据库
读取时:数据库 JSON → Java 对象
3、类型支持
1、支持普通 POJO 对象
2、支持集合类型(List、Map 等)
3、支持嵌套复杂对象
使用场景
存储流程
1、接收 Java 对象
2、使用 Jackson 序列化为 JSON 字符串
3、存储到数据库 TEXT/VARCHAR 字段
读取流程
1、从数据库读取 JSON 字符串
2、使用 Jackson 反序列化为 Java 对象
3、返回给应用层
优势
1、简化开发:无需手动 JSON 转换
2、透明处理:对业务代码无感知
3、类型安全:编译时类型检查
4、性能优化:内置缓存机制
适用场景
存储配置信息、标签列表、复杂属性等非关系型数据。
MybatisEnumTypeHandler
基本概念
MybatisEnumTypeHandler 是 MyBatis 中用于处理枚举类型的类型处理器。它的主要作用是将 Java 枚举类型与数据库中对应的列类型之间进行转换。具体来说,当你在 Java 对象中使用枚举类型时,MybatisEnumTypeHandler 可以将其正确地存储到数据库中,以及从数据库中读取数据并转换为相应的枚举值。
源码
主要功能
1、枚举与数据库之间的转换
将枚举值转换为数据库支持的类型(通常是字符串或整数),以便存储在数据库中。
将从数据库中读取的数据转换为相应的枚举类型。
2、支持多种枚举类型
MybatisEnumTypeHandler 可以处理任意的 Java 枚举类型,而不局限于某一种特定类型。
3、灵活性
开发者可以根据需要选择不同的枚举类型处理方式,比如使用名称(name())或顺序值(ordinal())进行转换。
属性
enumClassType
枚举类型
propertyType
java对象的属性类型
方法
public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType)
将枚举值设置为数据库参数。在执行 SQL 语句前调用此方法,将枚举的值转换为相应的数据库类型并设置到 PreparedStatement 中。
public E getNullableResult(CallableStatement cs, int columnIndex)
public E getNullableResult(ResultSet rs, String columnName)
从结果集中获取列值并转换为相应的枚举类型。如果列值为 null,则返回 null。
public E getNullableResult(ResultSet rs, int columnIndex)
用于通过列索引获取列值并转换为枚举类型。
使用场景
1、数据库表中存储枚举值
当你有一个数据库表列用于存储枚举类型时,可以使用 MybatisEnumTypeHandler 进行转换。例如,有一个订单状态的枚举,存储在数据库的字符串或整型字段中。
2、查询并映射枚举类型
当从数据库中查询数据时,使用 MybatisEnumTypeHandler 可以将数据库中的字符串或整型值自动转换回 Java 中的枚举类型。
SharedString
基本概念
SharedString 是 MyBatis Plus 中用于封装字符串的工具类,主要用于在条件构造器(如 QueryWrapper、UpdateWrapper)中共享字符串值。
作用
1、封装字符串值
将字符串值封装到一个对象中,便于在条件构造器中传递和使用。
2、支持空字符串和 null 值
提供了 toEmpty() 和 toNull() 方法,方便将字符串值设置为空字符串或 null
3、链式调用支持
使用了 Lombok 的 @Accessors(chain = true) 注解,支持链式调用。
4、空字符串共享
提供了 emptyString() 方法,返回一个共享的空字符串对象,避免重复创建空字符串。
使用场景
1、在条件构造器中共享字符串
在构建查询条件时,可能需要多次使用相同的字符串值。通过 SharedString 可以避免重复创建字符串对象。
2、表名和字段名缓存
在 MyBatis Plus 中,表名和字段名通常会频繁使用。通过 SharedString 缓存这些名称,可以减少内存占用。
3、其他字符串共享
任何需要频繁使用的字符串都可以通过 SharedString 进行共享。