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 覆盖。
相关文章:
MyBatis SqlSessionFactory 批量执行实战
在 MyBatis 中,批量操作是处理高并发数据写入的核心场景之一。通过 SqlSessionFactory 配置批处理执行器(ExecutorType.BATCH),可以显著提升数据库操作的效率。本文将结合 Spring 框架,深入解析如何高效配置和使用 MyB…...
【初阶数据结构】——算法复杂度
一、前言 1、数据结构是什么? 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数 据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构, 如&…...
Oracle数据库数据编程SQL<00. 课外关注:rownum、rowid、level、row_number 对比详解与实战>
更多Oracle学习内容请查看:Oracle保姆级超详细系列教程_Tyler先森的博客-CSDN博客 目录 一、基本概念与区别 二、ROWNUM 详解与实战 1. 基本特性 2. 典型应用 2.1 分页查询(Oracle传统方式) 2.2 限制返回行数 2.3 随机抽样 3. 注意事…...
凸优化基础
文章目录 目录**第1讲:凸优化基础****第2讲:凸优化建模****第3讲:对偶理论****第4讲:梯度下降法****第5讲:牛顿法与内点法****第6讲:次梯度与近端方法****第7讲:分布式凸优化****第8讲ÿ…...
LeetCode面试热题150中12-18题学习笔记(用Java语言描述)
Day 03 12、 O ( 1 ) O(1) O(1)时间插入、删除元素和获取元素 需求:实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否…...
开源模型集成接口
一、OpenRouter 概述 OpenRouter是一个开源的大模型API路由器,旨在将各种AI模型和服务集成到一个统一的接口中,使用户能够通过简单的配置调用不同大模型的能力。其主要功能包括智能路由用户请求到不同的AI模型,并提供统一的访问接…...
python成功解决AttributeError: can‘t set attribute ‘lines‘
文章目录 报错信息与原因分析解决方法示例代码代码解释总结 报错信息与原因分析 在使用 matplotlib绘图时,若尝试使用 ax.lines []来清除图表中的线条,会遇到AttributeError: can’t set attribute错误。这是因为 ax.lines是一个只读属性,不…...
宿舍管理系统(servlet+jsp)
宿舍管理系统(servletjsp) 宿舍管理系统是一个用于管理学生宿舍信息的平台,支持超级管理员、教师端和学生端三种用户角色登录。系统功能包括宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录、添加宿舍房间、心理咨询留言板、修改密码和退出系统等模块。宿舍管理员…...
Unity UI 从零到精通 (第30天): Canvas、布局与C#交互实战
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
vue项目打包部署到maven仓库
需要的资源文件,都放在根目录下: 1. versionInfo.js const fs require(fs) const path require(path) const mkdirp require(mkdirp) const spawn require(child_process).spawnconst packageObj require(./package.json) const versionNo packa…...
【力扣】day1
文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…...
MySQL:B+树索引
InnoDB索引方案 为了使用二分法快速定位具体的目录项,假设所有目录项都可以在物理存储器上连续存储,有以下问题: InnoDB使用页为管理存储空间的基本单位,最多只能保证16KB的连续存储空间,记录数据量多可能需要非常大…...
如何建立可复用的项目管理模板
建立可复用的项目管理模板能够显著提高项目执行效率、减少重复劳动、确保项目管理标准化。在企业中,项目管理往往涉及多个步骤和多个团队,然而每次开始一个新项目时,如果都从头开始设计流程和文档,势必浪费大量的时间和精力。通过…...
Go:goroutine 和通道
goroutine f() // 等待 f() 返回 go f() // 新建一个调用 f() 的 goroutine,不用等待在 Go 语言里,goroutine 是并发执行的活动单元。与顺序执行程序不同,在有多个 goroutine 的并发程序中,不同函数可同时执行。程序启动时&…...
盛水最多的容器问题详解:双指针法与暴力法的对比与实现
文章目录 问题描述方法探讨方法一:暴力法(Brute Force)思路代码实现复杂度分析 方法二:双指针法(Two Pointers)思路正确性证明代码实现复杂度分析 方法对比总结 摘要 盛水最多的容器(Container …...
VMWare 16 PRO 安装 Rocky8 并部署 MySQL8
VMWare 16 PRO 安装 Rocky8 并部署 MySQL8 一.Rocky OS 下载1.官网 二.配置 Rocky1.创建新的虚拟机2.稍后安装系统3.选择系统模板4.设置名字和位置5.设置大小6.自定义硬件设置核心、运存和系统镜像7.完成 三.启动安装1.上下键直接选择安装2.回车安装3.设置分区(默认…...
日常学习开发记录-slider组件
日常学习开发记录-slider组件 从零开始实现一个优雅的Slider滑块组件前言一、基础实现1. 组件结构设计2. 基础样式实现3. 基础交互实现 二、功能增强1. 添加拖动功能2. 支持范围选择3. 添加垂直模式 三、高级特性1. 键盘操作支持2. 禁用状态 五、使用示例六、总结 从零开始实现…...
AIDL 中如何传递 Parcelable 对象
目录 1. 直接在 AIDL 中定义 Parcelable 对象2. 自定义 Parcelable 对象的传递3. 以 Rect 类为例的 Parcelable 实现4. 注意安全性5. 小结1. 直接在 AIDL 中定义 Parcelable 对象 背景说明 从 Android 10(API 级别 29)开始,AIDL 允许直接在 .aidl 文件中定义 Parcelable 对…...
LVGL实战训练——计算器实现
目录 一、简介 二、部件知识 2.1 按钮矩阵部件(lv_btnmatrix) 2.1.1 按钮矩阵部件的组成 2.1.2 按钮文本设置 2.1.3 按钮索引 2.1.4 按钮宽度 2.1.5 按钮属性 2.1.6 按钮互斥 2.1.7 按钮文本重着色 2.1.8 按钮矩阵部件的事件 2.1.9 按钮矩阵部件的 API 函数 2.2…...
代码随想录算法训练营Day30
力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接:力扣452.用最少数量的箭引爆气球 视频链接:代码随想录 题…...
AIDL 语言简介
目录 软件包类型注释导入AIDL 的后端AIDL 语言大致上基于 Java 语言。AIDL 文件不仅定义了接口本身,还会定义这个接口中用到的数据类型和常量。 软件包 每个 AIDL 文件都以一个可选软件包开头,该软件包与各个后端中的软件包名称相对应。软件包声明如下所示: package my.pac…...
经典算法 判断一个图中是否有环
判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES,不存在输出NO。 输入样例1 6 8 5 3 …...
Transformer-PyTorch实战项目——文本分类
Transformer-PyTorch实战项目——文本分类 ———————————————————————————————————————————— 【前言】 这篇文章将带领大家使用Hugging Face里的模型进行微调,并运用在我们自己的新项目——文本分类中。需要大家提前下…...
Linux-服务器负载评估方法
在 Linux 服务器中,top 命令显示的 load average(平均负载)反映了系统在特定时间段内的负载情况。它通常显示为三个数值,分别代表过去 1 分钟、5 分钟和 15 分钟的平均负载。 1. 什么是 Load Average? Load average …...
Transformer编程题目,结合RTX 3060显卡性能和市场主流技术
以下是10道针对4年经验开发者的Transformer编程题目,结合RTX 3060显卡性能和市场主流技术,每题包含模型选择和实现逻辑描述: 题目1:医疗报告结构化提取 模型选择:BioBERT-base 要求: 开发从PDF医疗报告中提…...
Web三漏洞学习(其二:sql注入)
靶场:NSSCTF 、云曦历年考核题 二、sql注入 NSSCTF 【SWPUCTF 2021 新生赛】easy_sql 这题虽然之前做过,但为了学习sql,整理一下就再写一次 打开以后是杰哥的界面 注意到html网页标题的名称是 “参数是wllm” 那就传参数值试一试 首先判…...
VLAN的知识
1.什么是VLAN? VLAN是虚拟局域网,逻辑隔离广播域和网络区域 是一种通过将局域网内的设备逻辑地划分为一个个网络的技术 2.对比逻辑网络分割和物理网络分割? 逻辑网络分割是VLAN,隔离广播域和网络区域 物理网络分割是路由&…...
RFID 赋能部队智能物联网仓储建设:打造信息化高效解决方案
在当今军事现代化进程的宏大背景下,部队后勤保障工作无疑占据着举足轻重的地位,而仓储管理作为其中的核心环节,更是至关重要。传统的仓储管理模式在面对当下物资种类繁杂、数量庞大的现状时,已显得力不从心,效率低下、…...
结构型屏蔽在高频电子设备中的应用与优化
在当今高度电子化的时代,随着电子产品工作频率不断提高,设备内部温度上升,电磁环境日趋复杂,电磁兼容(EMC)问题成为设计和制造过程中必须重点解决的问题。EMC不仅关系到设备自身的稳定运行,更涉…...
【教程】Ubuntu修改ulimit -l为unlimited
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 问题描述 解决方法一 解决方法二 解决方法三 (终极) 问题描述 查系统资源限制 ulimit -l如果返回的是 64 或其他较小值,那么RDM…...
【HDFS】BlockPlacementPolicyRackFaultTolerant#getMaxNode方法的功能及具体实例
方法参数说明: numOfChosen:已经选择的节点数numOfReplicas:还需要选择的副本数方法的返回值是一个长度为2的数组:[调整后的要选出多少个节点(不包括已经选择的), 每个机架最大能选择的节点数] @Overrideprotected int[] getMaxNodesPerRack(int numOfChosen, int numOfR…...
水污染治理(生物膜+机器学习)
文章目录 **1. 水质监测与污染预测****2. 植物-微生物群落优化****3. 系统设计与运行调控****4. 维护与风险预警****5. 社区参与与政策模拟****挑战与解决思路****未来趋势** 前言: 将机器学习(ML)等人工智能技术融入植树生物膜系统ÿ…...
数模小白变大神的日记2025.4.15日
分工 1.论文:mathtype (Latex) 2.建模;相应的建模知识与撰写方法,写摘要 3.编程:matlab、SPSs、(Python) 评价模型 1. 层次分析法 ①层次分析法是一种多目标、多准则的决策问题 ②层次分析法是一种主观加权法 ③层次分析法通过以下步骤实现: 1.构…...
STM32提高篇: 以太网通讯
STM32提高篇: 以太网通讯 一.以太网通讯介绍二.W5500芯片介绍1.W5500芯片特点2.W5500应用目标3.接入框图 三.驱动移植四.tcp通讯五.udp通讯六.http_server 一.以太网通讯介绍 以太网(Ethernet)是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以…...
4-15记录(冒泡排序,快速选择排序)
算法稳定 简单选择排序的实质就是最后一个和第一个比较,小,就换位置,然后继续用最后一个数字和第二个比较,以此类推。 但是算法不稳定,本来下划线的2在后面,但是经过算法后去了前面 快速排序 实现过程&am…...
Ubuntu系统18.04更新驱动解决方法
原始是:ubuntu18.04里面的驱动是470,对应cuda11.4 现在需要更新为525,对应cuda为12.0 实现: 1、打开终端 Ctrl Alt T2、使用 lspci 命令(快速查看显卡型号) lspci | grep -i vga3、终端输入 ubuntu-d…...
Rocky Linux 9.x 基于 kubeadm部署k8s
搭建集群使用docker下载K8s,使用一主两从模式 主机名IP地址k8s- master192.168.1.141k8s- node-1192.168.1.142k8s- node-2192.168.1.143 一:准备工作 VMware Workstation Pro新建三台虚拟机Rocky Linux 9(系统推荐最小化安装) …...
MATLAB程序实现了一个物流配送优化系统,主要功能是通过遗传算法结合四种不同的配送策略,优化快递订单的配送方案
%% 主函数部分 % function main()clear; clc; close all;% 生成或加载算例 filename = D:\快递优化\LogisticsInstance.mat; if ~exist(filename, file)instance = generate_instance();save(filename, -struct, instance); elseinstance = load(filename); end% 遗传算法参数配…...
利用宝塔面板搭建RustDesk服务
一、介绍 1.1官网 https://rustdesk.com/ 1.2github仓库 https://github.com/rustdesk/rustdesk 1.3特点 RustDesk 支持多种操作系统,包括 Windows、macOS、Linux、Android 和 iOS。它甚至提供网页版客户端,可以在浏览器中直接使用。 用户可以通过…...
前端与Java后端交互出现跨域问题的14种解决方案
跨域问题是前端与后端分离开发中的常见挑战,以下是14种完整的解决方案: 1 前端解决方案( 开发环境代理) 1.1 Webpack开发服务器代理 // vue.config.js 或 webpack.config.js module.exports {devServer: {proxy: {/api: {target: http://localhost:8…...
PBKDF2全面指南(SpringBoot实现版)
文章目录 第一部分:PBKDF2基础概念1. 什么是PBKDF2?2. 为什么需要PBKDF2?3. PBKDF2的工作原理4. PBKDF2与其他密码散列函数的比较第二部分:在Java和SpringBoot中使用PBKDF21. Java内置的PBKDF2支持2. SpringBoot中集成PBKDF22.1 添加依赖2.2 配置PBKDF2密码编码器2.3 自定义…...
基于RV1126开发板的rknn-toolkit-lite使用方法
1. rknn-toolkit-lite介绍 rknn-toolkit-lite是用于python算法的推理的组件,当前已经在EASY-EAI-Nano完成适配,用户可以用它进行深度学习算法的纯python开发。而且同时支持已经进行了预编译的模型,短短几行代码即可完成算法的推理,…...
一款轻量级的PHP地址发布页面源码
源码介绍 一款轻量级的PHP链接发布页面源码,适合快速搭建个性化的链接导航网站,支持动态链接管理和多种风格模板切换 1:后台登录地址为/admin/login.php,提供便捷的配置入口。 2:默认用户名是admin,密码为…...
分布式计算领域的前沿工具:Ray、Kubeflow与Spark的对比与协同
在当今机器学习和大数据领域,分布式计算已成为解决大规模计算问题的关键技术。本文将深入探讨三种主流分布式计算框架——Ray、Kubeflow和Spark,分析它们各自的特点、应用场景以及如何结合它们的优势创建更强大的计算平台。 Spark批量清洗快,…...
【专题刷题】双指针(一)
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:1,本人解法 本人屎山代码;2,优质解法 优质代码;3,精益求精,…...
火山引擎旗下防御有哪些
首先,我需要确认用户是不是打错了,比如把“引擎”当成了“云”,或者他们真的想了解火山引擎的防御机制。火山引擎是字节跳动旗下的云服务平台,类似于阿里云或腾讯云,所以用户可能想了解的是其安全防护措施。 接下来&am…...
python程序打包——nuitka使用
目前python打包成exe的工具主要有:PyInstaller Briefcase py2exe py2app Nuitka CX_Freeze等。 不同于C代码,可以直接编译成可执行的exe文件,或者js代码在浏览器中就能执行,python代码必须通过python解释器来运行,…...
编写了一个专门供强化学习玩的贪吃蛇小游戏,可以作为后续学习的playgraound
文章目录 **试玩效果****项目背景****核心设计思路****代码亮点解析****与强化学习算法的对接示例****扩展方向****总结****完整代码**把训练一个会玩小游戏的智能体,作为学习强化学习的一个目标,真的是很有乐趣的一件事。我已经不知为此花费了多少日夜了。如今已是着魔了一般…...
chain_type=“stuff 是什么 ? 其他方式有什么?
chain_type="stuff 是什么 ? 其他方式有什么? 目录 chain_type="stuff 是什么 ? 其他方式有什么?1. `chain_type="stuff"`2. `chain_type="map_reduce"`3. `chain_type="refine"`4. `chain_type="map_rerank"`在 LangCh…...
在IDEA里面建立maven项目(便于java web使用)
具体步骤: 第一次有的电脑你再创建项目的时候右下角会提醒你弹窗:让你下载没有的东西 一定要下载!!可能会很慢 运行结果: 因为他是默认的8080端口所以在运行的时候输入的url如下图: 新建了一个controller代…...