SQL 拼接语句输出_mybatis框架之动态sql的详细说明

本文详细介绍了MyBatis框架中的动态SQL特性,包括if、choose、where、set及foreach等标签的应用场景与实例测试。

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

今天是刘小爱自学Java的第117天。

感谢你的观看,谢谢你。

f1d72ba313d42b38e9902770da5a5c1d.png

主要就学了一个内容,动态sql的使用,它是mybatis框架中非常强大的一个特性。

其中一共有5种标签:

  • if语句
  • choose when otherwise语句
  • where语句
  • set语句
  • foreach语句

这些标签的使用可以在sql语句中做出判断,如果用Java代码编写,用对应语句判断亦可。

而动态sql的好处在于:在Java代码中就不需要考虑sql语句相关的业务逻辑了。

一、动态sql之if语句

案例:查询男性用户,如果输入了用户名,按用户名模糊查询。

4de43518dff609b1e20097979f14ad32.png

①案例说明

如果有用户名,按照该用户名模糊查询,查询满足条件的男性用户。

如果没有用户名,查询表中的男性用户。

②动态sql的编写

if标签用以判断用户名是否为空:

  • 如果不为空并且不是空字符串,将模糊查询语句拼接到sql中。
  • 反之,只需要执行查询男性用户语句。

值得注意的是:

模糊查询%与username值之间要有空格,上述我写的就没有加空格,导致没法正常查询。

代码写完,做一个测试:

57314c5ed8d4ae6e0ebc61cc39408b0a.png

③测试一:用户名为liuxiaoai

根据if标签判断,模糊查询出用户名为liuxiaoai的所有男性用户,liuxiaoai2也满足要求。

④测试二:用户名为null

用户名为空,那么模糊查询语句不执行,查询出所有的男性用户。

关于测试结果,因为很长一条,我就没有全部截图,大致知道是个什么结果就行。

二、动态sql之choose when otherwise语句

案例:查询男性用户,如果输入了用户名则按照用户名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找用户名为“liuxiaoai”的用户。

0c3e46cc427c81396bedab3875cc08dd.png

①案例分析

  • 如果用户名不为空,就拼接根据用户名模糊查询语句。
  • 如果上述条件不满足,年龄不为空则拼接根据年龄查询语句。
  • 如果上述条件都不满足,就拼接用户名为“liuxiaoai”的查询语句。

②动态sql的编写

when就相当于Java中if……else if语句,othewise就相当于最后的else语句。

值得注意的是:

如果前面when标签中的条件满足了,后面when标签中的条件即使满足也不会执行。

代码编写完毕,做一个测试:

e4ce8a6eaffc7d65cb12405c59990ce2.png

③测试一:所有条件都满足

用户名和年龄都不为空,但是只执行前面条件里的语句,后面条件即使满足也无效。

④测试二:所有条件都不满足

如果条件都不满足,则执行otherwise中的内容,也就是查询用户名为liuxiaoai的数据。

三、动态sql之where语句

案例:查询所有用户,如果输入了用户名按照用户名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立。

2827a6ebc42899458d7768ff2b09c5e2.png

①案例分析

where-if标签和上面的when的不同在于:

  • where-if是只要满足条件就执行。
  • when是只执行最先满足的。

②动态sql的编写

如果用户名不为空,则拼接模糊查询语句。

如果年龄不为空,则拼接根据年龄查询语句。

代码编写完毕,做一个测试:

3a516a84fe16285a95b7e48e010f938f.png

③测试方法一:前面的条件满足

模糊查询出对应的语句,一共有两条。

④测试方法二:所有的条件满足

在前面条件满足的基础上,再次做出筛选,筛选出年龄满足条件的语句,就只有1条了。

四、动态sql之set语句

案例:修改用户信息,如果参数user中的某个属性为null,则不修改。

我们如果使用常规的修改属性方法:

8547cd6fe6bf909f12606be07052c5f8.png

该方法就有一个问题,我们传递的参数user中,只设置了username属性,其它都为空。

这样的话,数据库中其它属性也变成null了。

如何有选择性的修改?

比如在参数user中只设置了username,那么只修改数据库中对应的属性,其它都不修改。

这就需要使用到set语句了。

9481ca42fd492ab99df921c2890b4c89.png

①案例分析

普通修改等于是将user中的每一个属性都做出了修改,所以为null的属性也就修改成了null。

要解决这个问题,动态拼接sql时判断即可。

②动态sql的编写

在set标签中,使用if语句优先做一个判断,如果不为空,才完成sql拼接,才修改属性。

代码编写完毕,做一个测试:

ee06b86cf768d11e5affd22678bdf8f9.png

使用set-if标签,修改数据时就会发现只修改参数中不为空的属性了,其它属性不变。

五、动态sql之foreach语句

案例:根据多个id查询对应的用户

ee06b86cf768d11e5affd22678bdf8f9.png

①案例分析

根据多个id查询时,在sql语句中是使用in这个关键字来完成查询。

参数为一个数组时,需要将其遍历。

②动态sql的编写

使用foreach标签完成遍历,和增强for类似:

  • collection:指的需要遍历的集合。
  • item:指的就是每次遍历的具体值。
  • separator:指的就是in(1,2,3)中的逗号。
  • open:指的就是in中左边的括号。
  • close:指的就是in中右边的括号。

注意:

关于username这个属性,教程里都是userName这样写的,驼峰命名规则。

不过我个人不习惯,我觉得username本身就可以作为一个单词,不用再驼峰命名了。

当然我这边也没有修改实体类中的属性。

前面用的也都是username,随着自己的喜好来。反正自己大致知道怎么回事就好了。

代码编写完毕,做一个测试:

9db635bfccd6345c4b179b1e2cdef6dd.png

③测试数据

参数为一个long数组,对应多个id,查询出多条id对应的数据。

最后

谢谢你的观看。

如果可以的话,麻烦帮忙点个赞,谢谢你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值