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);
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