本节目标
- 实现Mybatis Plus + P6Spy 进行sqly语句输出
- 实现Mybatis Plus + P6Spy 进行sql执行耗时输出
P6Spy简介
p6spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。通常使用它来跟踪数据库操作,查看程序运行过程中执行的sql语句。简单来说,就是对 SQL 语句执行过程的监控。我们一般用来做两件事情:
- 打印完整的sql语句
- sql语句的耗时
官网地址:p6spy.readthedocs.io/en/latest/
抛出问题
首先来看一下 Mybaties-plus 的默认输出:
==> Preparing: SELECT user_id,dept_id,user_name,nick_name,email,phonenumber,sex,avatar,password,status,del_flag,create_time,create_by,update_time,update_by FROM sys_user WHERE del_flag=0 AND (user_id = ? AND user_name LIKE ?)
==> Parameters: 4(Long), %马%(String)
我们期望的是打印出一条完整的 sql 语句,甚至还想要看到每条 sql 语句的总耗时。这个时候,p6spy 就发挥出它的作用了。
集成P6Spy
参照gitee.com/mayuanfei/S…下的springboot04项目创建springboot05项目。然后在其基础上进行修改。
1. SpringBoot三板斧之加入依赖
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
2. 修改数据库链接配置
- 替换你的JDBC Driver为com.p6spy.engine.spy.P6SpyDriver;
- 修改JDBC Url为jdbc:p6spy:xxxx。
application-dev中的配置修改前:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://101.43.67.114:3306/springboot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 23456
修改后:
3. 添加配置文件 spy.properties
在resources目录下创建spy.properties属性文件,内容如下:
# P6Spy的配置
# 应用的拦截模块
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
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动 可多个
driverlist=com.mysql.cj.jdbc.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
# 是否过滤 Log
filter=true
# 过滤 Log 时所排除的 sql 关键字,以逗号分隔
exclude=select 1 from dual
4. 执行上节中的测试
@Test
public void testSelect() {
List<SysUser> users = new LambdaQueryChainWrapper<>(this.sysUserMapper)
.eq(SysUser::getUserId, 4L)
.like(SysUser::getUserName, "马")
.list();
Console.log("users -> {}", users);
}
这里能看到执行用时和具体的sql语句如下:
Consume Time:29 ms 2023-05-24 15:34:44
Execute SQL:SELECT user_id,dept_id,user_name,nick_name,email,phonenumber,sex,avatar,password,status,del_flag,create_time,create_by,update_time,update_by FROM sys_user WHERE del_flag=0 AND (user_id = 4 AND user_name LIKE '%马%')
代码地址
gitee.com/mayuanfei/S…下的springboot05
记忆印记
- p6spy能打印出完成的sql
- p6spy能打印出sql运行的用时