我目前正在开发一个Spring Boot应用程序,该应用程序将mybatis用作其持久层。我想在以下情况下优化实体的批量插入:
// flightSerieMapper and legMapper are used to create a series of flights.
// legMapper needs to use batch insertion.
@Transactional
public FlightSerie add(FlightSerie flightSerie) {
Integer flightSerieId = flightSeriesSequenceGenerator.getNext();
flightSerie.setFlightSerieId(flightSerieId);
flightSerieMapper.create(flightSerie);
// create legs in batch mode
for (Leg leg : flightSerie.getFlightLegs()) {
Integer flightLegId = flightLegsSequenceGenerator.getNext();
leg.setLegId(flightLegId);
legMapper.create(leg);
}
return flightSerie;
}
mybatis在application.properties
中的配置如下:
# this can be externalized if necessary
mybatis.config-location=classpath:mybatis-config.xml
mybatis.executor-type=BATCH
这意味着默认情况下,mybatis将以批处理模式执行所有语句,包括单个插入/更新/删除语句。这个可以吗?我应该注意什么问题?
另一种方法是使用专门用于LegMapper的专用SQLSession。哪种方法最好(专用SQLSession与application.properties中的全局设置)?
注意:我还看到了其他示例,其中直接在mybatis xml映射器文件中使用<foreach/>
循环创建“批量插入”。我不想使用这种方法,因为它实际上没有提供批量插入。
答案 0 :(得分:0)
正如 @Ian Lim 所说,如果您将执行器类型全局设置为 @Flush
,请确保使用 BATCH
批注插入和更新来批注映射器方法。
另一种方法是专门使用专用的 SQLSession 为 LegMapper。哪种方法最好(专用 SQLSession 与 application.properties 中的全局设置)?
请记住,如果您为不同的映射器使用不同的 SQL 会话,则每个 SQL 会话将有不同的事务。如果用 @Transactional
注释的服务或服务方法使用多个使用不同 SQL 会话的映射器,它将分配不同的 SQL 事务。因此不可能进行涉及具有不同 SQL 会话的映射器的原子数据操作。