MyBatis SqlSessionFactory 批量执行实战
在 MyBatis 中,批量操作是处理高并发数据写入的核心场景之一。通过 SqlSessionFactory 配置批处理执行器(ExecutorType.BATCH),可以显著提升数据库操作的效率。本文将结合 Spring 框架,深入解析如何高效配置和使用 MyBatis 的批量执行功能,并提供性能优化策略。
一、SqlSessionFactory 基础配置
1. 添加依赖
在 pom.xml 中引入 MyBatis-Spring 相关依赖:
复制
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version>
</dependency>
注:若使用非 Spring Boot 项目,需手动配置 SqlSessionFactoryBean 和 SqlSessionTemplate。
2. 配置数据源
在 application.yml(Spring Boot)或 Spring XML 配置文件中定义数据源:
复制
spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
3. 配置 SqlSessionFactory
通过 SqlSessionFactoryBean
创建 SqlSessionFactory
,并绑定数据源:
@Configuration
public class MyBatisConfig {@Autowiredprivate DataSource dataSource;@Beanpublic SqlSessionFactory sqlSessionFactory() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 指定 MyBatis 配置文件路径(可选)factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));return factoryBean.getObject();}
}
XML 配置示例:
复制
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
二、执行器配置
1.1 执行器类型选择
MyBatis 默认使用 SIMPLE 执行器
,每次操作生成独立 SQL 语句。而 BATCH 执行器
通过复用预编译语句(PreparedStatement)和合并参数,减少数据库交互次数,适用于批量插入/更新场景。
- 全局配置示例(mybatis-config.xml):
<configuration><settings><setting name="defaultExecutorType" value="BATCH"/> <!-- 全局生效 --></settings>
</configuration>
- 单次会话配置(Spring 整合):
SqlSession batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
try {UserMapper mapper = batchSession.getMapper(UserMapper.class);// 执行批量操作batchSession.commit();
} finally {batchSession.close();
}
三、Spring 框架深度整合
3.1 配置批处理 SqlSessionTemplate(Java Config)
@Configuration
@MapperScan(basePackages = "com.example.mapper") // 自动扫描 Mapper 接口
public class MyBatisBatchConfig {@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 配置全局执行器为 BATCHorg.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();configuration.setDefaultExecutorType(ExecutorType.BATCH);factoryBean.setConfiguration(configuration);return factoryBean.getObject();}@Beanpublic SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {// 显式指定批处理模式return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);}
}
3.2 DAO 层注入与使用
@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate SqlSessionTemplate batchSqlSession;@Override@Transactionalpublic void batchInsert(List<User> users) {UserMapper mapper = batchSqlSession.getMapper(UserMapper.class);mapper.insertBatch(users);}
}
四、配置特性解析
1. 执行器类型控制
- 通过 SqlSessionFactoryBean.setConfiguration() 设置全局执行器
- 或通过 SqlSessionTemplate 构造函数指定(优先级更高)
2. 事务管理集成
- 结合 @Transactional 注解确保批量操作原子性
- 推荐在 Service 层方法添加注解,而非 DAO 层
3. 性能优化配置
# application.yml
mybatis:configuration:default-executor-type: BATCHmap-underscore-to-camel-case: trueglobal-config:db-config:id-type: auto
五、最佳实践建议
1. 组合使用配置
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}
2. 连接池优化
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
3. 批量大小控制
int batchSize = 500;
SqlSession batchSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {UserMapper mapper = batchSession.getMapper(UserMapper.class);for (int i = 0; i < users.size(); i++) {mapper.insert(users.get(i));if (i % batchSize == 0) {batchSession.commit();batchSession.clearCache(); // 清理缓存}}batchSession.commit();
} finally {batchSession.close();
}
通过 Java Config 方式可实现更细粒度的配置控制,结合 Spring Boot 的自动配置特性,既能保持配置简洁性,又能满足高性能批量操作需求。建议生产环境采用混合配置模式:基础配置使用 YAML,特殊场景通过 Java Config 覆盖。