本文是系列文章,目录:
一、MybatisPlus-基本使用
二、MybatisPlus-进阶使用-条件构造器
三、MybatisPlus-进阶使用-自定义sql
四、MybatisPlus-进阶使用-Service接口(1)-基本使用
五、MybatisPlus-进阶使用-Service接口(2)-自定义service
六、MybatisPlus-进阶使用-Service接口(3)- 批量新增
七、MybatisPlus-进阶使用-逻辑删除
八、MybatisPlus-进阶使用-枚举处理器
九、MybatisPlus-进阶使用-JSON类型处理器
十、MybatisPlus-进阶使用-配置文件加密
十一、MybatisPlus-插件功能-分页插件(1)
十二、MybatisPlus-插件功能-分页插件(2)-通用分页封装
十三、MybatisPlus-插件功能-乐观锁插件
十四、MybatisPlus-插件功能-sql性能分析
十五、MybatisPlus-自动填充字段
MybatisPlus-问题汇总
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语句。然而,由于性能损耗,建议在生产环境中谨慎使用。
使用步骤
1.引入依赖
<!--p6spy-->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
<!-- 格式化sql,美化sql -->
<dependency>
<groupId>com.github.vertical-blank</groupId>
<artifactId>sql-formatter</artifactId>
<version>2.0.4</version>
</dependency>
2.修改application.yml配置,换成p6spy的驱动
spring:
datasource:
# jdbc:p6spy
url: jdbc:p6spy:mysql://127.0.0.1:3307/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
# p6spy驱动
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
3.创建spy.properties
在resources目录下创建spy.properties
#spy.properties
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 真实JDBC driver , 多个以逗号分割,默认为空。由于上面设置了modulelist, 这里可以不用设置driverlist
# driverlist=com.mysql.cj.jdbc.Driver
# 自定义日志打印
logMessageFormat=com.pino.demo.config.P6SpyLogger
#日志输出到控制台
appender=com.pino.demo.config.StdoutLogger
#若要日志输出到文件, 把上面的appnder注释掉, 或者采用下面的appender, 再添加logfile配置
#不配置appender时, 默认是往文件进行输出的
#appender=com.p6spy.engine.spy.appender.FileLogger
#logfile=log.log
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
# 执行时间设置, 只有超过这个执行时间的才进行记录, 默认值0, 单位毫秒
executionThreshold=10
4.配置自定义日志打印
创建配置类 P6SpyLogger.java
package com.pino.demo.config;
import com.github.vertical_blank.sqlformatter.SqlFormatter;
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");
/**
* 自定义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) {
if (!sql.trim().isEmpty()) {
String sqlBegin = "============== SQL LOGGER BEGIN ==============";
String sqlExecuteTime = "SQL 执行时间:" + this.format.format(new Date()) + "\n";
String elapsedStr = "SQL 执行毫秒:" + elapsed + "ms" + "\n";
String sqlPrint = "SQL 执行语句:" + "\r\n" + SqlFormatter.format(sql);
String sqlEnd = "============== SQL LOGGER END ==============";
return "\r\n" + sqlBegin + "\r\n" + sqlExecuteTime + elapsedStr + sqlPrint + "\r\n" + sqlEnd;
}
return "";
}
}
5.日志输出到控制台
也可以在spy.properties中配置输出到文件
package com.pino.demo.config;
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger {
public void logText(String text) {
System.err.println(text);
}
}