一、动态SQL
(一)、if
if经常用在动态拼接查询SQL的动态条件,新增或修改的SQL的只新增或修改不为空的属性。
<if test="表达式"> SQL语句 </if>
(二)、where
where 元素只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也会合理处理
<where>
<if></if>
<if></if>
...
</where>
where+if
(三)、choose, when, otherwise
有些时候,我们不想用到所有的条件语句,而只想从中择其一。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句/if...else if...else。
<choose>
<when test="表达式">
SQL语句
</when>
<when test="表达式">
SQL语句
</when>
<otherwise>
SQL语句
</otherwise>
</choose>
where + choose, when, otherwise 搭配使用
(四)、trim
trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
| 属性 | 描述 |
| --------------- | ------------------------------------------------------------ |
| prefix | 给sql语句拼接的前缀 |
| suffix | 给sql语句拼接的后缀 |
| prefixOverrides | 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND" |
| suffixOverrides | 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定 |
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if></if>
<if></if>
</trim>
(五)、set
当在 update 语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。
<set>
<if></if>
<if></if>
...
</set>
(六)、foreach
动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。
<!--
collection:用于获取接口的参数名(需要@Param), item:迭代项, index:索引
open:开始符号 close:结束符号 separator:分割符
-->
<foreach collection="ids" item="item" index="index"
open="(" separator="," close=")">
</foreach>
二、多表关系映射
(一)、关联 user(多) -- role
关联处理“有一个”类型的关系。主要用在"多对一"或"一对一"的关系中,取出"一"
<association></association>
property 类中指向"一"的属性;
javaType 指定property指定属性的类型
column 指定关联的列名,外键
select 指定查询关联的"一"的sql语句的id
(二)、集合
主要用在一对多的关系中,取出"多"
<collection></collection>
property 类中指向"多"的属性;
javaType 指定property指定属性的类型(java.util.ArrayList)
column 指定关联的列名
select 指定查询关联的"多"的sql语句的id