SpringBoot集成P6spy实现自定义SQL日志打印
作者:保加利亚的风
前言
在项目中对数据库中进行操作调试的时候,最重要的一个功能就是SQL打印。
如果使用Mybatis-plus的话,他会自带一个SQL打印的功能。虽然它可以打印,但我觉得还不够优雅,因为包含着很多我们不需要的信息,所以这篇文章实现一下在代码中优雅的打印SQL。
介绍
P6spy是什么?
P6Spy 是针对数据库访问操作的动态监测框架(为开源项目,项目首页:www.p6spy.com)它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改。P6Spy 分发包包括P6Log,它是一个可记录任何 Java 应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。
我们最需要的功能,查看sql语句,不是预编译的带问号的哦,而是真正的数据库执行的sql,更直观,更简单。
使用
1 导入相关依赖
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>${version:}</version>//目前最新版3.9.1 </dependency>
2 修改application.yml配置文件,只需要将连接和驱动进行修改
url: jdbc:p6spy:mysql://localhost:3306/db1_datasource driver-class-name: com.p6spy.engine.spy.P6SpyDriver
3 新增spy.properties文件
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory appender=com.p6spy.engine.spy.appender.StdoutLogger excludecategories=info,debug,result,batc,resultset deregisterdrivers=true dateformat=yyyy-MM-dd HH:mm:ss driverlist=com.mysql.cj.jdbc.Driver outagedetection=true outagedetectioninterval=2 #自定义SQL打印处理类 logMessageFormat=com.xxx.xxx.P6SpyLogger
4 新增P6SpyLogger,处理打印的SQL语句
import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import java.text.SimpleDateFormat; import java.util.Date; public class P6SpyLogger implements MessageFormattingStrategy { private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); /** * 自定义sql日志打印 * * @param connectionId 连接标识 * @param now 执行时间 * @param elapsed 执行秒数ms * @param category statement * @param prepared 准备sql语句 * @param sql sql语句 * @param s4 数据库url连接 * @return {@link String} */ @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String s4) { System.out.println(); if (!"".equals(sql.trim())) { String sqlBegin = "============== SQL LOGGER BEGIN =============="; String sqlExecuteTime = "SQL 执行时间 :" + this.format.format(new Date()) + "\n"; String elapsedStr = "SQL 执行毫秒 :" + elapsed + "ms" + "\n"; String sqlPrint = "SQL 执行语句 :" + sql; //String sqlPrint = !"".equals(sql.trim()) ? this.format.format(new Date()) + " | took " + elapsed + "ms | " + category + " | connection " + connectionId + "\n " + sql + ";" : ""; String sqlEnd = "============== SQL LOGGER END =============="; return sqlBegin + "\r\n" + sqlExecuteTime + elapsedStr + sqlPrint + "\r\n" + sqlEnd; } return ""; } }
5 查看SQL打印效果
============== SQL LOGGER BEGIN ==============
SQL 执行时间 :2023-07-12 11:37:43:296
SQL 执行毫秒 :5ms
SQL 执行语句 :select * from db2_user
============== SQL LOGGER END ==============
============== SQL LOGGER BEGIN ==============
SQL 执行时间 :2023-07-12 11:37:47:707
SQL 执行毫秒 :1ms
SQL 执行语句 :select * from db1_user where age = 18 order by create_time desc
============== SQL LOGGER END ==============
总结
可以根据方法的参数进行不同的搭配来实现优雅的SQL打印
到此这篇关于SpringBoot集成P6spy实现自定义SQL日志打印的文章就介绍到这了,更多相关SpringBoot P6spy自定义SQL打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!