自定义mybatis拦截器
xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置插件 -->
<plugins>
<!-- 指定插件类路径 -->
<plugin interceptor="com.xuxd.mybatis.plugin.demo.CustomPlugin">
<!-- 这里是插件需要的属性值配置 -->
<property name="k" value="v"/>
<property name="k" value="v"/>
<property name="k" value="v"/>
</plugin>
</plugins>
</configuration>
拦截的接口
mybatis主要提供了下面4个接口支持拦截:
1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
2. ParameterHandler (getParameterObject, setParameters)
3. StatementHandler (prepare, parameterize, batch, update, query)
4. ResultSetHandler (handleResultSets, handleOutputParameters)
上面括号内是该接口允许拦截的方法,可以点击接口的源码查看方法的,关于这4个接口执行时间段

代码实现
首先,需要实现Interceptor接口,类路径如下:
org.apache.ibatis.plugin.Interceptor
就3个方法需要实现,我用两个个示例加上,一个是拦截查询业务,另一个拦截增删改日志,注释说明一下:
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Properties;
/**
* 自定义mybatis拦截器
*/
@Intercepts({
@Signature(method = "query",
type = Executor.class,
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class QueryDataIntercept implements Interceptor {
/**
* 获取日志对象,构造函数传入当前类,查找日志方便定位
*/
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
// 这里是每次执行操作的时候,都会进行这个拦截器的方法内
public Object intercept(Invocation invocation) throws Throwable {
//TODO:自已的业务处理
log.info("查询数据库前...");
Object proceed = invocation.proceed();
log.info("查询数据库后...");
return proceed;
}
@Override
// 主要是为了把这个拦截器生成一个代理放到拦截器链中
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
@Override
// 插件初始化的时候调用,也只调用一次,插件配置的属性从这里设置进来
public void setProperties(Properties properties) {
}
}
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Statement;
import java.util.Properties;
/**
* 自定义mybatis拦截器
*/
@Intercepts({
@Signature(type = StatementHandler.class, method = "update", args = {Statement.class})
})
public class ExecDataIntercept1 implements Interceptor {
/**
* 获取日志对象,构造函数传入当前类,查找日志方便定位
*/
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public Object intercept(Invocation invocation) throws Throwable {
log.info("更新数据库前...");
Object proceed = invocation.proceed();
log.info("更新数据库后...");
return proceed;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target,this);
}
@Override
public void setProperties(Properties properties) {
}
}

浙公网安备 33010602011771号