Mybatis拦截器实现统计sql执行时间及打印完整sql语句
时间: 2023-07-11 19:40:59 浏览: 110
Mybatis提供了拦截器(Interceptor)接口,可以在Mybatis执行SQL语句的过程中进行拦截和增强,比如在执行SQL语句前记录开始时间,在执行SQL语句后记录结束时间,从而计算SQL执行时间。
下面是一个简单的Mybatis拦截器实现统计SQL执行时间及打印完整SQL语句的示例代码:
```java
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class SqlCostInterceptor implements Interceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(SqlCostInterceptor.class);
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 记录开始时间
long start = System.currentTimeMillis();
// 执行 SQL 语句
Object result = invocation.proceed();
// 记录结束时间
long end = System.currentTimeMillis();
// 计算 SQL 执行时间
long cost = end - start;
// 获取 MappedStatement
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取 SQL
BoundSql boundSql = mappedStatement.getBoundSql(invocation.getArgs()[1]);
String sql = boundSql.getSql();
// 打印 SQL 语句及执行时间
LOGGER.info("SQL: {},Cost: {} ms", sql, cost);
return result;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// do nothing
}
}
```
在这个拦截器中,我们重写了`intercept`方法,先记录开始时间,然后执行SQL语句,最后记录结束时间,计算SQL执行时间。接着,我们获取`MappedStatement`对象,并从中获取SQL语句。最后,打印SQL语句及执行时间。
要想使用该拦截器,还需要在Mybatis配置文件中进行如下配置:
```xml
<!-- 配置拦截器 -->
<plugins>
<plugin interceptor="com.example.interceptor.SqlCostInterceptor"/>
</plugins>
```
这样,在Mybatis执行SQL语句时,就会自动调用该拦截器的`intercept`方法,从而实现了统计SQL执行时间及打印完整SQL语句的功能。
阅读全文