MyBatis 的 Interceptor(拦截器)是一种用于在 MyBatis 执行 SQL 语句前后进行自定义操作的功能。要实现动态代理,你需要创建一个实现 org.apache.ibatis.plugin.Interceptor
接口的类,并重写 intercept(Invocation invocation)
方法。然后,你可以使用 JDK 动态代理或 CGLIB 动态代理来创建代理对象。
以下是一个简单的示例,展示了如何使用 JDK 动态代理实现 MyBatis 拦截器:
- 首先,创建一个实现
Interceptor
接口的类:
import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.*; import java.sql.Connection; import java.util.Properties; @Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) }) public class MyInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 在此处添加你的自定义操作,例如打印日志、修改 SQL 等 System.out.println("Before SQL execution"); // 继续执行原始方法 Object result = invocation.proceed(); // 在此处添加你的自定义操作,例如打印日志、修改结果集等 System.out.println("After SQL execution"); return result; } @Override public Object plugin(Object target) { // 当目标类是 StatementHandler 类型时,才进行代理 if (target instanceof StatementHandler) { return Plugin.wrap(target, this); } else { return target; } } @Override public void setProperties(Properties properties) { // 你可以在这里接收配置的属性 String someProperty = properties.getProperty("someProperty"); System.out.println("someProperty: " + someProperty); } }
- 在 MyBatis 配置文件中注册拦截器:
这样,当 MyBatis 执行 SQL 语句时,会自动调用 MyInterceptor
类中的 intercept
方法,你可以在这个方法中添加自定义操作。