欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis模糊查询的几种错误写法与正确写法

程序员文章站 2022-04-06 18:48:01
...

LIKE模糊查询是我们经常会使用到sql查询语句,这里主要想表达的是mybatis中使用模糊查询需要注意的一些问题。

  1. 第一种错误写法:
<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).

异常信息是说参数索引超出范围,其实这里的异常和参数没什么关系,只是这里并不能把参数加在两个双引号之间。

  1. 第二种错误写法:
<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语句就有问题了。

  接下来说说正确的写法

  1. 第一种正确写法:
<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)类型就会自动加到引号。

  1. 第二种正确写法
<select id="findCommodityByKeyword" resultMap="BaseResultMap">
	SELECT * FROM d_commodity 
	<if test="keyword != null">
		WHERE commodity_name LIKE "%${keyword}%"
	</if>
</select>

这种写法利用到了$ {},用$ {}传参会直接把参数代入到sql语句中,值是什么在sql语句中显示的就是什么,也不会有帮你引号之类的。

两种正确写法比较:第一种写法比较安全,而第二种写法存在sql注入的风险。