MyBatis-Plus中SQL分析与打印
目录
- 前言
- 一、p6spy简介
- 二、示例工程
- 1. 依赖引入
- 2. 配置
- 三、Spring Boot集成
- 1. 依赖
- 2. 配置
- 3. 注意事项
- 四、实战
- 1. 依赖
- 2. 配置(spy.properties)
- 3. 配置类
- 4. 测试类
- 5. 结果
- 总结
前言
MyBATis-Plus提供了SQL分析与打印的功能,通过集成p6spy
组件,可以方便地输出SQL语句及其执行时长。本功能适用于MyBatis-Plus 3.1.0
及以上版本。
一、p6spy简介
p6spy 是一个针对数据库访问进行拦截和记录的工具,它通过代理JDBC驱动程序来工作。这意味着你的应用程序可以像往常一样使用JDBC,而p6spy
会在幕后记录所有的SQL语句及其执行时间。这对于开发和调试过程中的SQL优化非常有用。
p6spy
不仅限于记录SQL日志,它还提供了一些高级功能,如:
- 慢SQL检测:通过配置
outagedetection和outagedetectioninterval
,p6spy可以记录执行时间超过设定阈值的SQL语句。 - 自定义日志格式:通过
logMessageFormat
,你可以自定义SQL日志的输出格式,包括时间戳、执行时间、SQL语句等。 - 日志输出控制:
appender
配置项允许你选择日志输出到控制台、文件或日志系统。 p6spy
是一个强大的工具,它为MyBatis-Plus
用户提供了便捷的SQL分析与打印功能。通过合理配置,你可以在开发和测试阶段有效地监控和优化SQL语句。然而,由于性能损耗,建议在生产环境中谨慎使用。
二、示例工程
为了更好地理解如何使用这一功能,可以参考官方提供的示例工程:
mybatis-plus-samplandroide-crud
1. 依赖引入
首先,需要在项目中引入p6spy
依赖。以下是Maven和Gradle两种构建工具的引入方式:
<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 # 其他数据库配置...
spy.properties
p6spy
的配置文件spy.properties
包含了多个配置项,以下是一些关键配置的示例:
# 模块列表,根据版本选择合适的配置 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驱动注册 deregisterdrivers=true # 使用前缀 useprefix=true # 排除的日志类别 excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 实际驱动列表 # 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:%(executionTphpime) || 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); } }
更多关于p6spy-spring-boot-starter
的配置信息,请参考GitHub。
3. 注意事项
driver-class-name
应配置为p6spy
提供的驱动类。url
前缀应为jdbc:p6spy
,后跟实际的数据库连接地址。- 如果打印的SQL为
null
,请在excludecategories
中增加commit
。 - 如果批量操作不打印SQL,请去除
excludecategories
中的batch
。 - 对于批量操作打印重复的问题,请使用
MybatisPlusLogFactory
(3.2.1新增)。 - 请注意,该插件可能会带来性能损耗,不建议在生产环境中使用。
四、实战
1. 依赖
<!-- https://mvnrepository.com/artifact/com.github.gavlyukovskiy/p6spy-spring-boot-starterjavascript --> <dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.9.1</version> </dependency>
2. 配置(spy.properties)
# 模块列表,根据版本选择合适的配置 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 # 开启慢查询日志 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.ewww.devze.comxample.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/python") 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);// 调用 list 方法 log.debug(String.valueOf(users.size())); } }
5. 结果
总结
通过以上步骤,你就可以在开发过程中方便地分析和打印SQL语句了。记得根据实际需要调整配置,以达到最佳的使用效果。
到此这篇关于MyBatis-Plus中SQL分析与打印的文章就介绍到这了,更多相关MyBatis-Plus SQL打印内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论