MyBatis-Plus中SQL分析與打印
前言
MyBatis-Plus提供了SQL分析與打印的功能,通過集成p6spy
組件,可以方便地輸出SQL語句及其執(zhí)行時長。本功能適用于MyBatis-Plus 3.1.0
及以上版本。
一、p6spy簡介
p6spy 是一個針對數(shù)據(jù)庫訪問進行攔截和記錄的工具,它通過代理JDBC驅(qū)動程序來工作。這意味著你的應用程序可以像往常一樣使用JDBC,而p6spy
會在幕后記錄所有的SQL語句及其執(zhí)行時間。這對于開發(fā)和調(diào)試過程中的SQL優(yōu)化非常有用。
p6spy
不僅限于記錄SQL日志,它還提供了一些高級功能,如:
- 慢SQL檢測:通過配置
outagedetection和outagedetectioninterval
,p6spy可以記錄執(zhí)行時間超過設(shè)定閾值的SQL語句。 - 自定義日志格式:通過
logMessageFormat
,你可以自定義SQL日志的輸出格式,包括時間戳、執(zhí)行時間、SQL語句等。 - 日志輸出控制:
appender
配置項允許你選擇日志輸出到控制臺、文件或日志系統(tǒng)。 p6spy
是一個強大的工具,它為MyBatis-Plus
用戶提供了便捷的SQL分析與打印功能。通過合理配置,你可以在開發(fā)和測試階段有效地監(jiān)控和優(yōu)化SQL語句。然而,由于性能損耗,建議在生產(chǎn)環(huán)境中謹慎使用。
二、示例工程
為了更好地理解如何使用這一功能,可以參考官方提供的示例工程:
1. 依賴引入
首先,需要在項目中引入p6spy
依賴。以下是Maven和Gradle兩種構(gòu)建工具的引入方式:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency>
2. 配置
接下來,需要在application.yml
或application.properties
中進行相應的配置。
application.yml
spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:h2:mem:test # 其他數(shù)據(jù)庫配置...
spy.properties
p6spy
的配置文件spy.properties
包含了多個配置項,以下是一些關(guān)鍵配置的示例:
# 模塊列表,根據(jù)版本選擇合適的配置 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定義日志格式 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger # 日志輸出到控制臺 appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 取消JDBC驅(qū)動注冊 deregisterdrivers=true # 使用前綴 useprefix=true # 排除的日志類別 excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 實際驅(qū)動列表 # driverlist=org.h2.Driver # 開啟慢SQL記錄 outagedetection=true # 慢SQL記錄標準(單位:秒) outagedetectioninterval=2
三、Spring Boot集成
對于Spring Boot項目,可以使用p6spy-spring-boot-starter
來簡化集成過程。
1. 依賴
<dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.9.1</version> </dependency>
2. 配置
decorator: datasource: p6spy: # 日志格式 log-format: "\ntime:%(executionTime) || sql:%(sql)\n" # 自定義日志類 logging: custom custom-appender-class: com.example.testinit.config.StdoutLogger
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger { public void logText(String text) { System.err.println(text); } }
更多關(guān)于p6spy-spring-boot-starter
的配置信息,請參考GitHub。
3. 注意事項
driver-class-name
應配置為p6spy
提供的驅(qū)動類。url
前綴應為jdbc:p6spy
,后跟實際的數(shù)據(jù)庫連接地址。- 如果打印的SQL為
null
,請在excludecategories
中增加commit
。 - 如果批量操作不打印SQL,請去除
excludecategories
中的batch
。 - 對于批量操作打印重復的問題,請使用
MybatisPlusLogFactory
(3.2.1新增)。 - 請注意,該插件可能會帶來性能損耗,不建議在生產(chǎn)環(huán)境中使用。
四、實戰(zhàn)
1. 依賴
<!-- https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starter --> <dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.9.1</version> </dependency>
2. 配置(spy.properties)
# 模塊列表,根據(jù)版本選擇合適的配置 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定義日志格式 logMessageFormat=org.example.springboot3.mybatisplus.util.P6SpyLogger # 日志輸出到控制臺(default is com.p6spy.engine.spy.appender.FileLogger) #appender=com.p6spy.engine.spy.appender.Slf4JLogger #appender=com.p6spy.engine.spy.appender.StdoutLogger #appender=com.p6spy.engine.spy.appender.FileLogger #自定義輸出 appender=org.example.springboot3.mybatisplus.util.StdoutLogger # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 開啟慢查詢?nèi)罩? outagedetection=true outagedetectioninterval=2 # 自定義日志文件名 logfile=spy.log append=true
3. 配置類
P6SpyLogger
package org.example.springboot3.mybatisplus.util; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.p6spy.engine.spy.appender.MessageFormattingStrategy; /** * Create by zjg on 2024/7/6 */ public class P6SpyLogger implements MessageFormattingStrategy { @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { String text = StringUtils.isNotBlank(sql) ? " Consume Time:" + elapsed + " ms " + now + "\n Execute SQL:" + sql.replaceAll("[\\s]+", " ") : "";; if(elapsed>1000){ System.err.println(text); text=""; } return text; } }
StdoutLogger
package org.example.springboot3.mybatisplus.util; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; /** * Create by zjg on 2024/7/6 */ @Slf4j public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger { public void logText(String text) { if(StringUtils.hasLength(text)){ log.debug(text); } } }
4. 測試類
package org.example.springboot3.mybatisplus.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.example.springboot3.mybatisplus.model.User; import org.example.springboot3.mybatisplus.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * Create by zjg on 2024/7/6 */ @Slf4j @RestController @RequestMapping("/p6spy/") public class P6SpyController { @Autowired UserService userService; @RequestMapping("list") public void list() { // 查詢所有用戶 LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(User.class).isNotNull(User::getName).isNotNull(User::getId).orderByAsc(User::getId).orderByAsc(User::getName); List<User> users = userService.list(queryWrapper);// 調(diào)用 list 方法 log.debug(String.valueOf(users.size())); } }
5. 結(jié)果
總結(jié)
通過以上步驟,你就可以在開發(fā)過程中方便地分析和打印SQL語句了。記得根據(jù)實際需要調(diào)整配置,以達到最佳的使用效果。
到此這篇關(guān)于MyBatis-Plus中SQL分析與打印的文章就介紹到這了,更多相關(guān)MyBatis-Plus SQL打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
必知必會的SpringBoot實現(xiàn)熱部署兩種方式
這篇文章主要為大家介紹了必知必會的SpringBoot實現(xiàn)熱部署兩種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用
這篇文章主要介紹了詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用,是Java入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09