将mybatis执行器模式全局设置为BATCH可以吗?

时间:2018-12-26 15:38:01

标签: mybatis spring-mybatis

我目前正在开发一个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/>循环创建“批量插入”。我不想使用这种方法,因为它实际上没有提供批量插入。

1 个答案:

答案 0 :(得分:0)

正如 @Ian Lim 所说,如果您将执行器类型全局设置为 @Flush,请确保使用 BATCH 批注插入和更新来批注映射器方法。

<块引用>

另一种方法是专门使用专用的 SQLSession 为 LegMapper。哪种方法最好(专用 SQLSession 与 application.properties 中的全局设置)?

请记住,如果您为不同的映射器使用不同的 SQL 会话,则每个 SQL 会话将有不同的事务。如果用 @Transactional 注释的服务或服务方法使用多个使用不同 SQL 会话的映射器,它将分配不同的 SQL 事务。因此不可能进行涉及具有不同 SQL 会话的映射器的原子数据操作。