mybatis定义拦截器

applicationContext.xml

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
        lazy-init="false">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:SqlMapConfig.xml" />
        <property name="plugins">
            <list>
                <bean class="com.fyh.www.common.interceptor.SqlLogInterceptor" />
            </list>
        </property>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="annotationClass" value="org.springframework.stereotype.Repository" /><!-- 记得加注解 @Repository -->
        <property name="basePackage" value="com.fyh.www" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
        


SqlMapConfig.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>
    <settings>
        <setting name="lazyLoadingEnabled" value="false" />
        <setting name="cacheEnabled" value="true" />
    </settings>
    
<!--     在map.xml文件中配置如下 -->
<!--     <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>  -->
</configuration>

记录sql语句拦截器的具体实现

package com.fyh.www.common.interceptor;

import java.sql.Connection;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.log4j.Logger;
/**
 * mybatis 日志拦截器,只拦截实现了StatementHandler接口,方法参数 是Connection的prepare方法
 * @author pc
 *
 */

@Intercepts(@Signature(type=StatementHandler.class,method="prepare",args=Connection.class))
public class SqlLogInterceptor implements Interceptor {
    
    protected final Logger log = Logger.getLogger(SqlLogInterceptor.class);
    
    /**
     * 对原方法prepare方法进行拦截增强
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // TODO Auto-generated method stub
        StatementHandler statementHandler = (StatementHandler)invocation.getTarget();
        BoundSql boundSql = statementHandler.getBoundSql();
        Object parameterObject = statementHandler.getParameterHandler().getParameterObject();
        StringBuffer sb = new StringBuffer();
        sb.append(new StringBuilder().append(removeBreakingWhitespace(boundSql.getSql())).toString());
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        for (ParameterMapping parameterMapping : parameterMappings) {
            String param = parameterMapping.getProperty();
            try {
                sb.append(new StringBuilder().append("[").append(param).append(":")
                        .append(BeanUtils.getProperty(parameterObject, param)).append("]").toString());
            } catch (Exception e) {
                sb.append(new StringBuilder().append("[").append(param).append(":").append(parameterObject).append("]").toString());
            }
            
        }
         
        
        Object result = null;
        try {
            result = invocation.proceed();
            log.info(sb.toString());
        } catch (Exception e) {
            log.error(sb.toString());
        }
        
        
        return result;
    }
    
    /**
     * 去除空格和换行
     * @param original 原始字符串
     * @return
     */
    public String removeBreakingWhitespace(String original){
        StringTokenizer stringTokenizer = new StringTokenizer(original);
        StringBuffer sb = new StringBuffer();
        while(stringTokenizer.hasMoreTokens()){
            sb.append(stringTokenizer.nextToken());
        }
        return sb.toString();
        
    }
    
    
    
    /**
     * 返回对象,如果返回原对象不拦截,如果返回代理则拦截
     */
    @Override
    public Object plugin(Object object) {
        // TODO Auto-generated method stub
        return Plugin.wrap(object, this);
    }
    /**
     * 此方法用来获取配置参数
     */
    @Override
    public void setProperties(Properties properties) {
        // TODO Auto-generated method stub
        
    }

}
原文地址:https://www.cnblogs.com/woms/p/6038251.html