程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

MyBatis动态SQL的5种高级玩法,90%的人只用过3种

balukai 2025-06-09 20:07:00 文章精选 4 ℃

MyBatis动态SQL在日常开发中频繁使用,但大多数开发者仅掌握基础标签。本文将介绍五种高阶技巧,助你解锁更灵活的SQL控制能力。


一、智能修剪(Trim标签)

应用场景:动态处理字段更新,替代<set>标签,避免末尾逗号问题。

<update id="updateUser">
  UPDATE user
  <trim prefix="SET" suffixOverrides=",">
    <if test="name != null">name=#{name},</if>
    <if test="age != null">age=#{age},</if>
  </trim>
  WHERE id=#{id}
</update>

优势:通过prefix和suffixOverrides精准控制前后缀,适用于动态插入或更新。


二、预绑定变量(Bind标签)

应用场景:统一处理模糊查询参数,规避数据库差异(如Oracle的CONCAT函数)。

<select id="searchUser" resultType="User">
  <bind name="pattern" value="'%' + keyword + '%'"/>
  SELECT * FROM user 
  WHERE name LIKE #{pattern}
</select>

优势:在OGNL表达式中预处理变量,提升SQL可移植性。


三、动态SQL片段(Include传参)

应用场景:复用SQL片段,动态指定别名或条件。

<sql id="userColumns">${alias}.id, ${alias}.name</sql>

<select id="selectUser" resultType="map">
  SELECT 
    <include refid="userColumns">
      <property name="alias" value="u"/>
    </include>
  FROM user u
</select>

优势:通过<property>传递参数,实现片段动态化,减少重复代码。


四、注解驱动动态SQL(Script标签)

应用场景:在注解中直接编写动态SQL,避免XML配置。

@Update("<script>" +
        "UPDATE user " +
        "<trim prefix='SET' suffixOverrides=','>" +
        "  <if test='name != null'>name=#{name},</if>" +
        "</trim>" +
        "WHERE id=#{id}" +
        "</script>")
void updateUser(User user);

优势:保持代码简洁,适用于简单动态逻辑的场景。


五、多数据库适配(DatabaseId)

应用场景:同一接口根据数据库类型执行不同SQL。

<select id="getUser" databaseId="mysql">
  SELECT * FROM user LIMIT 1
</select>
<select id="getUser" databaseId="oracle">
  SELECT * FROM user WHERE rownum = 1
</select>

配置:需在mybatis-config.xml中配置databaseIdProvider。
优势:无缝切换不同数据库语法,提升项目兼容性。


总结

掌握这五种高阶技巧,可显著提升复杂业务场景下的SQL灵活性。Trim与Bind处理动态逻辑更精准,Include传参增强复用性,Script注解简化配置,DatabaseId实现多库适配。根据实际场景选择合适方案,可大幅提升开发效率。

最近发表
标签列表