普通sql中insert插入多条
insert into 表名(字段名1,字段名2)values(值a1,值b1), (值a2,值b2),
例如:
insert into user_info (user_account,user_name,user_age,user_class) values (‘00001’, '张三 ',‘20’,‘计算机系’), (‘00002’, ‘李四’,‘19’,‘计算机系’);
在values中用括号分隔开多条即可
因此在mybatis中 也是用foreach拼出来这种
在mapper.java中 接口
int insertBatch(@Param(“capitalDetailDOList”) List capitalDetailDOList);
要注意这个注解param 必须是
import org.apache.ibatis.annotations.Param;
不然无法找到该参数
然后把foreach里面的值设置为parm里面的命名
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO t_capital_detail
(batch_no, organize_id, organize_name,
)VALUES
<foreach collection="capitalDetailDOList" index="index" item="capitalDetailDO" open="(" separator="," close=")">
#{capitalDetailDO.batchNo,jdbcType=VARCHAR}, #{capitalDetailDO.organizeId,jdbcType=BIGINT}, #{capitalDetailDO.organizeName,jdbcType=VARCHAR},
</foreach>
但是如上的xml写法是错的,在list里面是一条的时候没有问题,但是如果多条的时候,拼成的sql就成了
INSERT INTO t_capital_detail (batch_no, organize_id, organize_name)VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, … )
因为foreach里面没有合理的分隔开各个项的值。这样会报字段不匹配的错误
正确的写法应该是
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO t_capital_detail
(
batch_no, organize_id, organize_name
)VALUES
<foreach collection="capitalDetailDOList" index="index" item="capitalDetailDO" separator="," >
(
#{capitalDetailDO.batchNo,jdbcType=VARCHAR}, #{capitalDetailDO.organizeId,jdbcType=BIGINT}, #{capitalDetailDO.organizeName,jdbcType=VARCHAR},
)
</foreach>
把括号放在里面,且去掉foreach里面的open 和close的的括号
本文介绍了在MyBatis中如何正确实现批量插入数据。通过使用`@Param`注解和`foreach`标签,详细讲解了在SQL语句中如何避免因未正确分隔值导致的字段不匹配错误,确保批量插入的正确性。
838

被折叠的 条评论
为什么被折叠?



