使用场景:
本地调试代码的时候,希望看到执行的sql语句,并得到执行时间,后续可以复制到SQL客户端进行SQL优化。
解决方案:
代码如下:
@Order(99)
@Component
@Intercepts({
@Signature(method = "query", type = Executor.class, args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class SqlInterceptor implements Interceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(SqlInterceptor.class);
// 环境
@Value("${spring.profiles.active}")
private String env;
@Override
public Object intercept(Invocation invocation) throws Throwable {
// 生产环境不打印数据
if ("prod".equals(env)) {
return invocation.proceed();
}
// 获取执行方法的MappedStatement参数
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = invocation.getArgs().length > 1 ? invocation.getArgs()[1] : null;
String sqlId = mappedStatement.getId();
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
Configuration configuration = mappedStatement.getConfiguration();
// 记录SQL执行开始时间
long startTime = System.cur