好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mybatis使用拦截器显示sql,使用druid配置连接信息

com.cpp.core.filter; import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; 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.ibatis.reflection.MetaObject; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.type.TypeHandlerRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.cpp.core测试数据mon.utils.SQLFormatter; @Intercepts ({ @Signature (type = Executor.class, method = "update" , args = { MappedStatement.class, Object.class }), @Signature (type = Executor.class, method = "query" , args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }) }) public class MybatisInterceptor implements Interceptor { private static Logger logger = LoggerFactory.getLogger(MybatisInterceptor.class); private Properties properties; public Object intercept (Invocation invocation) throws Throwable { MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[ 0 ]; Object parameter = null ; if (invocation.getArgs().length > 1 ) { parameter = invocation.getArgs()[ 1 ]; } String sqlId = mappedStatement.getId(); BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); Object returnValue = null ; long start = System.currentTimeMillis(); returnValue = invocation.proceed(); long end = System.currentTimeMillis(); long time = (end - start); if (time > 1 ) { String sql = getSql(configuration, boundSql, sqlId, time); logger.info( "调用的java方法为:\n " +sql.split( ":" )[ 0 ]); logger.info( "查询sql语句为:\n" +SQLFormatter.format(sql.split( ":" )[ 1 ]) + "\n" + "sql语句执行的时间:" +time+ "\n\n" ); } return returnValue; } public static String getSql (Configuration configuration, BoundSql boundSql, String sqlId, long time) { String sql = showSql(configuration, boundSql); StringBuilder str = new StringBuilder( 100 ); str.append(sqlId); str.append( ":" ); str.append(sql); str.append( ":" ); str.append(time); str.append( "ms" ); return str.toString(); } private static String getParameterValue (Object obj) { String value = null ; if (obj instanceof String) { value = "'" + obj.toString() + "'" ; } else if (obj instanceof Date) { DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); value = "'" + formatter.format( new Date()) + "'" ; } else { if (obj != null ) { value = obj.toString(); } else { value = "" ; } } return value; } public static String showSql (Configuration configuration, BoundSql boundSql) { Object parameterObject = boundSql.getParameterObject(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); String sql = boundSql.getSql().replaceAll( "[\\s]+" , " " ); if (parameterMappings.size() > 0 && parameterObject != null ) { TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { sql = sql.replaceFirst( "\\?" , getParameterValue(parameterObject)); } else { MetaObject metaObject = configuration.newMetaObject(parameterObject); for (ParameterMapping parameterMapping : parameterMappings) { String propertyName = parameterMapping.getProperty(); if (metaObject.hasGetter(propertyName)) { Object obj = metaObject.getValue(propertyName); sql = sql.replaceFirst( "\\?" , getParameterValue(obj)); } else if (boundSql.hasAdditionalParameter(propertyName) ) { Object obj = boundSql.getAdditionalParameter(propertyName); sql = sql.replaceFirst( "\\?" , getParameterValue(obj)); } } } } return sql; } public Object plugin (Object target) { return Plugin.wrap(target, this ); } public void setProperties (Properties properties0) { this .properties = properties0; } }

2、在新建sql格式化工具,格式化sql语句

  package  com.cpp.core.filter;
 import  java.util.Properties;
 import  org.apache.ibatis.executor.Executor;
 import  org.apache.ibatis.mapping.MappedStatement;
 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.ibatis.session.ResultHandler;
 import  org.apache.ibatis.session.RowBounds;
 @Intercepts ({
     @Signature (type = Executor.class, method =  "update" , args = { MappedStatement.class, Object.class }),
     @Signature (type = Executor.class, method =  "query" , args = { MappedStatement.class, Object.class,
            RowBounds.class, ResultHandler.class }) })
 public    class   SqlStatementInterceptor   implements   Interceptor  {
     private  Properties properties;
     @Override 
      public  Object  intercept  (Invocation invocation)   throws  Throwable  {
        System.out.println( "test" );
         return  invocation.proceed();
    }
     @Override 
      public  Object  plugin  (Object target)   {
         return  Plugin.wrap(target,  this );
    }
     @Override 
      public   void   setProperties  (Properties properties0)   {
         this .properties = properties0;
    }
}
 

3、在spring的配置文件中添加

   < bean   id = "sqlSessionFactory"   class = "org.mybatis.spring.SqlSessionFactoryBean" > 
         < property   name = "dataSource"   ref = "dataSource"  /> 
         <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> 
         < property   name = "typeAliasesPackage"   value = "com.cpp.core"  /> 
         <!-- 显式指定Mapper文件位置 --> 
         < property   name = "mapperLocations"   value = "classpath:/mybatis/*/*Mapper.xml"  /> 
         < property   name = "plugins" > 
             < array > 
                 < ref   bean = "paginationInterceptor" /> 
                 < ref   bean = "sqlStatementInterceptor" /> 
             </ array > 
         </ property > 
         < property   name = "configurationProperties" > 
             < props > 
                 < prop   key = "dialect" > mysql </ prop > 
             </ props > 
         </ property > 
     </ bean > 
 

配置插件

   < ref   bean = "sqlStatementInterceptor" /> 
 

配置注入的内容

   < bean   id = "sqlStatementInterceptor"   class = "com.cpp.core.filter.MybatisInterceptor" >  </ bean > 
 

2、如果使用的是Druid来连接的数据库

在web.xml文件中添加下面的信息

   < servlet > 
       < servlet-name > DruidStatView </ servlet-name > 
       < servlet-class > com.alibaba.druid.support.http.StatViewServlet </ servlet-class > 
   </ servlet > 
   < servlet-mapping > 
       < servlet-name > DruidStatView </ servlet-name > 
       < url-pattern > /druid/* </ url-pattern > 
   </ servlet-mapping >   
 

可以通过web的访问的形式进行访问页面:输入:
http://dev.eop.zhc360测试数据:8080/cpp-middleman-api/druid/sql.html
就可以查看到输出的sql语句了

mybatis使用拦截器显示sql,使用druid配置连接信息

标签:

查看更多关于mybatis使用拦截器显示sql,使用druid配置连接信息的详细内容...

  阅读:27次