mybaties plus 批量插入方案推荐

  • [ mybaties plus 批量插入方案推荐 ]
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
    SimpleTableMapper mapper = session.getMapper(SimpleTableMapper.class);
    List<SimpleTableRecord> records = getRecordsToInsert(); // not shown
 
    BatchInsert<SimpleTableRecord> batchInsert = insert(records)
            .into(simpleTable)
            .map(id).toProperty("id")
            .map(firstName).toProperty("firstName")
            .map(lastName).toProperty("lastName")
            .map(birthDate).toProperty("birthDate")
            .map(employed).toProperty("employed")
            .map(occupation).toProperty("occupation")
            .build()
            .render(RenderingStrategy.MYBATIS3);
 
    batchInsert.insertStatements().stream().forEach(mapper::insert);
 
    session.commit();
} finally {
    session.close();
}

即基本思想是将 MyBatis session 的 executor type 设为 Batch ,然后多次执行插入语句。就类似于JDBC的下面语句一样。

Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false&rewriteBatchedStatements=true","root","root");
connection.setAutoCommit(false);
PreparedStatement ps = connection.prepareStatement(
        "insert into tb_user (name) values(?)");
for (int i = 0; i < stuNum; i++) {
    ps.setString(1,name);
    ps.addBatch();
}
ps.executeBatch();
connection.commit();
connection.close();

经过试验,使用了 ExecutorType.BATCH 的插入方式,性能显著提升,不到 2s 便能全部插入完成。

总结一下,如果MyBatis需要进行批量插入,推荐使用 ExecutorType.BATCH 的插入方式,如果非要使用 的插入的话,需要将每次插入的记录控制在 20~50 左右。

的插入耗时就耗在,由于我foreach后有5000+个values,所以这个PreparedStatement特别长,包含了很多占位符,对于占位符和参数的映射尤其耗时。并且,查阅相关资料可知,values的增长与所需的解析时间,是呈指数型增长的。
在这里插入图片描述
所以,如果非要使用 foreach 的方式来进行批量插入的话,可以考虑减少一条 insert 语句中 values 的个数,最好能达到上面曲线的最底部的值,使速度最快。一般按经验来说,一次性插20~50行数量是比较合适的,时间消耗也能接受。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 提供了批量插入的功能,可以方便地一次性插入多条数据。下面是一个使用 MyBatis-Plus 进行批量插入的示例: 1. 首先,定义一个实体类或者对应的数据传输对象(DTO),用于封装要插入的数据: ```java public class User { private Long id; private String name; private Integer age; // 省略 getter 和 setter 方法 } ``` 2. 然后,编写一个 Mapper 接口,继承 MyBatis-Plus 的 BaseMapper,并添加一个批量插入的方法: ```java public interface UserMapper extends BaseMapper<User> { void batchInsert(List<User> userList); } ``` 3. 在对应的 Mapper XML 文件中,实现批量插入方法: ```xml <insert id="batchInsert" parameterType="java.util.List"> insert into user (id, name, age) values <foreach collection="list" item="item" index="index" separator=","> (#{item.id}, #{item.name}, #{item.age}) </foreach> </insert> ``` 4. 最后,在业务逻辑中调用批量插入的方法: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public void batchInsertUsers(List<User> userList) { userMapper.batchInsert(userList); } } ``` 通过以上步骤,你就可以使用 MyBatis-Plus 进行批量插入操作了。在业务逻辑中,你可以创建一个包含多个 User 对象的列表,然后调用 `batchInsertUsers` 方法进行批量插入。 注意:批量插入时,需要注意数据库的限制和性能问题。在某些数据库中,批量插入的数据量可能有限制,超过限制可能导致插入失败。此外,对于大批量插入操作,可能需要考虑分批次插入或使用其他方式优化性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值