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);
}
}
<!-- ... -->
<plugins>
<plugin interceptor="com.example.MyInterceptor">
<property name="someProperty" value="someValue"/>
</plugin>
</plugins>
<!-- ... -->
</configuration>
這樣,當 MyBatis 執行 SQL 語句時,會自動調用 MyInterceptor
類中的 intercept
方法,你可以在這個方法中添加自定義操作。