MyBatis-Plus中SQL分析與打印
前言
MyBatis-Plus提供了SQL分析與打印的功能,通過(guò)集成p6spy組件,可以方便地輸出SQL語(yǔ)句及其執(zhí)行時(shí)長(zhǎng)。本功能適用于MyBatis-Plus 3.1.0及以上版本。
一、p6spy簡(jiǎn)介
p6spy 是一個(gè)針對(duì)數(shù)據(jù)庫(kù)訪問(wèn)進(jìn)行攔截和記錄的工具,它通過(guò)代理JDBC驅(qū)動(dòng)程序來(lái)工作。這意味著你的應(yīng)用程序可以像往常一樣使用JDBC,而p6spy會(huì)在幕后記錄所有的SQL語(yǔ)句及其執(zhí)行時(shí)間。這對(duì)于開(kāi)發(fā)和調(diào)試過(guò)程中的SQL優(yōu)化非常有用。
p6spy不僅限于記錄SQL日志,它還提供了一些高級(jí)功能,如:
- 慢SQL檢測(cè):通過(guò)配置
outagedetection和outagedetectioninterval,p6spy可以記錄執(zhí)行時(shí)間超過(guò)設(shè)定閾值的SQL語(yǔ)句。 - 自定義日志格式:通過(guò)
logMessageFormat,你可以自定義SQL日志的輸出格式,包括時(shí)間戳、執(zhí)行時(shí)間、SQL語(yǔ)句等。 - 日志輸出控制:
appender配置項(xiàng)允許你選擇日志輸出到控制臺(tái)、文件或日志系統(tǒng)。 p6spy是一個(gè)強(qiáng)大的工具,它為MyBatis-Plus用戶提供了便捷的SQL分析與打印功能。通過(guò)合理配置,你可以在開(kāi)發(fā)和測(cè)試階段有效地監(jiān)控和優(yōu)化SQL語(yǔ)句。然而,由于性能損耗,建議在生產(chǎn)環(huán)境中謹(jǐn)慎使用。
二、示例工程
為了更好地理解如何使用這一功能,可以參考官方提供的示例工程:
1. 依賴引入
首先,需要在項(xiàng)目中引入p6spy依賴。以下是Maven和Gradle兩種構(gòu)建工具的引入方式:
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
2. 配置
接下來(lái),需要在application.yml或application.properties中進(jìn)行相應(yīng)的配置。
application.yml
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:h2:mem:test
# 其他數(shù)據(jù)庫(kù)配置...
spy.properties
p6spy的配置文件spy.properties包含了多個(gè)配置項(xiàng),以下是一些關(guān)鍵配置的示例:
# 模塊列表,根據(jù)版本選擇合適的配置 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定義日志格式 logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger # 日志輸出到控制臺(tái) appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger # 取消JDBC驅(qū)動(dòng)注冊(cè) deregisterdrivers=true # 使用前綴 useprefix=true # 排除的日志類別 excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 實(shí)際驅(qū)動(dòng)列表 # driverlist=org.h2.Driver # 開(kāi)啟慢SQL記錄 outagedetection=true # 慢SQL記錄標(biāo)準(zhǔn)(單位:秒) outagedetectioninterval=2
三、Spring Boot集成
對(duì)于Spring Boot項(xiàng)目,可以使用p6spy-spring-boot-starter來(lái)簡(jiǎn)化集成過(guò)程。
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的配置信息,請(qǐng)參考GitHub。
3. 注意事項(xiàng)
driver-class-name應(yīng)配置為p6spy提供的驅(qū)動(dòng)類。url前綴應(yīng)為jdbc:p6spy,后跟實(shí)際的數(shù)據(jù)庫(kù)連接地址。- 如果打印的SQL為
null,請(qǐng)?jiān)?code>excludecategories中增加commit。 - 如果批量操作不打印SQL,請(qǐng)去除
excludecategories中的batch。 - 對(duì)于批量操作打印重復(fù)的問(wèn)題,請(qǐng)使用
MybatisPlusLogFactory(3.2.1新增)。 - 請(qǐng)注意,該插件可能會(huì)帶來(lái)性能損耗,不建議在生產(chǎn)環(huán)境中使用。
四、實(shí)戰(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 # 日志輸出到控制臺(tái)(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 # 開(kāi)啟慢查詢?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. 測(cè)試類
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é)
通過(guò)以上步驟,你就可以在開(kāi)發(fā)過(guò)程中方便地分析和打印SQL語(yǔ)句了。記得根據(jù)實(shí)際需要調(diào)整配置,以達(dá)到最佳的使用效果。
到此這篇關(guān)于MyBatis-Plus中SQL分析與打印的文章就介紹到這了,更多相關(guān)MyBatis-Plus SQL打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
必知必會(huì)的SpringBoot實(shí)現(xiàn)熱部署兩種方式
這篇文章主要為大家介紹了必知必會(huì)的SpringBoot實(shí)現(xiàn)熱部署兩種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
java讀取文件和寫入文件的方式(簡(jiǎn)單實(shí)例)
下面小編就為大家?guī)?lái)一篇java讀取文件和寫入文件的方式(簡(jiǎn)單實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
通過(guò)實(shí)例解析Java List正確使用方法
這篇文章主要介紹了通過(guò)實(shí)例解析Java List正確使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用
這篇文章主要介紹了詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

