当前位置: 首页 > news >正文

condition参数

condition参数

  • condition是什么
  • 为什么需要condition参数
  • condition参数的重载方法设计
  • condition的典型使用场景与示例

condition是什么

condition 是 MyBatis-Plus 核心组件 Wrapper 体系中所有条件构建方法的可选布尔型入参,也是实现条件动态生效的核心控制开关,用于决定当前条件是否被解析并加入最终 SQL。

为什么需要condition参数

在基于 MyBatis 的持久层开发过程中,动态组装 SQL 条件是高频场景,前端传入的查询、更新等动态条件往往具备可选性,若直接无条件拼接所有条件至 SQL 语句中,会因参数为空值引发 SQL 语法规范的语法错误或逻辑错误。
为解决动态条件组装问题,传统 MyBatis 需在 XML 映射文件或注解中通过<if>标签嵌套实现条件判断,该方式不仅导致代码冗余、维护成本高,还将动态条件逻辑分散在 SQL 层与 Java 业务层,不符合分层设计原则。
而 MyBatis-Plus 的核心组件 Wrapper 条件构造器体系中设计了 condition 核心可选布尔型入参,该参数可直接在 Java 代码层通过布尔值精准控制单个条件方法是否被解析并加入最终生成的 SQL 语句中。当 condition 为 true 时,对应条件会被拼接至 SQL 的 WHERE/SET 子句,当 condition 为 false 时,该条件会被直接忽略。这一机制既规避了 SQL 语法和逻辑错误,又将动态条件控制逻辑统一体现至 Java 代码层,大幅简化动态 SQL 开发流程,提升代码可维护性与分层合理性。

condition参数的重载方法设计

condition 参数的重载方法设计是 MyBatis-Plus 为兼顾默认生效和动态控制、以及适配多场景而制定的分层重载策略,核心围绕是否携带 condition 参数构建两类重载分支,同时让所有条件方法遵循统一的重载规则,兼顾易用性、扩展性与 API 一致性。

MyBatis-Plus 为所有核心条件构造方法统一设计了两类重载形式,且该设计覆盖普通构造器(QueryWrapper/UpdateWrapper)和 Lambda 构造器(LambdaQueryWrapper/LambdaUpdateWrapper):

  • 无 condition 参数的重载版本:方法仅接收列名(普通构造器)/ Lambda 列引用(Lambda 构造器)和值,默认内置 condition = true,调用后条件必然被解析并加入 SQL,适用于必选条件场景;
  • 带 condition 参数的重载版本:在无 condition 版本基础上新增布尔型 condition 入参,条件是否被解析、加入 SQL 由该参数的布尔值决定,适用于可选 / 动态条件场景。

condition的典型使用场景与示例

情况1:动态条件查询的基础实现方式

@Testpublicvoidtest12(){Stringname=null;IntegerageBegin=10;IntegerageEnd=24;QueryWrapper<User>queryWrapper=newQueryWrapper<>();if(StringUtils.isNotBlank(name)){queryWrapper.like("name","a");}if(ageBegin!=null){queryWrapper.ge("age",ageBegin);}if(ageEnd!=null){queryWrapper.le("age",ageEnd);}List<User>users=userMapper.selectList(queryWrapper);users.forEach(System.out::println);}

这是动态条件查询的基础实现方式,通过 if 语句逐个判断参数有效性,仅当参数有效时,才调用 QueryWrapper 的条件方法拼接 WHERE 子句。

需要注意 StringUtils.isNotBlank 的导包:需确保导入的是 org.apache.commons.lang3.StringUtils(需引入 commons-lang3 依赖)或 org.springframework.util.StringUtils(Spring 项目自带),避免导包错误;以及需要注意的是条件连接符,MP 的 QueryWrapper 默认用 AND 连接多个条件,若需要 OR 逻辑需显式调用 or() 方法。

拼接的 sql 语句为:

SELECTid,name,age,emailFROMuserWHERE(age>=?ANDage<=?)

情况2:condition实现动态筛选条件

@Testpublicvoidtest12UseCondition(){Stringname=null;IntegerageBegin=10;IntegerageEnd=24;QueryWrapper<User>queryWrapper=newQueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(name),"name","a").ge(ageBegin!=null,"age",ageBegin).le(ageEnd!=null,"age",ageEnd);List<User>users=userMapper.selectList(queryWrapper);users.forEach(System.out::println);}

和情况1的区别是,情况2相当于将判断条件移至方法的第一个参数位置

基于动态参数(name 为空、ageBegin/ageEnd 有值)构建查询条件:
仅当 name 非空时,添加 name 模糊匹配 'a’的条件;
仅当 ageBegin 非空时,添加 age >= ageBegin 的条件;
仅当 ageEnd 非空时,添加 age <= ageEnd 的条件;

拼接的 sql 语句为:

SELECTid,name,age,emailFROMuserWHERE(age>=?ANDage<=?)

