动态SQL一直是MyBatis最强大的功能之一。我们以前在使用JDBC的时候,经常要留意一个sql语句中的空格或者逗号,如果缺少空格或逗号,编译器就会出错,这有时候会让我们觉得很痛苦。然而,MyBatis的动态SQL可以帮我们解决这一类问题。
一、if和where
我们可以像这样使用if和where标签(在Mapper.xml文件中):
在使用<if>标签时,当test属性的值满足条件时,才会执行标签内的内容。
在使用<where>标签,where 元素知道只有在一个以上的if条件有值的情况下才去插入"WHERE"子句。而且,若最后的内容是"AND"或"OR"开头的,where 元素也知道如何将他们去除。
OrderQueryVo是包装类,将Order和OrderDetail类包装成一个类。代码如下:
二、foreach
有时候我们希望查询语句是这样select id,user_id,number,createtime,note from orders where id in (1,2)
这时候需要用到<foreach>
标签。
修改OrderQueryVo包装类代码,如下:
我们可这么使用(在OrderMapper.xml文件中):
三、choose(when ,otherwise)
有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
可以这么使用(在OrderMapper.xml文件中):
四、sql片段
通过sql片段可以将通用的sql语句抽取出来,单独定义,在其它的statement中可以引用sql片段。其中通用的sql语句,一般用在:where条件、查询列。
4.1 定义sql片段
在OrderMapper.xml文件中 定义sql片段,如下:
4.2 使用sql片段
使用<include>
标签对上面定义的sql片段加以引用,如下: