前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【框架】117:mybatis之动态sql

【框架】117:mybatis之动态sql

作者头像
刘小爱
发布2020-08-11 15:26:57
6620
发布2020-08-11 15:26:57
举报
文章被收录于专栏:零基础自学Java零基础自学Java

今天是刘小爱自学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对应的数据。

最后

谢谢你的观看。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 刘小爱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、动态sql之if语句
  • 二、动态sql之choose when otherwise语句
  • 三、动态sql之where语句
  • 四、动态sql之set语句
  • 五、动态sql之foreach语句
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档