choose-when-otherwise
- 如果角色编号(roleNo)不为空的话,则只用角色编号作为条件查询
- 当角色编号为空,而角色名称不为空的话,则用角色名称作为查询条件
- 如果角色编号和角色名称都为空的,则要求备注不为空
<select id="findRole2" parameterType="role" resultMap="roleResultMap">
select role_no, role_name, note from t_role
where 1=1
<choose>
<when test="roleNo != null and roleNo !=''">
AND role_no = #{roleNo}
</when>
<when test="roleName != null and roleName !=''">
AND role_name like concat('%', #{roleName}, '%')
</when>
<otherwise>
AND note is not null
</otherwise>
</choose>
</select>
trim
trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某写后缀,与之对应的属性是prefix和suffix; 可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides。
字符串 | 操作 |
prefix | 在前面加上某些内容 |
suffix | 在后面加上某些内容 |
prefixOverrides | 在前面忽略某些内容 |
suffixOverrides | 在后面忽略某些内容 |
<select id="findRole4" parameterType="string" resultMap="roleResultMap">
select role_no, role_name, note from t_role
<trim prefix="where" prefixOverrides="and">
<if test="roleName != null and roleName !=''">
and role_name like concat('%', #{roleName}, '%')
</if>
</trim>
</select>
该例子如果不用trim的话,那么将会变成select role_no, role_name, note from t_role where and role_name like concat('%', #{roleName}, '%');那么这样子sql语句中便会多出‘and’,使用prefixOverrides将where后面句子前面的and忽略。运行时候的结果就是select role_no, role_name, note from t_role where role_name like concat('%', #{roleName}, '%');
foreach
- collection配置的是传进来的数组、List、Set等集合
- item配置的是循环中单前的元素
- index是当前循环元素的下标
- open、close配置的是以什么符号将这些集合元素包装起来
- separator是各个元素的间隔符
<select id="findRoleByNums" resultMap="roleResultMap">
select role_no, role_name, note from t_role where role_no in
<foreach item="roleNo" index="index" collection="roleNoList"
open="(" separator="," close=")">
#{roleNo}
</foreach>
</select>
bind
bind元素是通过OGNL表达式去定义一个上下文变量,这样子使用起来更加方便。
<select id="findRole6" resultMap="roleResultMap">
<bind name="pattern_roleName" value="'%' + roleName + '%'" />
<bind name="pattern_note" value="'%' + note + '%'" />
SELECT role_no, role_name, note FROM t_role
where role_name like
#{pattern_roleName}
and note like #{pattern_note}
</select>
使用bind定义变量,不管在orcale或者mysql中都可以使用。