if标签
通常用于WHERE语句中
<select id="getUserByName" parameterType="string" resultType="User">
select * from account where 1=1
<if test="_parameter!=null and _parameter!=''">
and name like CONCAT('%',#{_parameter},'%');
</if>
</select>
choose标签
它无法实现if....else、if....else.....的逻辑,
要想实现这样的逻辑,就需要使用到choose when otherwise标签。
choose元素中包含when和otherwise两个标签,一个choose中至少包含一个when,有0个或1个otherwise。
(只进一个when,当所有的when不满足时,将走otherwise)
<select id="getUserByNameOrId" resultType="User">
select * from account where 1=1
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and money=1000
</otherwise>
</choose>
</select>
where标签
如果该标签包含的元素有返回值,就插入一个where;如果where后面的字符串是以and和or开头,就将它剔除。
<select id="getUserByNameOrId" resultType="User">
select * from account
<!--使用了where标签,无需手动编写where条件-->
<where>
<choose>
<when test="name!=null and name!=''">
and name=#{name}
</when>
<when test="id!=-1">
and id=#{id}
</when>
<otherwise>
and money=1000
</otherwise>
</choose>
</where>
</select>
set标签
如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就把这个逗号剔除。
<update id="updateUser" parameterType="User">
<!--如果参数类型是一个对象,那么sql语句中#{对象的属性名}-->
update account
<!--使用<set>标签替代set语句-->
<set>
<if test="name!=null and name !=''">
name=#{name},
</if>
<if test="money!=0">
money=#{money},
</if>
</set>
where id=#{id}
</update>
注意点:
本案例在set标签中存在值时没有问题,但如果都不满足其中的if条件。
Set标签中没有返回值的情况下 语句 将变成 update account where id=#{id},所以使用时,仍需小心
trim标签
Where和set标签的功能都可以使用trim标签来实现
Where标签对应trim的用法如下
<trim prefix="WHERE" prefixOverrides="AND|OR">
</trim>
Set标签对应trim的用法如下
<trim prefix="SET" suffixOverrides=","> </trim>
trim标签有如下属性:
prefix:当trim元素中包含内容时,会给内容增加prefix指定的前缀
prefixOverrides:当trim元素中包含内容时,会把内容中匹配的前缀去掉
suffix:当trim元素中包含内容时,会给内容增加suffix指定的后缀
suffixOverrides:当trim元素中包含内容时,会把内容中匹配的后缀去掉
foreach:标签
可以生成一系列的值,这个标签主要用于SQL的in语句后面
foreach:元素的属性主要有 item,index,collection,open,separator,close。
item:示集合中每一个元素进行迭代时的别名,
index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open:表示该语句以什么开始,
separator:表示在每次进行迭代之间以什么符号作为分隔 符,
close:表示以什么结束
<select id="findUserByIds" resultType="User">
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item}<!--item此时表示集合中的元素-->
</foreach>
</if>
</select>
select * from account
<!--此处必须使用list 不能使用参数名-->
<if test="list.size>0">
where id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item.id}<!--item此时表示集合中的元素User对象-->
</foreach>
</if>
</select>
<insert id="addUserList">
insert into account values
<foreach collection="list" item="user" separator=",">
(DEFAULT,#{user.name},#{user.money})
</foreach>
</insert>