P6Spy 是一个框架,它使数据库数据能够无缝地被拦截和记录,而无需对现有应用进程进行代码更改。但是这个框架并不适合在生产中使用,只适合在测试环境用来统计 sql 数据。不过在监控方面 Mybatis Plus 也推荐了这个框架作为监控 SQL 使用。
本文章也是基于 SpringBoot 2.6.x 、Mybatis Plus、p6spy 来实现简单的 sql 日志展示。首先通过 https://start.aliyun.com/ 构建一个SpringBoot 基础 web 项目然后添加 Mybatis Plus 和 p6spy 相关 POM坐标
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.github.gavlyukovskiy</groupId>
<artifactId>p6spy-spring-boot-starter</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
将项目中 application.properties 替换为 application.yml 。
server:
port: 9803
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
username: root
password: 123qwe.
url: jdbc:p6spy:mysql://localhost:23306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
#
decorator:
datasource:
p6spy:
logging: custom
log-format: executionTime:%(exectionTime) | sql:%(sqlSingleLine)
需要注意的是 driver-class-name
必须是 com.p6spy.engine.spy.P6SpyDriver
才可以,并且要在数据库链接加上 p6spy 标签才可以 jdbc:p6spy:mysql://...
下面的 decorator 配置是 p6spy 需要的配置直接抄就行了,如果需要增改配置自行查下手册。 在数据库中创建一个 test 库并执行下面的sql语句,随便添加几条数据就好。
CREATE TABLE `goods` (
`id` varchar(255) NOT NULL,
`title` varchar(255) DEFAULT NULL,
`price` decimal(10,2) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
因为要对接 Mybatis Plus 所以要让 p6spy 对接上才行,在项目的 resources 目录中添加一个 spy.properties 并粘贴下面的内容
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
useprefix=true
spy 配置文件中的 logMessageFormat 是日志的格式化配置,如果打开 P6SpyLogger.class 可以看到下面的内容
/**
* P6spy SQL 打印策略
*
* @author hubin
* @since 2019-02-20
*/
public class P6SpyLogger implements MessageFormattingStrategy {
@Override
public String formatMessage(int connectionId, String now, long elapsed, String category,
String prepared, String sql, String url) {
return StringUtils.isNotBlank(sql) ? " Consume Time:" + elapsed + " ms " + now +
"\n Execute SQL:" + sql.replaceAll("[\\s]+", " ") + "\n" : "";
}
}
这个就是简单的打印信息,如果想要自定义可以自行实现这个策略。我这里为了演示,所以直接使用 MybatisPlus 自己的了。 剩下的内容就是创建 Mapper 、Controller 、DTO 之类的了这里不在描述,自行实现即可。最后通过访问 Controller 获得的结果为。
Consume Time:2155 ms 1719802248036
Execute SQL:SELECT COUNT(*) AS total FROM goods
Consume Time:3 ms 1719802248059
Execute SQL:SELECT id,title,price,content FROM goods LIMIT 10
注:
[1] Mybatis Plus 日志:https://github.com/baomidou/mybatis-plus/releases?page=2
[2] p6spy 项目地址:https://github.com/p6spy/p6spy
评论区