mybatis面试之批量插入

写在前面

本文看下通过mybatis如何来批量插入数据。

1:mybatis提供的数据插入方式

org.apache.ibatis.session.ExecutorType类中定义了执行器的种类,因为执行器就是来负责执行sql语句的,所以其也代表了mybatis所支持的数据插入的方式,源码如下:

org.apache.ibatis.session.ExecutorType
public enum ExecutorType {
  SIMPLE, REUSE, BATCH
}

其中SIMPLE就是默认的,即单条的更新。REUSE就是ReuseExecutor,根据sql语句缓存Statement。BATCH就是BatchExecutor,这种方式可以在一个事务中执行多个语句,然后批量发送给数据库,并提交事务。像这种:

start transaction;
update xxx;
insert xxx;
update yyy;
delete zzz;
commit;

JDBC对应代码如下:

String sql = "INSERT INTO saas_init_bakeups (" +
        "        delete_number, table_name, data, organ_sign,create_user)" +
        "        VALUES(?,?,?,?,?,?)";
DataSource dataSource = jdbcTemplate.getDataSource();
Connection connection = dataSource.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
List<Long> list = new ArrayList<>();
try {
    connection.setAutoCommit(false);
    ps = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
    for (InitBakeupsPo obj : bakeupsPoList) {
        ps.setString(1, obj.getDeleteNumber());
        ps.setString(2, obj.getTableName());
        ps.setBlob(3, string2Blob(obj.getData()));
        ps.setString(4, obj.getOrganSign());
        ps.setDate(5, date2Sql(obj.getCreateTime()));
        ps.setString(6, obj.getCreateUser());
        ps.addBatch();
    }
    ps.executeBatch();
    connection.commit();
    rs = ps.getGeneratedKeys(); //获取结果
    while (rs.next()) {
        list.add(rs.getLong(1));
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        connection.close();
        ps.close();
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

分别来看下。

2:SIMPLE使用foreach方式

可能配置如下:

<insert id="addEmps">
	insert into tbl_employee(<include refid="insertColumn"></include>) 
	values
	<foreach collection="emps" item="emp" separator=",">
		(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
	</foreach>
</insert>

但最终还是生成一个如下的sql语句:

insert into tbl_employee(
last_name,email,gender,d_id
) 
values
	(?,?,?,?)
 , 
	(?,?,?,?)

当foreach循环数据较多时,插入数的时长会增加比较多,可能如下图:
在这里插入图片描述

所以使用这种方式时,建议分批插入,每批不超过200条。

3:BATCH

打开session时需要指定参数ExecutorType.BATCH,代码可能如下:

public void test01() {
    //指定ExecutorType.BATCH创建sqlsession
	SqlSession openSession = build.openSession(ExecutorType.BATCH);
	UserDao mapper = openSession.getMapper(UserDao.class);
	longstart = System.currentTimeMillis();
	for(inti = 0; i < 1000000; i++) {
		String name = UUID.randomUUID().toString().substring(0, 5);
		mapper.addUser(newUser(null, name, 13));
	}
	openSession.commit();
	openSession.close();
	longend = System.currentTimeMillis();
	System.out.println("耗时时间:"+(end-start));
}

或

SqlSession session = sessionFactory.openSession(ExecutorType.BATCH);
for (Model model : list) {
    session.insert("insertStatement", model);
}
session.flushStatements();

如果有批量需求,建议使用这种方式。

4:Dynamic Sql

这是在Dynamic sql中提供的功能,需要额外引入如下pom:

<dependency>
    <groupId>org.mybatis.dynamic-sql</groupId>
    <artifactId>mybatis-dynamic-sql</artifactId>
    <version>1.1.4</version>
</dependency>

代码可能如下:

SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
    TableMapper mapper = session.getMapper(TableMapper.class);
    //自定义你的方法来获取需要插入的数据
    List<TableRecord> records = getRecordsToInsert();
 	//BatchInsert
    BatchInsert<TableRecord> batchInsert = insert(records)
            .into(table)
            .map(id).toProperty("id")
            .map(field1).toProperty("field1")
            .map(field2).toProperty("field2")
            .build()
            .render(RenderingStrategy.MYBATIS3);
    batchInsert.insertStatements().stream().forEach(mapper::insert);
    session.commit();
} finally {
    session.close();
}

写在后面

参考文章列表

mybatis批量插入优化(ExecutorType.BATCH/BatchInsert/executeBatch) 。
MyBatis源码-解读Executor的三个实现类之ReuseExecutor(重用执行器) 。
MyBatis中批量操作foreach与BatchExecutor使用详解 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/6388.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

串行通信协议---HART协议

实际应用中&#xff0c;HART协议是仅次于Modbus协议的最接近统一现场总线的标准&#xff0c;主要是在4~20mA电流信号上面叠加数字信号&#xff0c;物理层采用Bell 202标准的FSK技术成功实现模拟信号和数字信号双向同时通信而互不干扰。HART协议规定了传输的物理形式、消息结构、…

40. 组合总和 II

题目链接&#xff1a;力扣 解题思路&#xff1a;类似于力扣39题&#xff0c;组合总和&#xff0c;这里不同的是每个数字在每个组合中只能使用一次&#xff0c;但是数字可能会重复&#xff0c;所以&#xff0c;可以先统计candidates中每个数字出现的次数保存在candidatesNum数组…

Agisoft Metashape 坐标系选择 坐标转换

Metashape 坐标系选择 坐标转换 文章目录 Metashape 坐标系选择 坐标转换前言一、软件设置二、坐标系选择1.有带号坐标系选择2.无带号坐标系选择二、坐标转换(以WGS84转CGCS2000投影坐标系为例)1.保存目标坐标系2.坐标转换前言 随着无人机技术的不断发展,越来越多的无人机搭…

Docker快速搭建SkyWalking[ OAP UI[登录] Elasticsearch]

文章目录[前置]&#xff1a;搭建ELasticsearch相关[零]&#xff1a;虚拟机开放SkyingWalking和ES相关端口[一]&#xff1a;拉取SkyWalking-oap和SkyWalking-ui镜像[二]&#xff1a; 运行SkyWalking的oap和ui 容器 2.1 - 运行Skywalking-oap容器 ---- 注意oap运行参数异常 no pr…

分享89个ASP影音娱乐源码,总有一款适合您

分享89个ASP影音娱乐源码&#xff0c;总有一款适合您 89个ASP影音娱乐源码下载https://pan.baidu.com/s/1rg1dDz51zFiocnrl6lIqTw?pwdg7q9 提取码&#xff1a;g7q9 import os import shutilimport requests from bs4 import BeautifulSoupfrom framework.base.BaseFrame i…

【AI面试】BN(Batch Norm)批量归一化

在提到批量归一化的面试问题时候&#xff0c;一般会以以下几种形式提问&#xff1a; 为什么要引入BN&#xff1f;BN解决了什么问题&#xff1f;BN的公式是怎样的&#xff1f;BN公式中&#xff0c;有哪些参数是可学的&#xff1f;BN中&#xff0c;均值和方差的尺寸shape是什么样…

学习系统编程No.14【动静态库】

引言&#xff1a; 北京时间&#xff1a;2023/4/3/7:06&#xff0c;刚刚晨跑回来&#xff0c;为了摆脱困意&#xff0c;刷了一下视屏&#xff0c;哈哈哈&#xff01;我发现我每次刷视屏都是被迫的&#xff0c;都是看到某个感兴趣的标题&#xff0c;然后点进去一看&#xff0c;就…

计算机组成原理 --- 数据的表示和运算

一.进位计数制 1.由位置确定的权重为位权 --- 比如个位的位权是10的0次方&#xff0c;十位的位权是10的1次方... 1.十进制的基数是 --- 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9 &#xff…

硬件工程师需要掌握的PCB设计常用知识点

一个优秀的硬件工程师设计的产品一定是既满足设计需求又满足生产工艺的&#xff0c;某个方面有瑕疵都不能算是一次完美的产品设计。规范产品的电路设计&#xff0c;工艺设计&#xff0c;PCB设计的相关工艺参数&#xff0c;使得生产出来的实物产品满足可生产性、可测试性、可维修…

五分钟了解三门问题是什么?贝叶斯公式和蒙提霍尔问题有什么关联?

五分钟了解三门问题是什么&#xff1f;贝叶斯公式和蒙提霍尔问题有什么关联&#xff1f;1. 导读2. 题目描述3. 蒙提霍尔问题4. 朴素分析4.1 不换的1/2派4.2 调换的2/3派4.3 分歧所在5. 数学分析5.1 独立事件的概率和条件概率5.2 贝叶斯公式5.3 先验概率和后验概率6. 贝叶斯公式…

C++ 每日一练

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 C 每日一练前言一、因数-数字游戏二、通货膨胀-x国货币三、熊孩子拜访前言 突然想起了C&#xff0c;很久没用过了&#xff0c;python真香&#xff0c;为了做个正经程序人&am…

ChatGPT全球大封号!数10万企业停摆:第一批玩AI的人,被AI给玩了

观点| Mr.K 主笔| Wendy.L 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)3月31日&#xff0c;Open AI就开始无征兆的进行全球大封号&#xff0c;其中亚洲是重灾区&#xff0c;官方没有给出任何声明&#xff0c;具体原因不得而知。并且暂停了这些地区新账号的注…

【数据结构】线性表(顺序存储和链式存储)两种方法,细节满满,保你学会

⭐⭐⭐⭐⭐⭐ &#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; ⭐⭐⭐⭐⭐⭐ 目录 ⭐定义&#xff1a; ⭐ 理解&…

node Mongodb 修改数据库返回的值

需求&#xff1a; 获取”topic”表的数据&#xff0c;再根据话题id查询“article表”中对应话题的文章的数量 文章目录初始写法问题分析解决方案完整代码总结其他文件初始写法 看pushArticleNum 中的********************重点部分&#xff1a;会发现我虽然赋值了&#xff0c;…

HulaCWMS呼啦企业网站管理系统 v3.0.4

HulaCWMS(呼啦企业网站管理系统)是基于ThinkPHP5框架开发&#xff0c;安全高效&#xff0c;包括ThinkPHP5的所有特性。专注于企业、政府单位网站建设&#xff0c;以免费开源的方式&#xff0c;帮助广大站长、个人或企业开发者大大降低了开发成本和维护成本。快速锁定意向客户&a…

vscode设置选中代码自定义高亮颜色

vscode设置选中代码自定义高亮颜色 按照如下步骤&#xff0c;点击步骤3的小图标&#xff0c;进入settings.json 在文件的末尾填充如下代码 "workbench.colorCustomizations": {"editor.selectionBackground": "#62CDFF"}就像是这样 其中"…

4个令人惊艳的ChatGPT项目,开源了!AIGC也太猛了...

大家好啊&#xff5e; 自从 ChatGPT、Stable Diffusion 发布以来&#xff0c;各种相关开源项目百花齐放&#xff0c;着实让人应接不暇。 今天&#xff0c;我将着重挑选几个优质的开源项目&#xff0c;对我们的日常工作、学习生活&#xff0c;都会有很大的帮助。 今天整理分享…

【vue2.0后台项目之登陆】01登陆开发流程分析

登陆开发流程1.前言2.vue-admin-template模板介绍3. vue-admin-template模板结构分析4.axios的二次封装5.请求后端接口6.表单验证7.派发action&#xff0c;在action中发起请求8.token的用处1.前言 本文将致力于描述一个vue2.0后台系统的登陆业务流程&#xff0c;从后台项目常用…

剑指 Offer 56 - I. 数组中数字出现的次数

理想的人物不仅要在物质需要的满足上&#xff0c;还要在精神旨趣的满足上得到表现。 —— 黑格尔 目录 方法1&#xff1a;排序指针 方法2&#xff1a;异或整个数组 题目&#xff1a; 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序…

理想汽车的雷达在无人陵园内看到鬼?网友:按一下喇叭看会不会聚过来!

‍数据智能产业创新服务媒体——聚焦数智 改变商业一般而言&#xff0c;科学与鬼神是毫不沾边的。但是&#xff0c;在自动驾驶领域&#xff0c;他们却产生了联系。日前&#xff0c;一位辽宁沈阳的理想汽车车主在社交媒体发布视频称&#xff0c;自己的理想L9在空无一人的陵园道…
最新文章