针对不同类型参数的 非null / 非空串 判断是 condition 最核心的使用场景:
字符串 非 null 且非空串:StringUtils.isNotBlank(str)
数值类型 非 null:num != null
集合 非 null 且非空:CollectionUtils.isNotEmpty(collection)

情况3:动态条件更新的基础实现方式

@Testpublicvoidtest13(){LonguserId=1L;Stringname=null;Integerage=25;Stringemail="new@123.com";UpdateWrapper<User>updateWrapper=newUpdateWrapper<>();updateWrapper.eq("id",userId);if(StringUtils.isNotBlank(name)){updateWrapper.set("name",name);}if(age!=null){updateWrapper.set("age",age);}if(StringUtils.isNotBlank(email)){updateWrapper.set("email",email);}userMapper.update(null,updateWrapper);}

这是动态条件更新的基础实现方式,通过 if 语句逐个判断参数有效性,仅当参数有效时,才调用 UpdateWrapper 的条件方法拼接 WHERE 子句。

组装的 sql 语句为:

UPDATEuserSETage=?,email=?WHERE(id=?)

情况4:condition实现动态更新

@Testpublicvoidtest13Update(){LonguserId=1L;Stringname=null;Integerage=25;Stringemail="new@123.com";UpdateWrapper<User>updateWrapper=newUpdateWrapper<>();updateWrapper.eq("id",userId).set(StringUtils.isNotBlank(name),"name",name).set(age!=null,"age",age).set(StringUtils.isNotBlank(email),"email",email);userMapper.update(null,updateWrapper);}

基于动态参数(name 为空、id、age、email 有值)构建动态更新条件:
指定更新 ID 为 1 的用户信息
仅当 name 非空时,更新其 name 字段;
仅当 age 非空时,更新其 age 字段;
仅当 email 非空时,更新其 email 字段;

组装的 sql 语句为:

UPDATEuserSETage=?,email=?WHERE(id=?)

情况5:多条件动态查询

@Testpublicvoidtest16(){Stringname="张";Integerage=25;LonguserId=1L;LambdaQueryWrapper<User>wrapper=newLambdaQueryWrapper<>();wrapper.and(w->w.gt(age!=null,User::getAge,age).like(StringUtils.isNotBlank(name),User::getName,name)).or(w->w.eq(userId!=null,User::getId,userId));List<User>users=userMapper.selectList(wrapper);users.forEach(System.out::println);}

查找年龄> 25 且姓名含张,或 ID=1 的用户

组装的 sql 语句为:

SELECTid,name,age,emailFROMuserWHERE((age>?ANDnameLIKE?)OR(id=?))
http://www.cnnetsun.cn/news/1346.html

相关文章:

  • 基于微信小程序的德育实践活动管理小程序设计与实现
  • 基于SpringBoot+Vue的护理知识在线咨询系统设计与实现
  • 基于Python+Django的社区警务信息管理系统设计与实现
  • esp32控制舵机
  • 手写 new:深入 JavaScript 对象创建机制,彻底搞懂 arguments 这个“伪装者”
  • 【计算机算法与设计(10)】习题:苹果买卖问题——分治法的经典应用
  • 【算法通关指南:算法基础篇(四)】二维差分专题:1.【模板】差分 2.地毯
  • 鸿蒙简易时钟应用
  • 大模型在手术操作后呼吸衰竭预测及围手术期方案制定中的应用研究
  • 大模型在金黄色葡萄球菌性败血症预测及围手术期管理中的应用研究
  • (附源码)基于Web的高校体育成绩管理系统设计与实现-计算机毕设 30378
  • android开发 拆分包APK的安装方式
  • Java Lambda stream reduce
  • Java入门篇,小白有任何不懂的,收藏这篇就够了
  • 对象失业半年多了,Java程序员,IT行业是不是再也找不到工作了
  • Java集合框架全面详解,从小白到精通,收藏这篇就够了
  • 探索Java设计模式:原理、应用与实践,小白到精通,收藏这篇就足够了
  • JavaWeb后端阶段项目,从小白到高级开发,收藏这篇就足够了
  • python运维自动化脚本案例,python自动化运维工具,收藏这篇就够了
  • kafka运维命令大全,零基础入门到精通,收藏这篇就够了
  • 运维简历包装,零基础入门到精通,收藏这篇就够了
  • 服务器SSH没有问题,但是VNC连接失败解决方法,收藏这篇就够了
  • 企业平台化运维能力养成记,零基础入门到精通,收藏这篇就够了
  • mysql日常运维与参数调优,零基础入门到精通,收藏这篇就够了
  • 43岁年纪的系统运维裁员后还能找到运维岗位吗?
  • 37岁前端被裁,深夜刷招聘软件的手都在抖
  • 【Paper2Slides】1:提示词分析:图片生成、内容规划、论文提取
  • 【Paper2Slides】2:图片生成工作逻辑
  • 能用自然语言透明地解释每一步的推理过程‌,彻底打破了传统AI的“黑盒”模式的围棋AI大模型:InternThinke
  • 32 FSMC