要实现SQL执行时间统计,可以结合MyBatis和Log4j来实现。首先需要在MyBatis的配置文件中配置Log4j的日志输出,示例如下:
然后在Log4j的配置文件中配置输出格式和日志级别,示例如下:
log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
接着在MyBatis的Mapper接口中使用@Intercepts注解和@Signature注解来实现对SQL执行时间的拦截和统计,示例如下:
@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 SqlStatsInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { long startTime = System.currentTimeMillis(); Object result = invocation.proceed(); long endTime = System.currentTimeMillis(); long time = endTime - startTime; MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; String sqlId = mappedStatement.getId(); String sql = mappedStatement.getBoundSql(invocation.getArgs()[1]).getSql(); Logger logger = LoggerFactory.getLogger(SqlStatsInterceptor.class); logger.info("Execute SQL [{}] cost {}ms", sqlId, time); return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { } }
最后,在MyBatis的配置文件中注册拦截器,示例如下:
通过以上步骤,就可以实现对SQL执行时间的统计并输出到Log4j日志中。