自定义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) {
        
    }
}

 

posted @ 2020-10-28 15:45  *乐途*  阅读(484)  评论(0)    收藏  举报