MyBatis 动态 SQL 提供了在 XML 映射文件中编写动态 SQL 语句的能力,允许根据条件动态生成 SQL 语句,主要用于在查询、更新、删除等操作中根据不同条件动态拼接 SQL 语句。

用途:

  1. 条件判断: 可以根据条件动态添加 WHERE 子句或其他条件。
  2. 动态排序: 根据条件动态添加 ORDER BY 子句。
  3. 动态组装: 根据条件动态组装 SQL 语句,如动态拼接列名、表名等。

执行原理:

MyBatis 的动态 SQL 是通过 XML 映射文件中的特定标签实现的,主要使用的标签包括 <if>, <choose>, <when>, <otherwise>, <foreach> 等。

  • <if> 标签:用于条件判断,根据条件动态生成 SQL 片段。
  • <choose><when><otherwise> 标签:用于实现类似 switch-case 的条件判断,选择其中一个分支执行。
  • <foreach> 标签:用于循环遍历集合或数组,动态生成多个 SQL 片段。

MyBatis 在解析 XML 映射文件时,会根据条件判断,动态拼接 SQL 语句,并根据配置的条件组合最终生成完整的 SQL 语句。

动态 SQL 的类型:

  1. <if> 标签: 根据条件判断是否添加 SQL 片段。
    <select id="getUserByCondition" parameterType="map" resultType="User">
       SELECT * FROM users
       <where>
           <if test="name != null">
               AND name = #{name}
           </if>
           <if test="age != null">
               AND age = #{age}
           </if>
       </where>
    </select>
    
  2. <choose><when><otherwise> 标签: 实现类似 switch-case 的条件判断,选择其中一个分支执行。
    <select id="getUserByType" parameterType="map" resultType="User">
       SELECT * FROM users
       <where>
           <choose>
               <when test="type == 'admin'">
                   AND role = 'admin'
               </when>
               <when test="type == 'user'">
                   AND role = 'user'
               </when>
               <otherwise>
                   AND role = 'guest'
               </otherwise>
           </choose>
       </where>
    </select>
    
  3. <foreach> 标签: 循环遍历集合或数组,动态生成多个 SQL 片段。
    <select id="getUsersByIdList" parameterType="list" resultType="User">
       SELECT * FROM users
       WHERE id IN
       <foreach item="id" collection="idList" open="(" separator="," close=")">
           #{id}
       </foreach>
    </select>
    

这些动态 SQL 的标签使得 SQL 语句可以根据条件灵活生成,提高了 SQL 查询和操作的灵活性和可定制性。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.