MyBatis 怎么封装动态 SQL?

MyBatis 提供了多种动态 SQL 元素来帮助你创建动态 SQL 语句,包括 <if>, <choose>, <when>, <otherwise>, <foreach>, <set> 等。

以下是一些使用例子:

  1. <if><if> 元素可以让你根据某个条件来决定是否要插入一部分 SQL 语句。
<select id="selectUser" resultType="com.example.User">
  SELECT * FROM user
  <where>
    <if test="firstName != null">
      AND first_name = #{firstName}
    </if>
    <if test="lastName != null">
      AND last_name = #{lastName}
    </if>
  </where>
</select>

在上面的例子中,如果 firstNamelastName 都不为 null,那么生成的 SQL 语句将会包含 AND first_name = #{firstName}AND last_name = #{lastName}。如果其中任何一个为 null,那么对应的部分就不会被包含在 SQL 语句中。

  1. <choose>, <when>, <otherwise>: 这些元素可以让你根据多个条件来选择一部分 SQL 语句。
<select id="selectUser" resultType="com.example.User">
  SELECT * FROM user
  <where>
    <choose>
      <when test="firstName != null">
        AND first_name = #{firstName}
      </when>
      <when test="lastName != null">
        AND last_name = #{lastName}
      </when>
      <otherwise>
        AND id = #{id}
      </otherwise>
    </choose>
  </where>
</select>

在上面的例子中,如果 firstName 不为 null,那么生成的 SQL 语句将会包含 AND first_name = #{firstName},否则,如果 lastName 不为 null,那么生成的 SQL 语句将会包含 AND last_name = #{lastName},否则,生成的 SQL 语句将会包含 AND id = #{id}

  1. <foreach><foreach> 元素可以让你对一个集合进行迭代,并为每个元素生成一部分 SQL 语句。
<delete id="deleteUsers" parameterType="list">
  DELETE FROM user WHERE id IN
  <foreach item="id" collection="list" open="(" close=")" separator=",">
    #{id}
  </foreach>
</delete>

在上面的例子中,<foreach> 元素将会对 list 集合进行迭代,并为每个 id 生成一个 #{id},所有的 #{id} 将会被包含在 () 之间,并用 , 来分隔。

  1. <set>: <set> 元素主要用于生成动态的 update 语句,它能智能处理那些可能出现的逗号问题。
<update id="updateUser" parameterType="com.example.User">
  UPDATE user
  <set>
    <if test="firstName != null">
      first_name = #{firstName},
    </if>
    <if test="lastName != null">
      last_name = #{lastName},
    </if>
  </set>
  WHERE id = #{id}
</update>

在上面的例子中,如果 firstNamelastName 都不为 null,那么生成的 SQL 语句将会是 UPDATE user SET first_name = #{firstName}, last_name = #{lastName} WHERE id = #{id},如果其中任何一个为 null,那么对应的部分就不会被包含在 SQL 语句中,而且 <set> 元素能智能处理那些可能出现的逗号问题。

这些就是 MyBatis 提供的主要动态 SQL 元素,你可以根据你的需求混合使用它们来创建复杂的动态 SQL 语句。

发表评论

后才能评论