动态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 方法)时,也有可能因为调用方传递参数错误,导致非预期的问题。
关联网络
待办事项
- Mybatis 拦截器
- SpringBoot-后端校验
- 内容单薄,需要补充
演化日志
- v0.1 (2024-09-10):初始版本
- v0.2 (2024-12-12):补充动态标签示例
- v0.3 (2026-02-02):补充关联网络、演化日志、待办事项