使用传统的JDBC方法时,拼接SQL语句是个头疼的事,一不留神就少个空格多个逗号出错了。 Mybatis的动态SQL解决了这一痛点,通过几个标签便可灵活地组成SQL语句了。 和动态SQL有关的标签有:
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
下面逐一介绍。
条件判断 if
还是用前面的例子来演示。现在有个场景,要根据age来查找男性user记录,但age有可能不传。
1 |
|
在这里用到了 <if/>
标签,如果age不为null,才会进行拼接。
但是,这里有个问题,如果age为null,岂不是多出个AND?
当然,可以把固定的条件放到前面,把 AND / OR 这类关键字放到后面可选的条件中。不过Mybatis还提供了更灵活的方式。
动态的where
根据上面提出的问题,可以将SQL语句改成这样:
1 |
|
<where/>
标签只有里面有条件语句时,才会拼接 WHERE,并且若第一个条件是 AND 或 OR 开头,会自动将其去除。
<where/>
标签能做的,<trim/>
标签也可以,甚至可以做得更灵活。下面是上面 where 的 trim 实现方式:
1 |
|
与<where/>
相似的动态SQL还有<set/>
动态的set
和<where/>
类似的,<set/>
处理的UPDATE语句中的拼接问题:
1 |
|
和<where/>
不同的是,<set/>
会把最后的逗号给去掉。与之等效的<trim/>
是:
1 |
|
循环语句 foreach
<foreach/>
标签用来遍历一个集合,通常是用来构建IN条件语句的:
1 |
|
1 |
|
其中 collection 属性可选的值是:
- List 为 list;
- 数组为 array;
- 可用@Param 注解自定义变量名。
若为数组或List,则index为其索引;若为Map,则为key。
多重选择 choose
类似java的switch,动态SQL <choose/>
可以实现多重选择:
1 |
|
–END–