当前位置: 首页 > news >正文

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 覆盖。

相关文章:

  • Transformer编程题目,结合RTX 3060显卡性能和市场主流技术
  • 【差分隐私相关概念】瑞丽差分隐私(RDP)命题10
  • 每日算法(双指针算法)(Day 1)
  • docker多架构镜像构建
  • 大模型面经 | 请你介绍一下ReAct(Reasoning and Acting)?
  • FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现
  • 《白龙马购销存》软件分享
  • ElasticSearch中常用的数据类型
  • lustre共享存储是免费的吗
  • 案例:塔能科技驱动河南某市政照明智慧升级
  • 郑州工程技术学院党委书记甘勇一行莅临埃文科技调研交流
  • 适用于 HAL 的 AIDL
  • 第二十讲:SHAP 值与模型可解释性详解(附案例) [特殊字符]
  • 4种方法将文件映射到内存提升读写速度
  • 关于tomcat乱码和idea中控制台乱码的问题
  • MySQL:B+树索引
  • Midnight Flag CTF 2025
  • 施工用电的基本原则与相关的安全规定
  • 【Linux篇】ELF文件及其加载与动态链接机制
  • 配置阿里云服务器
  • 电厂 | 京东、美团为什么抢着为你送外卖?
  • “两高”发布侵犯知产犯罪司法解释:降低部分犯罪入罪门槛
  • 韩冬任国家广播电视总局副局长,齐竹泉任中央广播电视总台副台长
  • 给印度立“人设”:万斯访印祭出美国关税战新招,但效果存疑
  • 嫦娥五号《月球样品借用协议》签约,2025中国航天公益形象大使公布
  • 吃菜和吃肉,哪个更“增肌”?