mybatis xml 文件中 sql 语句引号处理及 json_CONTaiNS 函数使用
在使用 MyBatis 等框架操作数据库时,XML 文件中的 SQL 语句引号处理常常令人头疼,尤其是在使用 JSON_CONTAINS 等函数时。本文将通过一个案例,讲解如何正确处理 XML 文件中的 SQL 语句引号,避免因引号转义不当导致的 JSON_CONTAINS 函数错误。
问题:
在 MyBatis XML 映射文件中,使用 JSON_CONTAINS 函数判断 tb_goods 表的 full_discount_reduction_id_list 列(JSON 类型)是否包含特定值。直接在数据库中执行 SQL 语句结果正确,但在 XML 文件中却失败。问题源于 XML 文件中引号的转义处理。
错误 XML 代码片段:
<select id="selectGoods" resultType="com.example.Goods"> select * from tb_goods <where> <if test="fulldiscountreductionid != null"> json_contains(full_discount_reduction_id_list, #{fulldiscountreductionid}) </if> </where> </select>
数据库中直接执行的正确 SQL 语句:
select * from tb_goods WHERE JSON_CONTAINS(full_discount_reduction_id_list, '"1615237656678371329"');
问题在于 XML 中的 #{fulldiscountreductionid} 缺少必要的引号,直接添加双引号需要转义,增加了复杂性。
解决方案:
关键在于 MyBatis 参数占位符的使用。#{fulldiscountreductionid} 会被 MyBatis 自动处理类型和引号转义,但 JSON_CONTAINS 需要参数作为字符串字面量,而非参数占位符。
因此,应将 #{fulldiscountreductionid} 替换为 ${fulldiscountreductionid}。$ 符号表示直接替换参数值,无需 MyBatis 额外处理,避免了引号转义问题。MyBatis 将直接将参数值插入 SQL 语句中。
修改后的 XML 代码片段:
<select id="selectGoods" resultType="com.example.Goods"> select * from tb_goods <where> <if test="fulldiscountreductionid != null"> json_contains(full_discount_reduction_id_list, '${fulldiscountreductionid}') </if> </where> </select>
重要提示: 使用 ${} 直接替换参数值存在 SQL 注入风险,务必确保参数值的安全性。 建议优先使用 #{},只有在确实需要避免 MyBatis 自动转义的情况下才使用 ${},并对输入参数进行严格的校验和过滤。