前言
在项目中对数据库中进行操作调试的时候,最重要的一个功能就是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打印效果文章来源:https://uudwc.com/A/EB1vn
============== 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打印,如果这篇文章对你有帮助的话,就请点个赞支持一下吧!文章来源地址https://uudwc.com/A/EB1vn