动态SQL是MyBatis的一个强大的特性。在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情,通常的解决方法是写很多if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字段的最后省略逗号。MyBatis使用一种强大的动态SQL语言来改善这种情形,动态SQL基于OGNL的表达式,可使我们方便的在SQL语句中实现某些逻辑。用于实现动态SQL元素如下:
if:利用if实现简单的条件选择。
choose(when,otherwise):相当于Java中的Switch语句,通常与when和otherwise搭配。
where:简化SQL语句中where条件判断。
set:解决动态更新的语句。
trim:可以灵活的去除多余的关键字。
foreach:迭代一个集合,通常用于in条件。
一:使用 if+where 是许多条件查询
1.if
根据业务需求,由于在查询的时候,用户并不一定的完整的输入所有的查询条件,因此使用动态SQL的if元素来实现多条件查询,具体事例如下:
动态的SQL语句,if来实现多条件查询,测试类代码如下
运行结果如下:
如果条件为空,则查询出全部数据。
2 where
where元素主要用来简化SQL语句中的where条件判断,并智能的处理and和or,不必担心多余关键字导致的语法错误,看如下示例:
测试类
查询出以BJ开头的供应商编号。
二 set 和trim动态实现更新的操作
在数据库中,修改需要 update set 语句,我们通过日志中的SQL语句和参数,我们发现未被设值的参数也进行了set操作。需要使用动态SQL中的set元素处理。
set元素主要应用于更新操作,它的主要功能和where元素差不多,主要是在包含的语句前输出一个set,若要包含的语句是以逗号结束的,会自动把该逗号省略掉,再配合if元素就可以动态的更新需要修改的字段,而不需要修改的字段,则可以不再被更新。
我们也可以使用trim元素来替代set元素,并实现与set一样的效果,示例如下:
测试类
结果:
当然还有数据库的数据看是否修改成功
三 使用foreach完成复杂查询
我们先了解一下foreach的基本用法和属性,foreach主要用在构建in条件中,它可以在SQL语句中迭代一个集合,它的属性有:
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名称,用于表示迭代过程中,每次迭代到的位置。
open:表示该语句以什么开始(既然是in条件语句,所以必然是以“(”开始)。
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是in条件语句,必然是以“,”作为分隔符)。
close:表示该语句以什么结束(既然是in条件语句,所以必然是以“)”结束)。
collection:最关键病最容易出错的属性,需要格外注意,该属性必须指定,不同情况下,该属性的值必须指定,不同情况下,该属性的的值是不一样的。主要有三种情况:
1:若入参为单参数且参数类型是一个List的时候,collection属性值为list。
2:若入参为单参数且参数类形式一个数组的时候,collection属性值为array(此处传入参数Integer[] 数组名 为数组类型 ,此处的collection 属性值设为“array”)。
3:若传入参数为多参数,就需要把它们封装成为一个Map进行处理。
select 中 返回的是一个resultMap,该resultMap也进行了相应的字段映射。
示例如下:
传参数类型为List,collection为了List,接口里定义的是:
测试类:
传入一个值,结果如下:
上面示例是入参为List的时候,下面给大家演示入参为Map的时候:
接口定义为:
测试类:
结果:
四 choose
对于某些查询需求,虽有多个查询条件,但是我们不想应用所有的条件,只想选择一种情况下的查询结果。其实和Java中Switch语句相似,MyBatis提供choose元素满足这种需求。
choose元素的作用相当于Java中的switch语句,基本上跟JSTL中choose的作用和用法是一样的,通常都是搭配when、otherwise使用。下面通过一个示例来演示说明其用法:
测试类
虽然写了四个条件,但满足第一个后就不执行下面的,如果前三个条件都不提供,默认执行最后一个条件
结果:
因为提供了第一个条件,所以就以第一个条件查出相关数据。
总结
MyBatis在SQL映射文件中可以使用灵活、智能的动态SQL来实现SQL映射。
1. if+set:完成更新操作。
2. if+where:完成多条件查询。
3. if+trim:完成多条件查询(替代where)或者更新操作 (替代 set)。
4. choose(when、otherwise):完成条件查询(多条件下,选择其一)。
5.foreach:完成复杂查询,主要用于in条件查询中,迭代集合。其中最关键的部分是collection属性,根据不同的入参类型,该属性值亦不同。