zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java利用mybatis拦截器统计sql执行时间示例

JAVA统计mybatisSQL执行 利用 时间 示例
2023-06-13 09:15:20 时间

可以根据执行时间打印sql语句,打印的sql语句是带参数的,可以拷贝到查询分析器什么的直接运行

复制代码代码如下:

packagemybatis;

importjava.text.DateFormat;
importjava.util.Date;
importjava.util.List;
importjava.util.Locale;
importjava.util.Properties;

importorg.apache.ibatis.executor.Executor;
importorg.apache.ibatis.mapping.BoundSql;
importorg.apache.ibatis.mapping.MappedStatement;
importorg.apache.ibatis.mapping.ParameterMapping;
importorg.apache.ibatis.plugin.Interceptor;
importorg.apache.ibatis.plugin.Intercepts;
importorg.apache.ibatis.plugin.Invocation;
importorg.apache.ibatis.plugin.Plugin;
importorg.apache.ibatis.plugin.Signature;
importorg.apache.ibatis.reflection.MetaObject;
importorg.apache.ibatis.session.Configuration;
importorg.apache.ibatis.session.ResultHandler;
importorg.apache.ibatis.session.RowBounds;
importorg.apache.ibatis.type.TypeHandlerRegistry;

@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})})
publicclassMybatisInterceptorimplementsInterceptor{

 privatePropertiesproperties;

 publicObjectintercept(Invocationinvocation)throwsThrowable{
  MappedStatementmappedStatement=(MappedStatement)invocation.getArgs()[0];
  Objectparameter=null;
  if(invocation.getArgs().length>1){
   parameter=invocation.getArgs()[1];
  }
  StringsqlId=mappedStatement.getId();
  BoundSqlboundSql=mappedStatement.getBoundSql(parameter);
  Configurationconfiguration=mappedStatement.getConfiguration();
  ObjectreturnValue=null;
  longstart=System.currentTimeMillis();
  returnValue=invocation.proceed();
  longend=System.currentTimeMillis();
  longtime=(end-start);
  if(time>1){
   Stringsql=getSql(configuration,boundSql,sqlId,time);
   System.err.println(sql);
  }
  returnreturnValue;
 }

 publicstaticStringgetSql(Configurationconfiguration,BoundSqlboundSql,StringsqlId,longtime){
  Stringsql=showSql(configuration,boundSql);
  StringBuilderstr=newStringBuilder(100);
  str.append(sqlId);
  str.append(":");
  str.append(sql);
  str.append(":");
  str.append(time);
  str.append("ms");
  returnstr.toString();
 }

 privatestaticStringgetParameterValue(Objectobj){
  Stringvalue=null;
  if(objinstanceofString){
   value="""+obj.toString()+""";
  }elseif(objinstanceofDate){
   DateFormatformatter=DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT,Locale.CHINA);
   value="""+formatter.format(newDate())+""";
  }else{
   if(obj!=null){
    value=obj.toString();
   }else{
    value="";
   }

  }
  returnvalue;
 }

 publicstaticStringshowSql(Configurationconfiguration,BoundSqlboundSql){
  ObjectparameterObject=boundSql.getParameterObject();
  List<ParameterMapping>parameterMappings=boundSql.getParameterMappings();
  Stringsql=boundSql.getSql().replaceAll("[\\s]+","");
  if(parameterMappings.size()>0&&parameterObject!=null){
   TypeHandlerRegistrytypeHandlerRegistry=configuration.getTypeHandlerRegistry();
   if(typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())){
    sql=sql.replaceFirst("\\?",getParameterValue(parameterObject));

   }else{
    MetaObjectmetaObject=configuration.newMetaObject(parameterObject);
    for(ParameterMappingparameterMapping:parameterMappings){
     StringpropertyName=parameterMapping.getProperty();
     if(metaObject.hasGetter(propertyName)){
      Objectobj=metaObject.getValue(propertyName);
      sql=sql.replaceFirst("\\?",getParameterValue(obj));
     }elseif(boundSql.hasAdditionalParameter(propertyName)){
      Objectobj=boundSql.getAdditionalParameter(propertyName);
      sql=sql.replaceFirst("\\?",getParameterValue(obj));
     }
    }
   }
  }
  returnsql;
 }

 publicObjectplugin(Objecttarget){
  returnPlugin.wrap(target,this);
 }

 publicvoidsetProperties(Propertiesproperties0){
  this.properties=properties0;
 }
}