mybatis模糊查询的几种错误写法与正确写法
程序员文章站
2022-04-06 18:48:01
...
LIKE模糊查询是我们经常会使用到sql查询语句,这里主要想表达的是mybatis中使用模糊查询需要注意的一些问题。
- 第一种错误写法:
<select id="findCommodityByKeyword" resultMap="BaseResultMap">
SELECT * FROM d_commodity
<if test="keyword != null">
WHERE commodity_name LIKE "%#{keyword,jdbcType=VARCHAR}%"
</if>
</select>
触发sql异常:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
异常信息是说参数索引超出范围,其实这里的异常和参数没什么关系,只是这里并不能把参数加在两个双引号之间。
- 第二种错误写法:
<select id="findCommodityByKeyword" resultMap="BaseResultMap">
SELECT * FROM d_commodity
<if test="keyword != null">
WHERE commodity_name LIKE "%"#{keyword,jdbcType=VARCHAR}"%"
</if>
</select>
触发程序异常:
com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 68
这里的异常信息是说语法错误,上面那种写法说不能把参数加在双引号之间,那么就改成这种,这种也是不行的,这样解析出来的sql语句就有问题了。
接下来说说正确的写法
- 第一种正确写法:
<select id="findCommodityByKeyword" resultMap="BaseResultMap">
SELECT * FROM d_commodity
<if test="keyword != null">
WHERE commodity_name LIKE CONCAT('%',#{keyword,jdbcType=VARCHAR},'%')
</if>
</select>
模糊查询需要使用到两个%,像上面两种错误写法是类似拼接的方式,既然自己拼接不行,那么就使用一个拼接函数让它自己帮我拼接呗。这样就没问题了。
注意: CONCAT()函数内拼接的每个字符串都需要加双引号或单引号,上面参数为什么没加呢,那是因为mybatis设置参数时会检测参数类型为字符串(VARCHAR)类型就会自动加到引号。
- 第二种正确写法
<select id="findCommodityByKeyword" resultMap="BaseResultMap">
SELECT * FROM d_commodity
<if test="keyword != null">
WHERE commodity_name LIKE "%${keyword}%"
</if>
</select>
这种写法利用到了$ {},用$ {}传参会直接把参数代入到sql语句中,值是什么在sql语句中显示的就是什么,也不会有帮你引号之类的。
两种正确写法比较:第一种写法比较安全,而第二种写法存在sql注入的风险。