动态sql
Mybatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,
此时在前面的学习中我们的SQL就不能满足要求了。
而,我们使用动态sql可以使我们的sql语句有多种可能性,根据不同语句使用不同的语法。
动态sql之if
Mybatis的映射文件,可在sql语句中使用sql来根据当前情况来使用不同的语句:
下面是一个多条件聚合查询。向查询语句中传入一个类,可根据类的属性进行查询,当属性值为空,则跳过此属性,当属性值不为空,则合并此条件进行查询
这里,where标签相当于sql中的where字段。当所有的属性都为空,则在程序执行的时候,where不会在sql语句中出现,此时sql语句变为一个无条件全查询,会查询出表中的所有数据
测试:
结果:
动态sql之foreach
foreach:查询所有,符合给定条件中的任意一个条件的数据这里等同于select * from user where id in(值,值,值…)
这里foreach标签有几个属性,得说明一下:
collection:设置存储条件的容器类型。比如这里,我们打算是创建一个list集合,集合中存储多个Integer数据,然后查询表中所有id符合此list的记录。这里我们用的是list集合,所欲这里的值是list,如果是数组,则这里设置为array
这里foreach的原理好像是我们设置字符,然后由java帮我们拼接成sql语句的。
open:所以这里的open表示where后面紧跟着的固定的部分,我们这里仅仅是一个查询id的简单查询,所以设置为"id in("
close:即查询语句最后面固定那一部分,这里即是一个")"
item:这里等于设置一个变量,这里其实就有点像java中的foreach了,这里就意思是取出集合中的数据,然后放在这个变量中,供我们后面使用
separator:用于设置分隔符,因为远离好像是拼接的,所以这里,需要分隔符
然后在foreach标签中有一个#{i},此处就等于取出前面item中的数据,拼接在sql语句中。
SQL片段的抽取
映射文件中,我们可能有多个对同一数据表的不同操作,有些SQL语句前半部分都是重复的,我们则可以使用片段抽取。