java利用mybatis拦截器统计sql执行时间示例
可以根据执行时间打印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&¶meterObject!=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;
}
}
相关文章
- java分层打印二叉树_基于Java的二叉树层序遍历打印实现
- java中保留两位小数的输出
- 安卓java游戏模拟器_Java手机游戏模拟器
- java代码大全及详解_Java练级攻略[通俗易懂]
- java 堆栈的声明_Java 堆栈[通俗易懂]
- java webservice实现_JAVA WebService的实现方式
- java官方编译器_JAVA 编译器
- VSCode配置调试编译java环境,史上最全!!!
- java——ArrayList和LinkedList的区别以及List的实现
- 【愚公系列】2023年03月 Java教学课程 089-Servlet服务器的注解开发
- 【错误记录】Flutter 混合开发报错 ( java.nio.file.FileSystemException: xxx/R.jar: 另一个程序正在使用此文件,进程无法访问。 )
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- Java调试Linux:探索新的技术可能性(java调试Linux)
- 失效Redis控制Java代码过期失效(redisjava过期)
- 处理使用Java处理Redis数据过期(redisjava过期)
- 构建Redis实现Java程序的自动过期构建(redisjava过期)
- 数据解决Redis中 Java的过期数据问题(redisjava过期)
- 处理Redis与Java结合,处理过期策略的实现(redisjava过期)
- 环境的基础Linux:Java环境的支撑者(linux是java)
- Java与MySQL的无缝衔接:实现高效数据操作(java中使用mysql)
- 让Java开发能力在Linux下得到更大发挥(java linux编程)
- 链接MySQL与Java实现长连接功能(mysqljava长)
- 异常Java程序捕获Oracle异常从失败中学习(java捕获oracle)
- Oracle与Java的结合图像处理的快速开发(java图片oracle)
- JAVA/JSP学习系列之七(Orion下自定义Tag)