java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot P6spy自定义SQL打印

SpringBoot集成P6spy实现自定义SQL日志打印

作者:保加利亚的风

本文主要介绍了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打印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文