异常: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语句就能看出错误。