1. 使用<if>
进行条件查询
假设我们有一个用户表users
,包含字段id
, name
, age
。我们要根据名字和年龄来查找用户,但这两个条件都是可选的。
<select id="findUsers" parameterType="map" resultType="User">
SELECT * FROM users
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
这里使用了1=1
作为固定的where子句,以便后续可以方便地添加更多的条件而不需要担心是否要加AND
。
2. 使用<choose>
, <when>
, <otherwise>
实现多条件选择
如果我们想要根据不同的条件选择不同的查询方式,比如按名字、年龄或者两者都查,我们可以这样写:
<select id="findUsersByCondition" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="name != null">
name = #{name}
</when>
<when test="age != null">
age = #{age}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
</select>
3. 使用<foreach>
处理集合参数
当我们需要构建一个包含多个值的IN语句时,例如查询多个ID对应的记录,可以使用<foreach>
:
<select id="findUsersByIds" parameterType="list" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach item="id" index="index" collection="list"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
这里collection="list"
指定了传入的是一个列表,item="id"
是列表中每个元素的别名,open
和close
定义了包围符号,separator
定义了分隔符。
4. 使用<set>
更新记录
当执行update操作时,如果某些字段可能是null或不需要更新,可以使用<set>
来动态生成SET子句:
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
请注意,<set>
会自动移除最后多余的逗号。