Mybatisplus 自定义sql 使用条件构造器作为参数 两种方式

本文介绍如何在MyBatis Plus中使用自定义SQL段落和@Param注解,通过Java接口和XML映射文件实现动态SQL查询。讨论了注解和XML两种方式的实现细节及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.注解

只需添加  ${ew.customSqlSegment}和@Param(Constants.WRAPPER)即可

@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);

2.xml--重点

(1)mapper.java定义接口

public List<User> getUserHasRole(@Param(Constants.WRAPPER) QueryWrapper wrapper);

(2)mapper.xml定义SQL

<select id="getUserHasRole" resultType="czc.superzig.modular.system.model.User">
        select * FROM sys_user <where>${ew.sqlSegment}</where>
</select>

注意:

  • 上面xml方式测试有效
  • 有的说*可以替换为${ew.SqlSelect} (没有测试)
  • 上面<select>标签中不能加parameterType参数,会报错
  • 测试时不加<where>标签会报错,按注解方式来看可以不加,但是报错
<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.如何优化MyBatisPlusSQL打印性能?</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 日志配置基础说明
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值