基于MyBatis依次、批量、分页增删改查
创始人
2024-05-30 20:02:33

我们知道处理数据有三种思路:依次、批量、分页,对应方法如下

  • 依次处理:在 Java 里面写 for 循环,依次使用 SQL 语句,频繁连接断开数据库
  • 批量处理:在 MyBatis 里面用 拼接成一条长 SQL 语句,仅连接断开一次数据库
  • 分页处理:上面两种方案进行折中,每次将一部分批量写入

注意,若用 ; 分隔多条 SQL 语句发给数据库(需要在配置里添加 allowMultiQueries=true),这种处理虽然也可以算是某种程度上的“批量”,但其 SQL 语句并未在同一次提交中,因而本质上和依次处理没区别

选取哪种方法取决于你的数据量(记录数 × 字段数,也就是行数 × 列数)大小

  • 当有一定的数据量后(千量级),依次处理非常慢,最好使用批量处理

  • 而数据量过于庞大时(十万量级)如果还采取 进行批量处理,整个过程十分耗时,它处理时间和数据量的关系就像是倒过来的抛物线,如下图所示

  • 通常需要进行折中,使用分页处理,根据笔者自己经验而言,将每次的数据量定在 12000 左右效果较好,不过这个具体要视情况而定

image-20230216101119466

💬相关

博客文章《mybatis之foreach用法》

https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html

博客文章《MyBatis批量插入几千条数据,请慎用foreach》

https://blog.csdn.net/SharingOfficer/article/details/121431154

以下给出一个示例场景

  • 建立数据表 data_table,含有字段 idfield1field2
  • 建立 Java 类 Data,含有属性 idattr1attr2
  • 将 Java 对象或含有对象的列表作为参数,将对应的数据在数据库增删改查

下面给出依次操作和批量操作的 MyBatis 实现,而分页操作在 MyBatis 的实现和批量操作是一样的,不一样的地方在 Java 代码中

数据库配置

配置文件 application.properties 常见配置

  • serverTimezone:时区,如亚洲/上海时区 Asia/Shanghai
  • useUnicodecharacterEncoding :编码方式,如 trueutf8
  • allowMultiQueries :是否支持”;"号分隔的多条 SQL 语句的执行,如 true
  • autoReconnect :是否超时重连(当一个连接的空闲时间超过 8 小时后,MySQL就会断开该连接),如 true
  • useSSL:是否使用 SSL,如 true
spring.datasource.url=jdbc:mysql://<域名或IP地址>:<端口号>/<数据库名>?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai

查询数据

对应 SQL 的 SELECT 语句


对应生成的 SQL 语句

SELECT * FROM `data_table`
WHERE `id` = ?
SELECT * FROM `data_table`
WHERE `id` IN (?,?,?)

插入数据

对应 SQL 的 INSERT INTO 语句

注意,若设置了主键,且表中存在相同主键的数据,则无法插入

    INSERT INTO `data_table`(`id`,`field1`,`field2`)VALUES (#{id},#{attr1},#{attr2})INSERT INTO `data_table`(`id`,`field1`,`field2`)VALUES(#{item.id},#{item.attr1},#{item.attr2})

对应生成的 SQL 语句

INSERT INTO `data_table`(`id`,`field1`,`field2`)
VALUES (?,?,?)
INSERT INTO `data_table`(`id`,`field1`,`field2`)
VALUES(?,?,?),(?,?,?),(?,?,?)

更新数据

对应 SQL 的 UPDATE 语句

配合 SQL 中的 WHEN...THEN... 语句,这相当于其他编程语言中的 switch 语句

UPDATE `data_table`SET `field1` = #{attr1}, `field2` = #{attr2}WHERE `id` = #{id}
UPDATE `data_table`WHEN `id` = #{item.id} THEN #{item.attr1}WHEN `id` = #{item.id} THEN #{item.attr2}WHERE `id` IN#{item.id}

对应生成的 SQL 语句

UPDATE `data_table`
SET `field1` = ?, `field2` = ?
WHERE `id` = ?
UPDATE `data_table`
SET `field1` =CASEWHEN `id` = ? THEN ?WHEN `id` = ? THEN ?WHEN `id` = ? THEN ?END,`field2` =CASEWHEN `id` = ? THEN ?WHEN `id` = ? THEN ?WHEN `id` = ? THEN ?END 
WHERE`id` IN (?,?,?)

插入或更新数据

仅 MySQL 支持,且需要设置主键

对应 MySQL 的REPLACE INTOINSERT INTO... ON DUPLICATE KEY UPDATE ... 的语句

二者均是根据主键判断表中是否含有重复的数据,若无就直接插入,若有,前者是先删再插,后者是更新

从底层执行效率上来讲,REPLACE INTO 效率更高,但部分场景并不适合,需慎用

当然,你也可以先 DELETEINSERT INTO 达到同样的效果,但显然没有上面二者高效

💬相关

文章《慎用mysql replace语句》

https://developer.aliyun.com/article/627744

由于 REPLACE INTOINSERT INTO 的 MyBatis 实现是几乎一样的,此处就不再赘述了

INSERT INTO `data_table` (`id`,`field1`,`field2`)VALUES (#{id},#{attr1},#{attr2})ON DUPLICATE KEY UPDATE`id` = VALUES(`id`),`field1` = VALUES(`field1`),`field2` = VALUES(`field2`)
INSERT INTO `data_table` (`id`,`field1`,`field2`)VALUES(#{item.id},#{item.attr1},#{item.attr2})ON DUPLICATE KEY UPDATE`id` = VALUES(`id`),`field1` = VALUES(`field1`),`field2` = VALUES(`field2`)

对应生成的 SQL 语句

INSERT INTO `data_table` (`id`,`field1`,`field2`)
VALUES (?,?,?)
ON DUPLICATE KEY UPDATE`id` = VALUES(`id`),`field1` = VALUES(`field1`),`field2` = VALUES(`field2`)
INSERT INTO `data_table`(`id`,`field1`,`field2`)
VALUES (?,?,?),(?,?,?),(?,?,?)
ON DUPLICATE KEY UPDATE`id` = VALUES(`id`),`field1` = VALUES(`field1`),`field2` = VALUES(`field2`)

删除数据

对应 SQL 的 DELETE 语句

DELETE FROM `data_table` WHERE `id` = #{id}
DELETE FROM `data_table`WHERE `id` IN#{item}

对应生成的 SQL 语句

DELETE FROM `data_table` WHERE `id` = ?
DELETE FROM `data_table`
WHERE `id` IN (?,?,?)

清空数据

对应 SQL 的 TRUNCATE 语句

TRUNCATE TABLE `data_table`

对应生成的 SQL 语句

TRUNCATE TABLE `data_table`

💬相关

看完本文后可以进一步阅读博客文章《基于SpringBoot的数据迁移模板》

https://blog.csdn.net/weixin_42077074/article/details/128868655

相关内容

热门资讯

脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
怎么样的桃花 桃花近看远看的样... 今年的“三八”妇女节,阳光明媚,踏青赏花正当时。遂与姐妹们共赴十里蓝山,与花海来一场春天的约会。十里...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
怎么样的桃花 桃花近看远看的样... 今年的“三八”妇女节,阳光明媚,踏青赏花正当时。遂与姐妹们共赴十里蓝山,与花海来一场春天的约会。十里...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...