抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文学习了如何使用MyBatis插件对框架行为进行定制。

环境

Windows 10 企业版 LTSC 21H2
MySQL 5.7.40
Java 1.8
Maven 3.6.3
MyBatis 3.5.6

1 工作原理

MyBatis插件的本质是拦截器,允许用户通过插件来拦截框架内部的核心方法执行,从而改变底层行为。这种机制提供了一种非侵入式的方式来扩展或修改框架的功能,而无需修改源代码。

插件的实现基于Java的动态代理机制,通过拦截运行过程中的关键方法调用来实现特定功能。

拦截器工作原理:

  1. 在初始化时,会创建拦截器链。
  2. 当执行SQL操作时,请求会依次经过链上的各个拦截器。
  3. 每个拦截器可以选择对请求进行处理、修改或直接放行。
  4. 所有拦截器处理完成后,执行原始的业务逻辑。

2 拦截接口

MyBatis提供了四个核心接口供插件拦截,每个接口负责不同的职责。

2.1 Executor(核心调用器)

Executor是核心接口,负责执行SQL语句和管理查询缓存以及调度其他组件。

主要拦截方法:

  • query:查询操作
  • update:更新操作
  • commit:提交事务
  • rollback:回滚事务

常见用途:

  • 事务控制
  • 缓存管理
  • 执行时间统计

2.2 StatementHandler(语句处理器)

StatementHandler负责准备SQL语句和执行JDBC操作。

主要拦截方法:

  • prepare:准备语句
  • parameterize:参数设置
  • query:查询操作
  • update:更新操作
  • batch:批量操作

常见用途:

  • SQL重写
  • 分页处理

2.3 ParameterHandler(参数处理器)

ParameterHandler处理预编译语句中的参数值。

主要拦截方法:

  • setParameters:参数设置

常见用途:

  • 参数加密
  • 参数验证

ResultSetHandler(结果集处理器)

ResultSetHandler处理JDBC结果集并将其转换为Java对象。

主要拦截方法:

  • handleResultSets:处理结果集
  • handleOutputParameters:处理输出参数

常见用途:

  • 结果解密
  • 结果过滤
  • 数据脱敏

3 自定义插件

3.1 创建

实现Interceptor接口:

java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 使用@Intercepts注解标识拦截器
@Intercepts({
// 使用@Signature注解设置拦截器的属性,可以拦截多个方法
@Signature(
// 设置拦截接口
type = Executor.class,
// 设置拦截接口的目标方法
method = "query",
// 设置目标方法需要的参数类型
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
)
})
public class DemoPlugin implements Interceptor {
// 核心拦截逻辑,拦截目标对象的方法调用
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 拦截前
System.out.println("执行SQL前...");
// 执行业务方法
Object result = invocation.proceed();
// 拦截后
System.out.println("执行SQL后...");
// 返回结果
return result;
}
// 匹配目标对象,判断目标对象是否需要返回代理对象进行拦截
@Override
public Object plugin(Object target) {
// 包装目标对象,返回代理对象
return Plugin.wrap(target, this);
}
// 设置插件参数,可以获取配置文件中的属性
@Override
public void setProperties(Properties properties) {
// 设置插件属性
System.out.println("param = " + properties.getProperty("param"));
}
}

3.2 配置

在mybatis-config.xml配置文件中配置插件:

xml
1
2
3
4
5
6
7
8
<!-- 指定插件,可以配置多个插件 -->
<plugins>
<!-- 指定插件的全类名 -->
<plugin interceptor="com.example.plugin.DemoPlugin">
<!-- 设置插件的参数 -->
<property name="param" value="100"/>
</plugin>
</plugins>

在执行查询的时候就会调用自定义插件的拦截方法。

评论