【MyBatis】深入解析 MyBatis:使用 if 标签动态拼接 SQL 语句中多个 where 条件的方法(添加条件 “1=1“、使用 where 标签)和 where 标签的作用及使用方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


动态 SQL


<where> 标签


看下面这个场景,系统会根据我们的筛选条件,动态组装 where 条件

image-20250403132343830


这种如何实现呢?

接下来我们看代码实现:

需求:传入的用户对象,根据属性做where条件查询,用户对象中属性不为 null 的,都为查询条件。如 username 为 “a”,则查询条件为 where username=“a”


一次性选择所有 where 条件


原有SQL:

image-20250405184132864


接口定义Mapper.xml实现

image-20250405184416126


修改为动态参数:

image-20250405184600883


单元测试

image-20250405184925093


运行对应测试类方法,观察打印日志:

image-20250405184958610


动态拼接 where 条件


上面的操作是把 where 条件对应的参数一次性都传给接口;

如果我们想像淘宝下面,选一个选项,就出现符合条件的记录,再选一个选项,就根据刚刚的记录做进一步筛选;这样动态的拼接 where 条件,该如何操作呢?

image-20250403132343830


如果是动态拼接 SQL 中的条件,我们可以考虑 <where><if>配合使用:

image-20250405185645512


当然,上面还是会存在一个 Bug 的,就是当我们没有给 age 属性传参时,会出现 SQL 拼接错误:

image-20250405185816072


执行对应测试类方法,观察打印日志:

image-20250405185924280


解决动态拼接 SQL出现的 bug


使用<trim> 标签去掉前缀“AND”


这时候,我们就需要结合<trim prefixOverrides="and">操作,来完成正确的 SQL 拼接:

image-20250405190108949


执行对应测试类方法,观察打印日志,可以发现,程序运行成功:

image-20250405190157110


这时候还存在一个 bug,就是我们什么参数都不传,对应用户筛选条件一个不选就直接查询的情况:

image-20250405190349795


执行对应测试类方法,观察打印日志:

image-20250405190507676


方案一:添加查询条件“1=1”


当查询条件为空时,会多余 where 关键字,如果我们以去除 where 为思路来修改代码,使用<trim>标签是无法解决的,我们需要另外再想别的解决方案;

这时候,我们以另一种思路来解决这个问题,也就是多添加一个查询条件:

image-20250405191030968


image-20250405191259627


image-20250405191405902


重新运行对应测试类方法,观察打印日志:

image-20250405191446567


接下来,我们要对参数不同属性分别传参,测试八种不同参数组合,来测试我们的动态 SQL 是否正确,结果都是通过的:

image-20250405191614529


方案二:使用<where>标签代替 where 关键字


image-20250405193310237


这时候,我们去掉 where 关键字和 <trim>标签,使用 <where>标签包裹拼接的 SQL 条件:

image-20250405193501558

<where> 只会在子元素有内容的情况下才插入 where 关键字,而且会自动去除子句的开头的AND或 OR


重新运行对应测试类,观察打印日志,发现程序运行成功:

image-20250405193621173


我们还要测试八种排列组合下,是否都能运行成功,本文不再演示:

image-20250405194226572


重新运行对应测试类,观察打印日志,发现程序运行成功:

image-20250405194314850


  • <where> 只会在子元素有内容的情况下才插入 where 子句,而且会自动去除子句的开头的AND或 OR
  • 以上标签也可以使用 <trim prefix="where" prefixOverrides="and"> 替换,但是此种情况下,当子元素都没有内容时,where关键字也会保留

或者使用注解方式:

image-20250403132532109


在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值