动态SQL

详情

使用过 JDBC 或其它类似的框架根据不同条件拼接 SQL 语句很痛苦,拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。

Mybatis 借助功能强大 OGNL表达式 ,可以根据参数条件,动态生成执行 SQL 。

动态标签

Where标签

使用动态 SQL 最常见情景是根据条件包含 where 标签子句的一部分。该标签只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 标签也会将它们去除。

<select id="count" resultType="long">  
    select count(*)  
    from biz_student
    <where>
	    <if test="name != null">  
		    and name = #{name}  
		</if>
		<if test="code != null">  
		    and code = #{code}  
		</if>
	</where>
</select>

实际使用

/*示例
id="selectUsers" 方法名:selectUsers
parameterType="map" 传参类型:map
resultType="User"   出参类型:实体User类
*/
<select id="selectUsers" parameterType="map" resultType="User">
  SELECT * FROM biz_user
  <where>
    <if test="username != null">
      AND username = #{username}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
    <if test="roles != null and roles.size() > 0">
      AND role IN
      <foreach item="role" collection="roles" open="(" separator="," close=")">
        #{role}
      </foreach>
    </if>
  </where>
</select>

Mybatis 还支持 choose (when, otherwise)、trim (where, set)、foreach 等其他的动态标签。

我们可以使用接口校验,可以保证动态 SQL 的参数正确。

但是假如我们仅仅只是复用 SQLMap (Dao 方法)时,也有可能因为调用方传递参数错误,导致非预期的问题。

关联网络

待办事项

演化日志

  • v0.1 (2024-09-10):初始版本
  • v0.2 (2024-12-12):补充动态标签示例
  • v0.3 (2026-02-02):补充关联网络、演化日志、待办事项