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 } }