MyBatis动态SQL标签的案例

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"是列表中每个元素的别名,openclose定义了包围符号,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>会自动移除最后多余的逗号。