<select id="selectSelective" resultType="com.secbro.entity.User"> select * from t_user <where> <if test="username != null and username != ''"> and username = #{username} if> <if test="idNo != null and idNo != ''"> /* and id_no = #{idNo}*/ and id_no = #{idNo} if> where> select>
上述SQL语句中添加了 /**/的注释,生成的SQL语句为:
select * from t_user WHERE username = ? /* and id_no = ?*/ and id_no = ?
执行时,直接报错。
还有一个示例:
<select id="selectSelective" resultType="com.secbro.entity.User"> select * from t_user <where> <if test="username != null and username != ''"> -- and username = #{username} and username = #{username} if> <if test="idNo != null and idNo != ''"> and id_no = #{idNo} if> where> select>
生成的SQL语句为:
select * from t_user WHERE -- and username = ? and username = ? and id_no = ?
同样会导致报错。
这是因为我们使用 XML 方式配置 SQL 时,如果在 where 标签之后添加了注释,那么当有子元素满足条件时,除了 < !-- --> 注释会被 where 忽略解析以外,其它注释例如 // 或 /**/ 或 -- 等都会被 where 当成首个子句元素处理,导致后续真正的首个 AND 子句元素或 OR 子句元素没能被成功替换掉前缀,从而引起语法错误。
同时,个人在实践中也经常发现因为在XML中使用注释不当导致SQL语法错误或执行出错误的结果。强烈建议,非必要,不要在XML中注释掉SQL,可以通过版本管理工具来追溯历史记录和修改。 小结
本文基于Mybatis中where标签的使用,展开讲了它的使用方式、特性以及拓展到trim标签的替代作用,同时,也提到了在使用时可能会出现的坑。内容虽然简单,但如果能够很好地实践、避免踩坑也是能力的体现。
原文地址:https://mp.weixin.qq.com/s/rkH9KkwnEXF3vzoPvQ72VA