简单的mybatis batch插入批处理

简单的mybatis batch插入批处理

1.需求

公司的权限管理功能有一个岗位关联资源的分配操作,如果新增一个岗位,有时候需要将资源全部挂上去,原有的是for循环插入资源信息,发现有时候执行速度过慢,所以此处想修改为批处理模式进行处理,提高一下效率优化使用感受。此处简单记录一下批处理操作步骤,方便后续学习复习使用。

2. 具体实现步骤

主要就是引入mybatis-plus包,自己对应服务的数据库包,数据库驱动包,连接池包等基础环境包。引入包后编写mybatis-plus配置文件,数据库连接配置文件。将配置文件配置好后则编写数据库对应实体以及对应的删除新增mapper类,最后则是编写测试类即可。

我们本次测试以单条插入以及批量插入进行对比,插入没有对xml中使用<foreach>循环拼接sql形式进行对比,这种形式数据量少的情况下效率与批量插入效率相当,但是如果数据量过大数据库会有条数限制,oracle条数限制1000,而mysql则是需要修改数据库的配置文件 my.ini 中的 max_allowed_packet 参数,一般情况是不允许过长的,所以数据量过大我们不考虑这种拼接sql的处理方式。

2.1 具体引入坐标

我在测试demo项目中引入坐标如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>cn.git</groupId><artifactId>docker-hello</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><properties><maven.deploy.skip>true</maven.deploy.skip><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><mybatis-plus.version>3.3.0</mybatis-plus.version><fastjson.version>1.2.83</fastjson.version><druid.version>1.2.4</druid.version><hutool.version>5.5.7</hutool.version><lombok.version>1.18.6</lombok.version><mapstruct.version>1.4.1.Final</mapstruct.version><swagger.version>3.0.0</swagger.version><elasticjob.version>3.0.0-RC1</elasticjob.version><druid.version>1.2.4</druid.version><poi-tl.version>1.9.1</poi-tl.version><poi.version>4.1.2</poi.version><easyexcel.version>2.2.8</easyexcel.version></properties><!-- springboot dependency --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.8.RELEASE</version><relativePath/></parent><dependencyManagement><dependencies><!-- hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- mapstruct --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${mapstruct.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- log4j2日志使用包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version></dependency><!-- 测试包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><!-- 批处理测试使用包 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency></dependencies><build><plugins><!-- compiler --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${mapstruct.version}</version></path><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path></annotationProcessorPaths></configuration></plugin><!-- package --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.2 yml配置文件

测试demo项目的yml配置文件内容如下:

server:port: 8088
spring:application:name: docker-hello  # 应用程序名称,用于 Spring Cloud 的服务发现和服务注册# 数据源配置datasource:type: com.alibaba.druid.pool.DruidDataSource  # 数据源类型,这里使用的是 Druid 数据源driver-class-name: com.mysql.cj.jdbc.Driver  # MySQL 驱动类名url: jdbc:mysql://192.168.138.129:3306/test?useUnicode=true&characterEncoding=utf-8  # 数据库连接 URLusername: root  # 数据库用户名password: 101022  # 数据库密码redis:database: 0  # Redis 数据库索引,默认为 0host: 192.168.138.129  # Redis 服务器的 IP 地址port: 6379  # Redis 服务器的端口号timeout: 20000  # Redis 连接超时时间,单位为毫秒# springboot2.x以上如此配置,由于2.x的客户端是lettucelettuce:pool:max-active: 8  # 最大活动连接数,默认为 8min-idle: 0  # 最小空闲连接数,默认为 0max-idle: 8  # 最大空闲连接数,默认为 8max-wait: 10000ms  # 获取连接的最大等待时间,默认为 10000 毫秒# mybatis plus配置
mybatis-plus:# 扫描 mapper.xml 文件位置mapper-locations: classpath*:/mappers/*Mapper.xml# 别名类文件夹位置type-aliases-package: cn.git.entity# 基本配置configuration:# 驼峰模式map-underscore-to-camel-case: true# 二级缓存cache-enabled: false

2.3 实体以及mapper

对应实体类内容如下:

package cn.git.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;/*** @description: 产品表* @program: bank-credit-sy* @author: lixuchun* @create: 2024-09-24*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("product")
public class Product {@TableId(value = "id", type = IdType.ASSIGN_ID)private String id;@TableField("name")private String name;@TableField("rate")private BigDecimal rate;@TableField("amount")private BigDecimal amount;@TableField("raised")private BigDecimal raised;@TableField("cycle")private Integer cycle;@TableField("end_Time")private String endTime;}

对应的mapper内容如下:

package cn.git.mapper;import cn.git.entity.Product;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;import java.util.List;/*** @description: 产品mapper* @program: bank-credit-sy* @author: lixuchun* @create: 2024-09-24*/
public interface ProductMapper extends BaseMapper<Product> {
}

数据库建测试产品表使用建表语句如下:

CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (`id` varchar(32) NOT NULL,`name` varchar(20) DEFAULT NULL,`rate` double DEFAULT NULL,`amount` double DEFAULT NULL,`raised` double DEFAULT NULL,`cycle` int(11) DEFAULT NULL,`end_Time` char(10) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

2.4 编写测试类

我们主要测试批处理执行过程,观察执行过程与普通任务foreach执行的时间差别,所以此处直接在controller中调用测试,具体的controller内容如下:

package cn.git.controller;import cn.git.entity.Product;
import cn.git.mapper.ProductMapper;
import cn.hutool.core.util.IdUtil;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;/*** @description: mybatis批量处理controller* @program: bank-credit-sy* @author: lixuchun* @create: 2024-09-24*/
@RestController
@RequestMapping("/batch")
public class BatchController {@Autowiredprivate SqlSessionFactory sqlSessionFactory;@Autowiredprivate ProductMapper productMapper;/*** mybatis 批量插入*/@GetMapping("/add/product")public String addProduct(){// 插入 100000long start = System.currentTimeMillis();// 获取SqlSession,并开启批量执行模式try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH)) {ProductMapper productMapper = session.getMapper(ProductMapper.class);for (int i = 0; i < 100000; i++) {Product product = new Product();product.setId(IdUtil.simpleUUID());product.setName("product" + i);product.setRate(new BigDecimal(i));product.setAmount(new BigDecimal(i));product.setRaised(new BigDecimal(i));product.setCycle(i);product.setEndTime("2024-09-24");productMapper.insert(product);}session.commit();session.clearCache();}long end = System.currentTimeMillis();// 打印用时多少秒System.out.println("用时:" + (end - start) / 1000 + "秒");return "批量插入完成";}/*** 单条循环插入*/@GetMapping("/add/product2")public String addProduct2(){// 插入 100000long start = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {Product product = new Product();product.setId(IdUtil.simpleUUID());product.setName("product" + i);product.setRate(new BigDecimal(i));product.setAmount(new BigDecimal(i));product.setRaised(new BigDecimal(i));product.setCycle(i);product.setEndTime("2024-09-24");productMapper.insert(product);}long end = System.currentTimeMillis();// 打印用时多少秒System.out.println("用时:" + (end - start) / 1000 + "秒");return "单条插入完成";}}

3.测试

我们调用未执行批处理的接口 http://localhost:8088/batch/add/product2,使用foreach循环插入数据,我们观察调用时间为 108秒
在这里插入图片描述
我们调用使用批量插入的接口 http://localhost:8088/batch/add/product,我们观察调用的时间为 56秒
在这里插入图片描述
如果插入的数据表结构更复杂,表数据量更大的话,批量处理形式与普通单条插入区别将更大,推荐使用批量处理模式。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于TCP协议的网络通信

TCP即传输控制协议&#xff0c;基于TCP协议的网络通信总是面向连接的&#xff0c;在通信过程中需要进行“三次握手&#xff0c;四次挥手”&#xff0c;这是众所周知的&#xff0c;所以这里不过多赘述。我们都知道TCP协议传输数据比较稳定&#xff0c;那么为什么稳定&#xff0c…

pip的安装和使用

pip的安装和使用 1、 pip 是一个现代的&#xff0c;通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。便于我们对Python的资源包进行管理。 2、注&#xff1a;pip 已内置于 Python 3.4 和 2.7 及以上版本&#xff0c;其他版本需另行安装。 3、在安…

RAG高级优化:一文看尽query的转换之路

准确地找到与用户查询最相关的信息是RAG系统成功的关键&#xff0c;如何帮助检索系统提升召回的效果是RAG系统研究的热门方向。本文将介绍三种query理解的方法&#xff0c;以增强检索增强生成(RAG)系统中的检索过程&#xff1a; 查询重写&#xff1a; 重新定义查询&#xff0c;…

[Python学习日记-29] 开发基础练习2——三级菜单与用户登录

[Python学习日记-29] 开发基础练习2——三级菜单与用户登录 简介 三级菜单 用户登录 简介 该练习使用了列表、字典、字符串等之前学到的数据类型&#xff0c;用于巩固实践之前学习的内容。 三级菜单 一、题目 数据结构&#xff1a; menu { 北京: { 海淀: { …

什么是unix中的fork函数?

一、前言 在本专栏之前的文档中已经介绍过unix进程环境相关的概念了&#xff0c;本文将开始介绍unix中一个进程如何创建出新进程&#xff0c;主要是通过fork函数来实现此功能。本文将包含如下内容&#xff1a; 1.fork函数简介 2.父进程与子进程的特征 3.如何使用fork创建新进程…

基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…

通俗讲解javascript的实例对象、原型对象和构造函数以及它们之间的关系

今天通俗讲解一下js的对象&#xff0c;因为要通俗&#xff0c;所以可能描述不甚准确。 在js中&#xff0c;想要创建一个对象&#xff0c;首先要写出构造函数&#xff08;跟其它的语言不太一样哦&#xff0c;其它语言一般都会先写一个class 类名&#xff09;。 构造函数写法如…

Transformer-LSTM网络的轴承寿命预测,保姆级教程终于来了!

概要 关于轴承寿命预测&#xff0c;网络上的文章、代码层出不穷&#xff0c;但是质量却是令人堪忧&#xff0c;有很多文章甚至存在误导嫌疑。本期代码是在小淘怒肝好几个夜晚整理出来的&#xff0c;本期代码可以帮你迅速掌握一个轴承寿命预测的全过程。 为了不误导我的读者朋…

YOLOv5独家改进:严重遮挡和重叠目标场景解决方案 | 一种新的自适应算法轻量级通道分割和变换(ALSS)模块,自适应特征提取优化策略

💡💡💡本文解决什么问题:红外检测场景存在严重遮挡和重叠目标时的局限性的问题点。 💡💡💡提出了一种新的自适应算法轻量级通道分割和变换(ALSS)模块。该模块采用自适应信道分裂策略优化特征提取,并集成信道变换机制增强信道间的信息交换。这改善了模糊特征的提…

【d48】【Java】【力扣】LCR 123. 图书整理 I

思路 方法1&#xff1a;放进list,将list倒置&#xff0c;利用stream&#xff0c;将list改为int类型 方法2&#xff1a;递归&#xff1a;递归通用思路&#xff1b;明确每一层做什么确定返回值确定什么地方接收下层的返回值 每一层&#xff1a;调用下层&#xff0c;然后把自己…

Oracle AI理论与实践,企业落地篇干货满满

最近也是看到了圈子里的一位DBA好友&#xff0c;领导安排的工作是让负责AI的落地&#xff0c;而且也作为他业绩考核的指标&#xff0c;作为1名15年的DBA老兵来说&#xff0c;让AI落地面临的困难重重。 AI已经逐渐侵入到实际的生活中&#xff0c;最近我也是参加了Oracle官方在中…

【py】计算字母出现次数 字典储存

代码 用于计算用户输入字符串中每个字母字符的出现频率&#xff1a; from collections import Counter def calculate_character_frequency(): # 获取用户输入的字符串 user_input input("请输入一个字符串&#xff1a;") # 将字符串转换为小写…

摄影社团管理系统

基于springbootvue实现的摄影社团管理系统 &#xff08;源码L文ppt&#xff09;4-075 第四章 系统概要设计 4.1系统设计原理 设计原理是指系统的设计来源&#xff0c;它将需求合理地分解为功能&#xff0c;并抽象地描述系统的模块和其下的功能。在功能模块化后&#xff…

DeiT(ICML2021):Data-efficient image Transformer,基于新型蒸馏且数据高效的ViT!

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

KDD2024 时序论文(Time Series)

1、Generative Pretrained Hierarchical Transformer for Time Series Forecasting paper: https://dl.acm.org/doi/abs/10.1145/3637528.3671855 code&#xff1a;GitHub - SiriZhang45/FRNet: Code Implementation of FRNet 2、Fredformer: Frequency Debiased Transforme…

一文教你分不清路由器、交换机、光猫的概念,协助你对路由模组选型

当谈论网络设备时&#xff0c;我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成部分&#xff0c;承担着连接、传输和管理数据的重要任务。在日常生活和工作中&#xff0c;我们几乎离不开它们的存在&#xff0c;无论是在家中上网、办公室内…

Java:日期操作

目录 1、生成20240605180212格式的时间2、Date类型转LocalDate类型3、LocalDate类型基本操作4、格式化日期格式5、String 与 LocalDateTime 之间的转换6、生成指定时间段内的时间列表 1、生成20240605180212格式的时间 String dateTime LocalDateTime.now().format(DateTimeF…

【成品论文】2024年华为杯研究生数学建模A题成品论文

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接获取群聊【2024华为杯研赛资料汇总】&#xff1a;https://qm.q…

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】

Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 目录 Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】 一、简单介绍 二、状态模式&#xff08;State Pattern&#xff09; 1、什么时候使用状态模式 2、使用状态模式的…