无论使用原生JDBC、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的,不便于分析,显示如下的效果:
googlecode Log4jdbc 是一个开源 SQL 日志组件,它使用代理模式实现对常用的 JDBC Driver( Oracle , Derby , MySQL , PostgreSQL , H2 ,等)操作的拦截,记录真实 SQL ,可以将占位符与参数全部合并在一起显示,方便直接拷贝 SQL 在 MySQL 等客户端直接执行,加快调试速度,还有个类似功能的组件bgee.log4jdbc-log4j2。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.googlecode.log4jdbc</groupId>
<artifactId>log4jdbc</artifactId>
<scope>runtime</scope>
<version>1.2</version>
</dependency>
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# driver-class-name: com.mysql.cj.jdbc.Driver
driver-class-name: net.sf.log4jdbc.DriverSpy
username: root
password: 123456
# url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
url: jdbc:log4jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
hikari:
minimum-idle: 1
maximum-pool-size: 5
auto-commit: true
read-only: false
connection-init-sql: SELECT 1 FROM DUAL
connection-test-query: SELECT 1 FROM DUAL
pool-name: HikariCP
idle-timeout: 30000
connection-timeout: 30000
max-lifetime: 300000
min-idle: 2
# 关闭自动加载受欢迎驱动
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
#毫秒值.执行时间超过该值的SQL语句将被记录为error级别
log4jdbc.sqltiming.error.threshold=3000
#毫秒值.执行时间超过该值的SQL语句将被记录为warn级别
log4jdbc.sqltiming.warn.threshold=2000
#修剪已记录的SOL
log4jdbc.trim.sql=true
更多配置可以观察源码