myabtis批量新增

文章指出,使用foreach标签拼接的INSERT语句在MyBatis中并不是批量新增,而是一个大SQL,当数据量大时可能引发性能问题。正确的批量新增方法是通过SqlSession的ExecutorType.BATCH模式,示例代码展示了如何通过这个名字为NameMapper的Mapper进行批量插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

foreach标签拼接的insert语句不是批量新增

相信很多项目中myabtis的新增sql语句是使用foreach标签拼接,如下写法,但千万要注意这并不批量新增
实际上这是一个大的SQL,如果遍历的集合太大, 新增时会导致性能问题.

<insert id="insertBatch" parameterType="com.example.Category" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO category (created_at, name, description)
        VALUES
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.createdAt}, #{entity.name}, #{entity.description})
        </foreach>
</insert>

那么如何在mybatis中使用批量新增呢?

  1. 在Mapper xml文件中编写sql语句
<insert id="insertName">
  insert into names (name) values (#{value})
</insert>
  1. 通过sqlSessionFactory创建支持批量新增的SqlSession, 由该SqlSession获取Mapper执行新增
List<String> names = new ArrayList<String>();
names.add("Fred");
names.add("Barney");
names.add("Betty");
names.add("Wilma");

SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
  NameMapper mapper = sqlSession.getMapper(NameMapper.class);
  for (String name : names) {
    mapper.insertName(name);
  }
  sqlSession.commit();
} finally {
  sqlSession.close();
}

详情见myabtis github官网相关链接

  • https://github.com/mybatis/mybatis-3/issues/484
  • https://github.com/mybatis/mybatis-3/wiki/FAQ#how-do-i-code-a-batch-insert
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值