今天是刘小爱自学Java的第117天。
感谢你的观看,谢谢你。
主要就学了一个内容,动态sql的使用,它是mybatis框架中非常强大的一个特性。
其中一共有5种标签:
- if语句
- choose when otherwise语句
- where语句
- set语句
- foreach语句
这些标签的使用可以在sql语句中做出判断,如果用Java代码编写,用对应语句判断亦可。
而动态sql的好处在于:在Java代码中就不需要考虑sql语句相关的业务逻辑了。
一、动态sql之if语句
案例:查询男性用户,如果输入了用户名,按用户名模糊查询。
①案例说明
如果有用户名,按照该用户名模糊查询,查询满足条件的男性用户。
如果没有用户名,查询表中的男性用户。
②动态sql的编写
if标签用以判断用户名是否为空:
- 如果不为空并且不是空字符串,将模糊查询语句拼接到sql中。
- 反之,只需要执行查询男性用户语句。
值得注意的是:
模糊查询%与username值之间要有空格,上述我写的就没有加空格,导致没法正常查询。
代码写完,做一个测试:
③测试一:用户名为liuxiaoai
根据if标签判断,模糊查询出用户名为liuxiaoai的所有男性用户,liuxiaoai2也满足要求。
④测试二:用户名为null
用户名为空,那么模糊查询语句不执行,查询出所有的男性用户。
关于测试结果,因为很长一条,我就没有全部截图,大致知道是个什么结果就行。
二、动态sql之choose when otherwise语句
案例:查询男性用户,如果输入了用户名则按照用户名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找用户名为“liuxiaoai”的用户。
①案例分析
- 如果用户名不为空,就拼接根据用户名模糊查询语句。
- 如果上述条件不满足,年龄不为空则拼接根据年龄查询语句。
- 如果上述条件都不满足,就拼接用户名为“liuxiaoai”的查询语句。
②动态sql的编写
when就相当于Java中if……else if语句,othewise就相当于最后的else语句。
值得注意的是:
如果前面when标签中的条件满足了,后面when标签中的条件即使满足也不会执行。
代码编写完毕,做一个测试:
③测试一:所有条件都满足
用户名和年龄都不为空,但是只执行前面条件里的语句,后面条件即使满足也无效。
④测试二:所有条件都不满足
如果条件都不满足,则执行otherwise中的内容,也就是查询用户名为liuxiaoai的数据。
三、动态sql之where语句
案例:查询所有用户,如果输入了用户名按照用户名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立。
①案例分析
where-if标签和上面的when的不同在于:
- where-if是只要满足条件就执行。
- when是只执行最先满足的。
②动态sql的编写
如果用户名不为空,则拼接模糊查询语句。
如果年龄不为空,则拼接根据年龄查询语句。
代码编写完毕,做一个测试:
③测试方法一:前面的条件满足
模糊查询出对应的语句,一共有两条。
④测试方法二:所有的条件满足
在前面条件满足的基础上,再次做出筛选,筛选出年龄满足条件的语句,就只有1条了。
四、动态sql之set语句
案例:修改用户信息,如果参数user中的某个属性为null,则不修改。
我们如果使用常规的修改属性方法:
该方法就有一个问题,我们传递的参数user中,只设置了username属性,其它都为空。
这样的话,数据库中其它属性也变成null了。
如何有选择性的修改?
比如在参数user中只设置了username,那么只修改数据库中对应的属性,其它都不修改。
这就需要使用到set语句了。
①案例分析
普通修改等于是将user中的每一个属性都做出了修改,所以为null的属性也就修改成了null。
要解决这个问题,动态拼接sql时判断即可。
②动态sql的编写
在set标签中,使用if语句优先做一个判断,如果不为空,才完成sql拼接,才修改属性。
代码编写完毕,做一个测试:
使用set-if标签,修改数据时就会发现只修改参数中不为空的属性了,其它属性不变。
五、动态sql之foreach语句
案例:根据多个id查询对应的用户
①案例分析
根据多个id查询时,在sql语句中是使用in这个关键字来完成查询。
参数为一个数组时,需要将其遍历。
②动态sql的编写
使用foreach标签完成遍历,和增强for类似:
- collection:指的需要遍历的集合。
- item:指的就是每次遍历的具体值。
- separator:指的就是in(1,2,3)中的逗号。
- open:指的就是in中左边的括号。
- close:指的就是in中右边的括号。
注意:
关于username这个属性,教程里都是userName这样写的,驼峰命名规则。
不过我个人不习惯,我觉得username本身就可以作为一个单词,不用再驼峰命名了。
当然我这边也没有修改实体类中的属性。
前面用的也都是username,随着自己的喜好来。反正自己大致知道怎么回事就好了。
代码编写完毕,做一个测试:
③测试数据
参数为一个long数组,对应多个id,查询出多条id对应的数据。
最后
谢谢你的观看。
如果可以的话,麻烦帮忙点个赞,谢谢你。