MyBatis 动态 SQL 提供了在 XML 映射文件中编写动态 SQL 语句的能力,允许根据条件动态生成 SQL 语句,主要用于在查询、更新、删除等操作中根据不同条件动态拼接 SQL 语句。
用途:
- 条件判断: 可以根据条件动态添加 WHERE 子句或其他条件。
- 动态排序: 根据条件动态添加 ORDER BY 子句。
- 动态组装: 根据条件动态组装 SQL 语句,如动态拼接列名、表名等。
执行原理:
MyBatis 的动态 SQL 是通过 XML 映射文件中的特定标签实现的,主要使用的标签包括 <if>
, <choose>
, <when>
, <otherwise>
, <foreach>
等。
<if>
标签:用于条件判断,根据条件动态生成 SQL 片段。<choose>
、<when>
、<otherwise>
标签:用于实现类似 switch-case 的条件判断,选择其中一个分支执行。<foreach>
标签:用于循环遍历集合或数组,动态生成多个 SQL 片段。
MyBatis 在解析 XML 映射文件时,会根据条件判断,动态拼接 SQL 语句,并根据配置的条件组合最终生成完整的 SQL 语句。
动态 SQL 的类型:
<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>
<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>
<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