Mybatis报错:Parameter index out of range (1 > number of parameters, which is 0) 解决方法
Mybatis报错:Parameter index out of range (1 > number of parameters, which is 0) 解决方法
![](https://csdnimg.cn/release/devpress/public/img/ic-book.4f347164.png)
一键AI生成摘要,助你高效阅读
问答
·
Mybatis报错:Parameter index out of range (1 > number of parameters, which is 0) 解决方法
操作:插入数据报错,参数索引超出范围
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Day60s implements Serializable {
// ID
private Integer id;
// 内容
private List<String> infos;
// 创建时间
private String createDatetime;
// 逻辑删除(0:可用,1:失效)
private Integer deleted;
// 描述
private String remark;
}
Mapper接口
/**
* 插入一条信息
* @param arg
* @return
*/
Integer insertOne(Day60s arg);
Impl实现类
/**
* 插入一条信息
* @param arg
* @return
*/
@Override
public ResultMap<Day60s> insertOne(Day60s arg) throws Exception {
ResultMap<Day60s> result = ResultMap.getError();
// 调用Mapper层
Integer successNum = mapper.insertOne(arg);
if(successNum > 0) {
result = ResultMap.getSuccess(arg);
return result;
}
return result;
}
xml配置文件
<insert id="insertOne" parameterType="Day60s" useGeneratedKeys="true" keyProperty="id">
insert into day60s
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="infos != null and infos != ''">
`infos`,
</if>
<if test="createDatetime != null and createDatetime != ''">
`createDatetime`,
</if>
<if test="remark != null and remark != ''">
`remark`
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="infos != null and infos != ''">
<foreach collection="infos" item="item" index="index" open="'[" close="]'" separator=",">#{item}</foreach>
</if>
<if test="createDatetime != null and createDatetime != ''">
#{createDatetime},
</if>
<if test="remark != null and remark != ''">
#{remark}
</if>
</trim>
</insert>
collection="infos",传参不一定非要list、map,这里传参是实体类,infos为实体类中的属性(List<String> infos)
测试接口
{
"id": null,
"infos": [1,2,3,4,5,6,"abcd","喝咖啡哈萨克"],
"createDatetime": null,
"deleted": 0,
"remark": null
}
异常信息
Day60sMapper.insertOne : ==> Preparing: insert into day60s ( `infos` ) values ( '[?,?,?,?,?,?,?,?]' )
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
原因分析
SQL语句分析,带入以上json中infos传递的参数
// 异常报错信息
insert into day60s ( `infos` ) values ( '[?,?,?,?,?,?,?,?]' )
// 执行的SQL语句
insert into day60s ( `infos` ) values ( '['1','2','3','4','5','6','abcd','喝咖啡哈萨克']' )
// 正常的语句
insert into day60s ( `infos` ) values ( ? )
把执行的SQL拿去执行一下就知道这是不可能成功的(一个参数,对应多个值是不可以的)
!!!最主要的问题是就出现在#{}
<foreach collection="infos" item="item" index="index" open="'[" close="]'" separator=",">#{item}</foreach>
<foreach collection="infos" item="item" index="index" open="'[" close="]'" separator=",">${item}</foreach>
这两句的区别就在于一个是#{},一个是${}
#{}用于占位 ==> ?被解析后带引号‘’
${}用于替换 ==> 被解析后不带引号
官方文档
${column} 会被
直接替换
,而 #{value} 会使用?
预处理。 这样,就能完成同样的任务:@Select(“select * from user where ${column} = #{value}”)
User findByColumn(@Param(“column”) String column, @Param(“value”) String value);
更多推荐
所有评论(0)