Mybatis动态sql中foreach需要注意的地方

异常:mybatis Column count doesn't match value count at row 1

针对这个异常,有许多情况,报错主要说mybatis动态sql前后参数不匹配

什么意思呢:就是这种    insert into user(name,id)  values (name);

动态sql解析后后面传入的参数与前面不一致。

这个异常出现的情况很多不只这一种,不过都是sql转化后不是正常的sql语句,自己转化后就看出来了


这里举例一种报错

<insert id="insert">
    INSERT INTO 
		user
	(class, student)
    VALUES
    <foreach collection="students" item="student" open="(" close=")" separator=",">
  	 #{class,jdbcType=VARCHAR}, #{student,jdbcType=VARCHAR}
    </foreach>
  </insert>

这里open="(" close=")"   是给sql语句加上( )的意思

解析后语句为 insert into user (class,student) values (class,student class,student class,student......)

所以造成了动态sql前后匹配不一致

需要改为

 <insert id="insert">
    INSERT INTO 
		user
	(class, student)
    VALUES
    <foreach collection="students" item="student"  separator=",">
  	(#{class,jdbcType=VARCHAR}, #{student,jdbcType=VARCHAR})
    </foreach>
  </insert>
把open="(" close=")"去掉    在循环内直接加上( ),

这时候语句就变成了insert into user (class,student) values (class,student)(class,student)(class,student)(......)

这次就符合正常sql语句了

对于动态sql报错一般都是解析动态sql后语法不对,所以直接按动态sql意思转化为sql语句就能看出错误。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值