当我通过引用 mybatis 映射器的 DAO 插入数据时,会影响多个表。
public void insertStuff(Collection<Stuff> data) {
for (Stuff item : data) {
mapper.insertT1(item.getT1Stuff());
mapper.insertT2(item.getT2Stuff());
Collection<MainStuff> mainData = item.getMainStuff();
for (MainStuff mainItem : mainData) {
mapper.insertMainData(mainItem);
}
}
}
我正在使用 mybatis 的 BATCH 执行器类型,但我很快就达到了 Oracle 的 MAX_CURSOR 限制,因为在通过主循环的每次迭代中为三个映射器语句中的每一个创建了一个新的 PreparedStatement(和一个新的连接)。我可以通过循环多次迭代来避免这种情况:
public void insertStuff(Collection<Stuff> data) {
for (Stuff item : data) {
mapper.insertT1(item.getT1Stuff());
}
for (Stuff item : data) {
mapper.insertT2(item.getT2Stuff());
}
for (Stuff item : data) {
Collection<MainStuff> mainData = item.getMainStuff();
for (MainStuff mainItem : mainData) {
mapper.insertMainData(mainItem);
}
}
}
然而,后一种代码的可读性较差,在性能方面有点成本,并且破坏了模块化。
有一个更好的方法吗?是否需要直接使用 SqlSession 并在一定数量排队后刷新语句?