本章介绍SQL的动态标签,常用的有三种类型,其他的都归在杂项
- 分支:if,[choose,when,otherwise。
- 循环:foreach。
- 格式:trim,where,set。
- 杂项:databaseId,bind。
1、分支
1.1 If
表格1- 1 if标签
名称 |
If |
描述 |
与编程语言中的单If语句相同。通常用于where条件,insert,update语句中列的判断。 |
属性 |
Test:指定分支的条件 |
格式 |
<if test=””>sql</if> |
示例 |
根据姓名模糊查询用户: <if test=”userName != null”> and user_name like concat("%",#{userName} ,"%") <if> |
1.2 choose,when,otherwise
表格1- 2 choose,when,otherwise
名称 |
Choose,when,otherwise |
描述 |
与编程语言中的if,elseif,else格式相同。含义稍微有些区别, l choose标签无任何意义。 l When标签对应if,每个test对应分支的条件,多个when之间并不存在if,elseif之间的关系。彼此都是独立的,相当于写了多个if。 l Otherwise标签与else格式含义相同,当上述中所有when的分支都不满足时,执行otherwise,并不对应具体的when分支。 |
属性 |
只有when标签存在test属性,与if标签的test属性含义相同,值为分支的条件。 |
格式 |
<choose> <!—1到多个when标签 --> <when test=””></when> <!—只能存在一个--> <otherwise></otherwise> </choose> |
2、循环
表格2- 1 foreach
名称 |
foreach |
描述 |
用于循环拼接SQL语句,常用于拼接in条件,批量插入的语句。在整个循环过程中,都是一条SQL语句。 |
属性 |
collection:指定集合的类型,值一般为list或map |
Open:在循环之前,添加一个前缀。 |
|
close:在循环结束之后,添加一个后缀 |
|
separator:每次循环结束之后,添加一个分隔符,例如insert中的逗号 |
|
Item:当collection表示list时,相当于定义一个临时变量,在标签内部使用此变量,当collection表示map时,临时变量的值为map每次循环的value值。 |
|
Index:当collection表示list时,值为数字,表示当前循环的索引值。当collection表示map时,值为字符串,表示当前map的key值。 |
|
格式 |
<foreach collection= "list" open= "(" close= ")" separator="," item=" " index=””> Sql片段 </foreach> |
示例 |
批量插入多个用户,为了简便只写了两个属性id,name,可以根据自身需求添加任何其他属性 <foreach collection= "list" open= "(" close= ")" separator="," item="user"> (#{user.id},#{user.name}) </foreach> |
3、格式
3.1 Trim
表格3- 1 trim标签
名称 |
trim |
描述 |
用于去掉SQL语句中多余的前缀和后缀,注意整个过程中,都是一条SQL语句。 |
属性 |
prefix:指定语句片段的前缀,例如拼接where条件时,WHERE作为前缀 |
prefixOverrides:去除多余的前缀,一般值都是 and | or,容易在拼接SQL语句时产生多余的and和or |
|
suffix:指定语句片段的后缀。 |
|
suffixOverrides:去除多余的后缀,一般都是逗号,在批量插入时,去除最后一个逗号。 |
|
格式 |
<trim prefix= "where" prefixOverrides=”” suffix=”” suffixOverrides=””> Sql片段 </trim> |
示例 |
等价<where> <trim prefix= "where" prefixOverrides=”and | or”> Sql片段 </trim> 等价<set> <trim prefix= "set" suffixOverriders=”,”> Sql片段 </trim> |
3.2 where
表格3- 2 where标签
名称 |
Where标签 |
描述 |
Where标签对应SQL片段中的where条件,包含在where标签内部的SQL片段会自动去除多余的and,or前缀 |
属性 |
无 |
格式 |
<where></where> |
3.3 Set
表格3- 3 set标签
名称 |
set标签 |
描述 |
Set标签对应更新SQL中的set片段。包含在set标签内部的SQL片段会自动去除多余的逗号。 |
属性 |
无 |
格式 |
<set> <if test=”fieldName!=null”>columnName = #{fieldName},</if> </set> 其中fieldName为Java类中属性的名称,columnName对应表的列名。最后的逗号不可省略。 |
4、杂项
4.1 bind标签
表格4- 1 bind标签
名称 |
bind |
描述 |
bind标签用于定义一个临时变量,在之后的SQL语句中可以引用此变量,类似其他配置文件中的property,只不过它不可以引入properties文件。 |
属性 |
name:变量的名称 |
Value:变量的值 |
|
格式 |
<bind name=”” value=””></bind>,它的作用域不是整个Mapper文件,而是某个SQL语句的标签内部。例如where标签内。 |
4.2 databaseId属性
表格4- 2 databsaeId属性
名称 |
databaseId |
描述 |
它对应于config配置文件中的databaseIdProvider,用于区分数据库的类型。 在Mapper配置文件中,它与id作为联合主键,与接口中的方法一一对应,例如存在select标签,它的id为selectById,默认情况下它与接口中的selectById方法对应,当指定databaseId时,当数据库类型为Mysql时,会执行databaseId为mysql,id为selectById的SQL,当为oracle时,会执行databaseid为oracle,id为selectById的SQL。默认id是唯一的,添加databaseId后,databaseId与id的组合是唯一的。 它不是一个标签,而是一个标签的属性。 |
格式 |
<select id=”selectById” databaseId=”mysql”></select> 数据库为mysql,执行 <select id=”selectById” databaseId=”oracle”></select> 数据库为oracle,执行 |