Column count doesn’t match value count at row 1

项目场景:

今天使用Mybatis进行数据批量插入,因为公司使用的是Spring自带的JPA,所以很久没有使用Mybatis了,在进行批量数据插入的时候报了 Column count doesn't match value count at row 1


dao代码如下:

/**
 * @Author: Greyfus
 * @Create: 2022-05-30 11:11
 * @Version:
 * @Description:
 */
package com.seeker.mapper;

import com.seeker.pojo.ActionPlanDomain;
import com.seeker.pojo.BaseInfo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BaseInfoMapper {
    @Select("SELECT * FROM rtm_baseinfo where vehicleType = 1 AND brandCode = #{brandCode} AND roleType = #{roleType} AND type = #{type}")
    List<BaseInfo> findBaseInfoByParameters(@Param(value = "brandCode") String brandCode, @Param(value = "roleType") String roleType, @Param("type") String type);
    //批量插入数据
    int insertActionPlan(@Param("actionPlanDomains") List<ActionPlanDomain> actionPlanDomains);
}

BaseInfoMapper.xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.seeker.mapper.BaseInfoMapper">
    <insert id="insertActionPlan" parameterType="java.util.List">
        INSERT INTO
        `action_plan`(`created_time`,`updated_time`,`brand_code`,`tenant_code`,`model_code`,`model_year`,`gvid`,`case_overview`,`guide`,`type`,`level`,`role_type`)
        VALUES
        <foreach collection="actionPlanDomains" item="actionPlan"   open="("  close=")" separator=",">
            #{actionPlan.createdTime},#{actionPlan.updatedTime},#{actionPlan.brandCode},#{actionPlan.tenantCode},#{actionPlan.modelCode},#{actionPlan.modelYear},#{actionPlan.gvid},#{actionPlan.caseOverView},#{actionPlan.guide},#{actionPlan.type},#{actionPlan.level},#{actionPlan.roleType}
        </foreach>
    </insert>
</mapper>

首先我检查了字段个数和参数个数是否匹配,发现是匹配的,此时我在想在参数匹配的情况下为什么还报了Column count doesn't match value count at row 1这个错误,我的foreach的open属性和close属性也没有写错。

原因分析:


通过报错信息我发现foreach的open属性和close属性是放在整个执行语句的开始和结尾。
在这里插入图片描述
SQL的批量查询的语句格式应该是:

INSET INTO TABLE_NAME(column1,column2,column3,column4) 
VALUES 
(value1,value2,value3,value4),
(value1,value2,value3,value4),
(value1,value2,value3,value4),
(value1,value2,value3,value4)

然后使用Mybatis的foreach生成的格式却是:

INSET INTO TABLE_NAME(column1,column2,column3,column4) 
VALUES 
(
value1,value2,value3,value4,
value1,value2,value3,value4,
value1,value2,value3,value4,
value1,value2,value3,value4
)

Mybatis的foreach是在整个循环语句的开头和结尾增加(),而并不是每个分隔符后加

解决方案:

去掉forach中的open和close属性,然后在语句中加入(

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.seeker.mapper.BaseInfoMapper">
    <insert id="insertActionPlan" parameterType="java.util.List">
        INSERT INTO
        `action_plan`(`created_time`,`updated_time`,`brand_code`,`tenant_code`,`model_code`,`model_year`,`gvid`,`case_overview`,`guide`,`type`,`level`,`role_type`)
        VALUES
        <foreach collection="actionPlanDomains" item="actionPlan"   separator=",">
            (#{actionPlan.createdTime},#{actionPlan.updatedTime},#{actionPlan.brandCode},#{actionPlan.tenantCode},#{actionPlan.modelCode},#{actionPlan.modelYear},#{actionPlan.gvid},#{actionPlan.caseOverView},#{actionPlan.guide},#{actionPlan.type},#{actionPlan.level},#{actionPlan.roleType})
        </foreach>
    </insert>
</mapper>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值