MyBatis 动态 SQL 详解

[复制链接]
发表于 2024-10-25 00:40:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 什么是动态 SQL?

在使用 MyBatis 进行数据库查询时,大概会碰到一些必要根据条件动态天生 SQL 语句的环境。MyBatis 提供了强盛的动态 SQL 支持,通过标签和条件语句,可以让 SQL 语句根据差别的输入参数动态天生。这大大提高了代码的灵活性,避免了拼接 SQL 语句的繁琐和出错风险。
2. 动态 SQL 的常见场景


  • 条件查询:根据差别的参数执行差别的查询条件。
  • 批量插入或更新:动态天生多个插入或更新语句。
  • 分页查询:根据分页参数动态限定查询范围。
  • 可选查询条件:根据用户输入,动态天生 SQL。

3. 动态 SQL 的常用标签

MyBatis 提供了一些标签来支持动态 SQL,包括:

  • <if>:判断条件,天生部分 SQL。
  • <choose>:雷同于 switch 语句,在多个条件之间选择。
  • <where>:自动添加 WHERE,并处理多余的 AND 或 OR。
  • <trim>:在 SQL 前后添加或去除多余的字符(如逗号、AND)。
  • <foreach>:用于循环遍历集合,天生动态 SQL。
  • <set>:在更新语句中处理动态的 SET 字段。

4. 常见动态 SQL 用法示例

4.1 使用 <if> 标签

假设我们有一个查询用户的需求,根据差别的查询条件(username 和 age)来天生查询 SQL:
Mapper XML 文件:
  1. <select id="selectUsers" parameterType="map" resultType="User">
  2.     SELECT * FROM users
  3.     <where>
  4.         <if test="username != null">
  5.             username = #{username}
  6.         </if>
  7.         <if test="age != null">
  8.             AND age = #{age}
  9.         </if>
  10.     </where>
  11. </select>
复制代码

天生 SQL 示例:


  • 当传入 username="Alice" 时:
    1. SELECT * FROM users WHERE username = 'Alice';
    复制代码
  • 当传入 username="Alice", age=25 时:
    1. SELECT * FROM users WHERE username = 'Alice' AND age = 25;
    复制代码

4.2 使用 <choose> 标签

<choose> 标签雷同于 Java 中的 switch,可以根据条件选择执行某段 SQL。
  1. <select id="selectUserByStatus" parameterType="map" resultType="User">
  2.     SELECT * FROM users
  3.     <where>
  4.         <choose>
  5.             <when test="status == 'active'">
  6.                 status = 'active'
  7.             </when>
  8.             <when test="status == 'inactive'">
  9.                 status = 'inactive'
  10.             </when>
  11.             <otherwise>
  12.                 1 = 1
  13.             </otherwise>
  14.         </choose>
  15.     </where>
  16. </select>
复制代码

SQL 示例:


  • 当 status='active' 时:
    1. SELECT * FROM users WHERE status = 'active';
    复制代码
  • 当没有传入 status 时:
    1. SELECT * FROM users WHERE 1 = 1;
    复制代码

4.3 使用 <foreach> 标签

<foreach> 常用于处理集合范例参数,比如批量插入或查询。
  1. <select id="selectUsersByIds" parameterType="list" resultType="User">
  2.     SELECT * FROM users WHERE id IN
  3.     <foreach item="id" index="index" collection="list" open="(" separator="," close=")">
  4.         #{id}
  5.     </foreach>
  6. </select>
复制代码

Java 调用:
  1. List<Integer> ids = Arrays.asList(1, 2, 3);
  2. userMapper.selectUsersByIds(ids);
复制代码

天生 SQL:
  1. SELECT * FROM users WHERE id IN (1, 2, 3);
复制代码


4.4 使用 <where> 标签

<where> 会自动处理 SQL 中多余的 AND 或 OR,避免语法错误。
  1. <select id="selectUsers" parameterType="map" resultType="User">
  2.     SELECT * FROM users
  3.     <where>
  4.         <if test="username != null">
  5.             username = #{username}
  6.         </if>
  7.         <if test="age != null">
  8.             AND age = #{age}
  9.         </if>
  10.     </where>
  11. </select>
复制代码



  • 当只传入 age=25 时:
    1. SELECT * FROM users WHERE age = 25;
    复制代码

4.5 使用 <set> 标签

在更新语句中,如果只有部分字段必要更新,使用 <set> 标签可以避免多余的逗号。
  1. <update id="updateUser" parameterType="User">
  2.     UPDATE users
  3.     <set>
  4.         <if test="username != null">username = #{username},</if>
  5.         <if test="age != null">age = #{age},</if>
  6.         <if test="status != null">status = #{status}</if>
  7.     </set>
  8.     WHERE id = #{id}
  9. </update>
复制代码

SQL 示例:


  • 当传入 username="Alice" 和 status="active" 时:
    1. UPDATE users SET username = 'Alice', status = 'active' WHERE id = ?;
    复制代码

5. 动态 SQL 的最佳实践


  • 公道使用动态标签:不要将过多逻辑放在 XML 文件中,复杂逻辑可以放在 Java 代码中处理。
  • 避免 SQL 注入:使用 MyBatis 提供的参数占位符(#{})来避免拼接 SQL。
  • 恰当分解 SQL 语句:对于复杂的 SQL,可以拆分成多个小查询,减少 XML 文件的复杂度。
  • 使用日记调试 SQL:开启 MyBatis 的日记功能,查看天生的 SQL 是否符合预期。

6. 结论

MyBatis 动态 SQL 提供了非常强盛的功能,可以根据差别的业务需求天生灵活的 SQL 语句。通过 <if>、<choose>、<foreach> 等标签,我们可以在 XML 中轻松实现复杂的查询逻辑。在使用过程中,我们必要注意 SQL 的可读性和维护性,避免过多复杂逻辑堆积在 XML 文件中。
掌握 MyBatis 的动态 SQL,可以让你的代码更具弹性,顺应差别的业务场景。盼望这篇文章能帮助你更好地理解和使用 MyBatis 的动态 SQL 功能。

盼望你喜欢这篇关于JMyBatis 动态 SQL 详解的博客文章!请各位点赞和收藏加关注一键三连吧。祝三连的帅哥美女们今年都能暴富。如果有更多标题,欢迎随时提问。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表