SpringBoot框架下使用MyBatis出现无法设置映射参数错误如何解决
问题原因
- 核心错误为Mapper XML中
#{user.email}被手动添加了单引号包裹。MyBatis的#{}语法本身属于预编译参数占位符,会自动根据参数类型完成引号适配、SQL转义等逻辑,无需手动添加单引号。 - 手动加单引号后,MyBatis会将
'#{user.email}'识别为固定字符串,不会解析为参数占位符,整条SQL最终仅识别到#{id}1个参数占位符。但框架仍会尝试为接口方法定义的2个参数(id、user.email)赋值,因此抛出「参数索引超出范围(2 > 参数总数1)」的异常。
解决方案
删除#{user.email}外层的单引号即可,修改后的Mapper XML配置如下:
<select id="selectAnswerByUser" parameterType="java.util.Map" resultType="Answer"> select * from answer where exercise_id=#{id} and user_email=#{user.email} </select>
补充说明
如果使用${}字符串拼接语法才需要手动添加单引号,但该语法存在SQL注入风险,非特殊场景优先使用#{}预编译传参即可。
内容的提问来源于stack exchange,提问作者Yuzhen Feng
相关产品推荐
相关产品推荐

