MyBatis动态SQL

MyBatis的强大特性之一便是他的动态SQL。我们应该体会过在使用JDBC或其他类似框架的时候,根据不同条件拼接SQL语句有多么的痛苦,拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。而使用动态SQL这一特性可以彻底的摆脱这种痛苦。

MyBatis的动态SQL语句主要有以下几类:

  • if语句(简单的条件判断)

  • choose(when,otherwize),相当于java语言中的switch,与jstl中的choose很类似。

  • trim(对包含的内容加上prefix,或者suffix等,前缀,后缀)

  • where(主要是用来简化sql语句中where条件判断的,能智能的处理and or,不必担心多余导致语法错误)

  • set(主要用于更新时)

  • foreach(在实现mybatis in 语句查询时特别有用)

举例子

1.if语句

数据库映射文件(数据库对应的pojo表的mapper.xml文件中)

MyBatis动态SQL

测试:

MyBatis动态SQL

2.choose语句

有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。

​choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

MyBatis动态SQL

MyBatis动态SQL

3.foreach语句

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。

- ​    item表示集合中每一个元素进行迭代时的别名,

- ​    index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

- ​    open表示该语句以什么开始,

- ​    separator表示在每次进行迭代之间以什么符号作为分隔 符,

- ​    close表示以什么结束。

MyBatis动态SQL

MyBatis动态SQL

4.set语句

当 update 语句中没有使用 if 标签签时,如果有一个参数为 null,都会导致错误。 当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。如下示例:

MyBatis动态SQL

MyBatis动态SQL

5.trim语句

trim 是更灵活用来去处多余关键字的标签,它可以用来实现 where 和 set 的效果。

MyBatis动态SQL

MyBatis动态SQL

SQL片段的使用(减少代码):

MyBatis动态SQL

MyBatis动态SQL

MyBatis动态SQL