【Java】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打印,如果这篇文章对你有帮助的话,就请点个赞支持一下吧!

你可能感兴趣的:(java,spring,boot,sql)