mybatisplus的querywrapper如何打印sql构造语句
时间: 2025-08-01 17:36:47 浏览: 10
<think>我们参考引用内容,特别是引用[1]中提到了p6spy的sql日志打印配置,以及引用[3]中提到了日志配置。用户的需求是:在使用MyBatisPlus的QueryWrapper时,打印生成的SQL构造语句。解决方案通常有两种:1.使用MyBatis自带的日志框架配置,将指定mapper接口或命名空间的日志级别设置为DEBUG。2.使用第三方SQL打印工具,如p6spy(可以打印出完整的SQL语句,包括参数替换后的语句),这在引用[1]中有所体现。下面分别说明两种方法:方法一:配置MyBatisPlus的日志(使用标准日志实现,如SLF4J+Logback)在application.yml(或application.properties)中配置日志级别,例如:```yamlmybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl#直接使用控制台输出日志(简单,但不够灵活)或者使用Logback,配置某个mapper包下的日志级别为DEBUG:logging:level:com.example.mapper:debug#将com.example.mapper替换为你的Mapper接口所在包```但是,这样打印的SQL是带占位符的,参数用?代替,同时会打印参数列表。方法二:使用p6spy(推荐,因为可以打印出完整的SQL语句)步骤:1.引入p6spy依赖(注意版本兼容性)2.修改数据库连接配置,将原来的驱动替换为p6spy的驱动,并在url前加上`jdbc:p6spy:`3.添加spy.properties配置文件具体步骤参考引用[1]:1.pom.xml添加依赖:```xml<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version><!--请使用最新版本--></dependency>```2.修改application.yml中的数据库连接配置:将原来的url前面加上`jdbc:p6spy:`,并将驱动改为`com.p6spy.engine.spy.P6SpyDriver`例如:```yamlspring:datasource:url:jdbc:p6spy:mysql://localhost:3306/test?useSSL=falsedriver-class-name:com.p6spy.engine.spy.P6SpyDriverusername:rootpassword:root```3.在resources目录下添加spy.properties文件,内容如下(参考引用[1]):```properties#指定日志模块module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory#自定义日志打印格式(这里使用了MyBatisPlus提供的格式)logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger#日志输出到控制台appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger#是否使用日志系统记录sql(如果使用上面的StdoutLogger,则输出到控制台;如果想用slf4j,则用下面的appender并注释掉上面的)#appender=com.p6spy.engine.spy.appender.Slf4JLogger#取消JDBCURL前缀useprefix=true#设置p6spy驱动代理deregisterdrivers=true#配置记录Log例外(排除一些类别,避免过多日志)excludecategories=info,debug,result,batch,resultset#日期格式dateformat=yyyy-MM-ddHH:mm:ss#是否开启慢SQL记录outagedetection=true#慢SQL记录标准(单位秒)outagedetectioninterval=2```这样配置后,运行程序时就会在控制台打印出完整的SQL语句(包括参数已替换进去的语句)。另外,引用[3]中也提到了MybatisPlus的自动填充和日志配置,但关于日志配置部分,引用[3]没有给出具体配置,所以我们主要参考引用[1]。注意:如果使用p6spy,可能会对性能有轻微影响,但在开发环境使用非常方便。因此,用户可以根据需要选择其中一种方法。通常开发环境使用p6spy,生产环境则关闭。相关问题:1.如何在MyBatisPlus中配置多数据源并打印SQL日志?2.MyBatisPlus的QueryWrapper有哪些常用的条件构造方法?3.如何优化MyBatisPlus的SQL打印性能?</think>### MyBatisPlus QueryWrapper 打印 SQL 构造语句配置指南
在 MyBatisPlus 中打印 QueryWrapper 生成的 SQL 语句有两种主流方式:
#### ✅ 方法一:配置日志框架(推荐)
1. **修改日志级别**
在 `application.yml` 中配置 mapper 包路径的日志级别为 `DEBUG`:
```yaml
logging:
level:
com.yourpackage.mapper: debug # 替换为实际Mapper路径
```
2. **查看控制台输出**
执行查询时,控制台会显示带占位符的 SQL 和参数列表:
```sql
==> Preparing: SELECT id,name FROM user WHERE (age > ?)
==> Parameters: 20(Integer)
```
#### ✅ 方法二:使用 P6Spy(完整SQL打印)
1. **添加依赖**(pom.xml)
```xml
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
```
2. **修改数据源配置**
```yaml
spring:
datasource:
url: jdbc:p6spy:mysql://localhost:3306/test # 添加p6spy前缀
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
```
3. **创建 spy.properties**(resources目录)
```properties
module.log=com.p6spy.engine.logging.P6LogFactory
appender=com.p6spy.engine.spy.appender.StdoutLogger
logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
deregisterdrivers=true
useprefix=true
```
4. **输出示例**
```sql
P6Spy: SELECT id,name FROM user WHERE age > 20
```
#### 💡 对比说明
| **方式** | **优点** | **缺点** |
|----------|----------|----------|
| 日志框架 | 无需额外依赖,原生支持 | 输出带占位符(?) |
| P6Spy | 显示完整可执行SQL | 需修改数据源配置 |
> ⚠️ **生产环境建议**:使用日志框架方案,避免 P6Spy 的性能损耗[^1]。
#### 测试示例代码
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20).select("id", "name");
userMapper.selectList(wrapper); // 执行此语句触发SQL打印
```
### 相关问题
1. MyBatisPlus 多数据源配置下如何分别控制 SQL 日志输出?
2. 如何优化 P6Spy 在性能敏感场景的 SQL 监控?
3. QueryWrapper 的 `like` 条件生成的 SQL 在日志中显示异常如何处理?
[^1]: 引用自 SQL 日志打印配置方案
[^2]: QueryWrapper 条件构造器文档参考
[^3]: MybatisPlus 日志配置基础说明
阅读全文
相关推荐




















