SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
session.insert("insertStatement", model);
}
session.flushStatements();

与默认的 ExecutorType.SIMPLE 不同,该语句将准备一次并为每条要插入的记录执行。

从资料中明白,默认执行器类型简单,会为每次创作创造一个新的预设语句,也就是创建一个新的语句。 MyBatis 存在的语句,无法采用,那么在每次调用方法时,都会重新解析sql语句。

所以,非要使用foreach的方式来进行插入的话,可以考虑减少一次插入中值的个数,最好能达到最底部的值,如果能成功的话。以前插20~50行数量是比较合适的,时间消耗也能接受。

#mybatis 推荐

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();
}

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

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


-END-

如果你喜欢我的分享,欢迎关注微信公众号 java学长分享技术干货!

悄悄告诉你免费赠送重磅互联网架构师教程,提升职场技术水平!


批量插入数据推荐写法_spring