问题:
使用MyBatis执行动态sql查询,传入参数报错:Parameter index out of range (2 > number of parameters, which is 1)
SQL语句:
SELECT id,name,birth,phone from emp <if test="gender !=null">where gender=#{gender}</if> <if test="name !=null"> and name like '#{name}%'</if>
通过DEBUG发现解析后的sql:
SELECT id,name,birth,phone from emp where gender=? and name like '?%'
解决方案一:
修改sql中name参数连接方式:
name like '${name}%'
mybatis编译后的sql语句:
SELECT id,name,birth,phone from emp where gender=? and name like '王%'
(这里传入参数为‘王’)
解决方案二:
使用concat()连接参数:
name like concat(#{name},'%')
mybatis编译后的sql语句:
SELECT id,name,birth,phone from emp where gender=? and name like concat(?,'%')
综上总结出使用#{} ${}两种参数连接方式的不同:
- #{}方式传参,在sql预编译的使用将{}内参数部分使用?占位符代替;${} 对参数补做任何处理,直接拼接显示
- #{} 可以防止SQL注入,在myBatis中优先使用
- #{} 在变量替换后,{}中对应的变量会添加单引号’’, 而${} 不会添加单引号’’
- 查询中表名、列名作为参数,必须使用${}