SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印
前言
在項(xiàng)目中對(duì)數(shù)據(jù)庫中進(jìn)行操作調(diào)試的時(shí)候,最重要的一個(gè)功能就是SQL打印。
如果使用Mybatis-plus的話,他會(huì)自帶一個(gè)SQL打印的功能。雖然它可以打印,但我覺得還不夠優(yōu)雅,因?yàn)榘芏辔覀儾恍枰男畔?,所以這篇文章實(shí)現(xiàn)一下在代碼中優(yōu)雅的打印SQL。
介紹
P6spy是什么?
P6Spy 是針對(duì)數(shù)據(jù)庫訪問操作的動(dòng)態(tài)監(jiān)測框架(為開源項(xiàng)目,項(xiàng)目首頁:www.p6spy.com)它使得數(shù)據(jù)庫數(shù)據(jù)可無縫截取和操縱,而不必對(duì)現(xiàn)有應(yīng)用程序的代碼作任何修改。P6Spy 分發(fā)包包括P6Log,它是一個(gè)可記錄任何 Java 應(yīng)用程序的所有JDBC事務(wù)的應(yīng)用程序。其配置完成使用時(shí),可以進(jìn)行數(shù)據(jù)訪問性能的監(jiān)測。
我們最需要的功能,查看sql語句,不是預(yù)編譯的帶問號(hào)的哦,而是真正的數(shù)據(jù)庫執(zhí)行的sql,更直觀,更簡單。
使用
1 導(dǎo)入相關(guān)依賴
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>${version:}</version>//目前最新版3.9.1
</dependency>2 修改application.yml配置文件,只需要將連接和驅(qū)動(dòng)進(jìn)行修改
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 連接標(biāo)識(shí)
? ? ?* @param now ? ? ? ? ?執(zhí)行時(shí)間
? ? ?* @param elapsed ? ? ?執(zhí)行秒數(shù)ms
? ? ?* @param category ? ? statement
? ? ?* @param prepared ? ? 準(zhǔn)備sql語句
? ? ?* @param sql ? ? ? ? ?sql語句
? ? ?* @param s4 ? ? ? ? ? 數(shù)據(jù)庫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 執(zhí)行時(shí)間 ? ? ? :" + this.format.format(new Date()) + "\n";
? ? ? ? ? ? String elapsedStr = "SQL 執(zhí)行毫秒 ? ? ? :" + elapsed + "ms" + "\n";
? ? ? ? ? ? String sqlPrint = "SQL 執(zhí)行語句 ? ? ? :" + 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 執(zhí)行時(shí)間 :2023-07-12 11:37:43:296
SQL 執(zhí)行毫秒 :5ms
SQL 執(zhí)行語句 :select * from db2_user
============== SQL LOGGER END ==============
============== SQL LOGGER BEGIN ==============
SQL 執(zhí)行時(shí)間 :2023-07-12 11:37:47:707
SQL 執(zhí)行毫秒 :1ms
SQL 執(zhí)行語句 :select * from db1_user where age = 18 order by create_time desc
============== SQL LOGGER END ==============
總結(jié)
可以根據(jù)方法的參數(shù)進(jìn)行不同的搭配來實(shí)現(xiàn)優(yōu)雅的SQL打印
到此這篇關(guān)于SpringBoot集成P6spy實(shí)現(xiàn)自定義SQL日志打印的文章就介紹到這了,更多相關(guān)SpringBoot P6spy自定義SQL打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java.io.UnsupportedEncodingException異常的正確解決方法(親測有效!)
這篇文章主要給大家介紹了關(guān)于java.io.UnsupportedEncodingException異常的正確解決方法,文中介紹的辦法親測有效,java.io.UnsupportedEncodingException是Java編程語言中的一個(gè)異常類,表示指定的字符集不被支持,需要的朋友可以參考下2024-02-02
詳解Guava Cache本地緩存在Spring Boot應(yīng)用中的實(shí)踐
Guava Cache是一個(gè)全內(nèi)存的本地緩存實(shí)現(xiàn),本文將講述如何將 Guava Cache緩存應(yīng)用到 Spring Boot應(yīng)用中。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Java實(shí)現(xiàn)的貸款金額計(jì)算功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的貸款金額計(jì)算功能,結(jié)合實(shí)例形式分析了Java簡單數(shù)值運(yùn)算及類型轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Java調(diào)用DeepSeek實(shí)現(xiàn)多輪對(duì)話功能
對(duì)于廣大Java開發(fā)者而言,DeepSeek這一先進(jìn)的人工智能技術(shù),猶如一把鑰匙,為我們打開了提升開發(fā)效率與創(chuàng)新能力的新大門,本文給大家介紹了Java調(diào)用DeepSeek實(shí)現(xiàn)多輪對(duì)話功能,需要的朋友可以參考下2025-03-03
Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作,結(jié)合實(shí)例形式分析了Bean定義中的SpEL表達(dá)式語言操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12
Java web實(shí)現(xiàn)賬號(hào)單一登錄,防止同一賬號(hào)重復(fù)登錄(踢人效果)
這篇文章主要介紹了Java web實(shí)現(xiàn)賬號(hào)單一登錄,防止同一賬號(hào)重復(fù)登錄,有點(diǎn)類似于qq登錄踢人效果,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10

