MyBatis Plus批量写入慢?

news2024/11/27 8:26:33

1. 数据库连接配置


在使用 MyBatis Plus 进行批量插入之前,首先需要配置数据库连接。在连接 URL 中添加 &rewriteBatchedStatements=true,以提高批量插入的性能。以下是一个示例:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true


2. 创建实体类


我们将创建一个名为 Product 的实体类,包含多个字段,以便演示批量插入的功能。以下是 Product 类的示例代码:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

@Data
@TableName("product") // 假设数据库中对应的表名为 product
public class Product {
    private Long id;                // 产品ID
    private String name;            // 产品名称
    private String description;     // 产品描述
    private BigDecimal price;       // 产品价格
    private Integer stock;          // 库存数量
    private String category;         // 产品类别
    private String brand;           // 产品品牌
    private String sku;             // 库存单位
    private Date createTime;        // 创建时间
    private Date updateTime;        // 更新时间
    private Boolean isActive;        // 产品是否激活
    private String imageUrl;         // 产品图片URL
    private String supplier;         // 供应商信息
    private String tags;             // 产品标签
    private String color;            // 产品颜色
    private String size;             // 产品尺寸
    private String material;         // 产品材质
    private Date expirationDate;     // 产品过期时间
    private Integer rating;          // 产品评分
    private Integer reviewCount;     // 产品评价数量
    private String warranty;         // 产品保修信息
}


3. 批量插入示例代码


接下来,我们将编写批量插入的代码。以下是使用 MyBatis Plus 批量插入 10000 条 Product 数据的示例:


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

@Service
public class ProductService extends ServiceImpl<ProductMapper, Product> {

    @Autowired
    private ProductMapper productMapper;

    public void batchInsertProducts() {
        List<Product> productList = new ArrayList<>();
        Random random = new Random();

        for (int i = 0; i < 10000; i++) {
            Product product = new Product();
            product.setId((long) i);
            product.setName("Product" + i);
            product.setDescription("Description for product " + i);
            product.setPrice(BigDecimal.valueOf(random.nextDouble() * 100));
            product.setStock(random.nextInt(100));
            product.setCategory("Category" + (random.nextInt(10) + 1));
            product.setBrand("Brand" + (random.nextInt(5) + 1));
            product.setSku("SKU" + i);
            product.setCreateTime(new Date());
            product.setUpdateTime(new Date());
            product.setIsActive(random.nextBoolean());
            product.setImageUrl("http://example.com/images/product" + i + ".jpg");
            product.setSupplier("Supplier" + (random.nextInt(5) + 1));
            product.setTags("tag1,tag2,tag" + (random.nextInt(3) + 1));
            product.setColor("Color" + (random.nextInt(5) + 1));
            product.setSize("Size" + (random.nextInt(3) + 1));
            product.setMaterial("Material" + (random.nextInt(4) + 1));
            product.setExpirationDate(new Date(System.currentTimeMillis() + (random.nextInt(365) * 24 * 60 * 60 * 1000L))); // 随机过期时间
            product.setRating(random.nextInt(6)); // 评分范围 0-5
            product.setReviewCount(random.nextInt(100)); // 随机评论数量
            product.setWarranty("Warranty for " + i + " years");
            productList.add(product);
        }

        long startTime = System.currentTimeMillis();
        productMapper.insertBatchSomeColumn(productList); // 批量插入方法
        long endTime = System.currentTimeMillis();

        System.out.println("插入10000条数据耗时: " + (endTime - startTime) + "毫秒");
    }
}


4. 性能测试


通过上述代码,我们可以看到,批量插入 10000 条数据的时间大大减少。使用 &rewriteBatchedStatements=true 的情况下,插入时间通常在 2.5 秒左右,而不使用时可能需要超过 127 秒。这种性能提升对于数据密集型应用程序来说至关重要。

5. 总结


本文介绍了如何使用 MyBatis Plus 框架进行批量写入数据库,并通过设置数据库连接 URL 中的 &rewriteBatchedStatements=true 来优化性能。通过合理的配置和代码实现,我们能够显著提高数据插入的效率,提升应用程序的整体性能。

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

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

相关文章

路径规划 | 基于改进蝙蝠算法的多无人机路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于改进蝙蝠算法的多无人机路径规划&#xff08;Matlab&#xff09; 蝙蝠算法&#xff08;Bat Algorithm&#xff09;是一种基于自然界蝙蝠群体行为的启发式优化算法。该算法模拟了蝙蝠在寻找食物时的行为…

Linux 内核源码分析---内核ICMP协议分析

因特网控制报文协议ICMP&#xff08;Internet Control Message Protocol&#xff09; 是一个差错报告机制&#xff0c;是TCP/IP协议簇中的一个重要子协议&#xff0c;通常被IP层或更高层协议&#xff08;TCP或UDP&#xff09;使用&#xff0c;属于网络层协议&#xff0c;主要用…

论文阅读-Transformer Layers as Painters

1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务&#xff0c;但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响&#xff0c;本文设计了一系列的实验。通过实验表明&#xff0c;预训练语言模型中的lower和final layers与中间层分布不一致…

四路一体行车记录仪,语音提示注意行人,保障车辆行驶安全

在叉车、货车、客车等行业中&#xff0c;随着运输业务量的不断增加&#xff0c;行车安全问题已经成为了一大难题。经常会发生车祸、司乘人身安全无保障、货物损失等意外情况&#xff0c;这些事件不仅会给企业带来经济损失&#xff0c;也会影响对应行业的整体形象。 如何提高运…

服装行业的利器:RFID智能吊挂分拣系统

服装行业的利器&#xff1a;RFID智能吊挂分拣系统 服装业继续走粗放型老路的利润空间越来越小&#xff0c;行业内过度竞争利润降低&#xff0c;原料价格上涨导致成本上升。企业内部生产技术创新不足、工厂生产效率低&#xff0c;导致产出不够、货期竞争乏力。企业为了盈利生存…

C++中STL的sring类常用接口及其源码解析

1. 为什么会有string类&#xff1f; C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c; 但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0…

VS2022快速搭建OLLVM

基本参考这篇文章&#xff1a; 构建含有ollvm功能的LLVM(clang-cl)供Microsoft Visual Studio 2022使用 - 哔哩哔哩 前提 已安装VS2022 1.VS开启Clang支持 我们要用自己的Clang&#xff0c;所以无需安装VS提供的clang编译器&#xff0c;而且体积太大了&#xff0c;10多个G&…

Jmeter基础与概念详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能…

c++模板进阶——模板特化和模板分离编译

目录 前言&#xff1a; 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 2.3.3 类模板特化应用示例 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板的优缺点 前言&#xf…

Zotero 常用插件介绍

1. Zotero 插件安装方法 下载以 .xpi 结尾的插件&#xff1b;打开 Zotero → 工具 → 插件 → 右上小齿轮图标 → Install Add-on From File ... → 选择下载好的 .xpi 插件安装 → 重启 Zotero 2. 常用插件介绍 2.1. Scholaread - 靠岸学术 Zotero 英文文献相关插件&#xf…

Spring中使用JdbcTemplate访问数据库

首先在原来的基础上添加jar包&#xff0c;建一个测试数据库pring5&#xff0c;里边新建两个表users&#xff0c;authorities&#xff0c;user_authority&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc<…

目标检测之数据增强

一、概述 数据增强是一种通过人工或自动方式对数据进行修改或变换&#xff0c;以增加数据集规模和多样性的技术。在机器学习中&#xff0c;数据增强被广泛应用于解决数据稀缺、数据不平衡、数据噪声等问题&#xff0c;提高模型的泛化能力和鲁棒性。 二、为什么需要数据增强 …

JAVA智慧养老护理帮忙代办陪诊陪护系统小程序源码

&#x1f475;&#x1f3fc;&#x1f496;科技温暖夕阳红 —— 探索“智慧养老护理帮忙代办陪诊陪护系统” 一、引言&#xff1a;科技如何温柔拥抱银发族&#xff1f; 在快节奏的现代生活中&#xff0c;如何给予家中长辈更周全的关怀与照顾&#xff0c;成为了许多家庭面临的难…

Unity 编写自己的aar库,并通过AndroidJavaProxy调用访问和返回

安卓部分 我们首先创建一个空项目&#xff0c;我们不需要Activity&#xff0c;所以可以选择NoActivity。 输入一个包名&#xff0c;我们用不到这个主app包名。 项目创建好后&#xff0c;再创建新Module 左边我们选择AndroidLibrary&#xff0c;然后输入包名&#xff0c;这个…

如果使用finalshell登录linux服务器之后,上传文件失败,可能是没有使用sudo权限

先随便使用sudo命令拷贝一个文件到另外一个地方&#xff0c;然后输入密码&#xff0c;再次上传就可以了 例如&#xff1a; sudo cp index.html eventWeb/ 会提示你输入密码&#xff0c;输入之后&#xff0c;再次使用finalshell上传文件就可以了&#xff1a;

MQ的介绍

一、MQ简介 MQ是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信&#xff0c;主要功能是业务解耦 二、常见的MQ产品 RabbitMQ、RocketMQ、Kafka、ActiveMQ 三、为什么要用MQ&#xff1f;&#xff08;MQ的优点&#xff1a;异步处理、应用解耦、流量削峰&a…

前端 获取时间范围内的所有周数组集合,第一项为首月的首个周一

具体可实现的效果例如&#xff1a; 数据格式&#xff1a; 具体代码实现&#xff1a; /*** 获取当前日期的第一个周一是哪天* params date - YYYY-MM*/function getMonthFirstWeekDay(date) {let year new Date(date).getFullYear();let month new Date(date).getMonth();for …

linux:有关目录、链接文件的函数 Makefil、gdb的使用

目录函数 1.getpwuid struct passwd *getpwuid(uid_t uid); 功能: 根据用户id到/etc/passwd文件下解析获得 结构体信息 参数:uid:用户id 返回值: 成功返回id对应用户的信息 失败返回NULL passwd 结构体的定义通常如下所示 struct passwd { char *pw_nam…

opencv-特征检测

1&#xff0c;Harris角点检测 如果粉色窗口向四周移动&#xff0c;窗口内的像素没有变化则认定为平坦区域&#xff0c;如果窗口向上移动无明显变化&#xff0c;而左右移动有变化则认定为边缘&#xff0c;如果窗口向任意方向移动均有明显变化则为角点&#xff0c;如下图 dst不是…

MSSQL暴力破解

一、基本信息 靶机&#xff1a;IP&#xff1a;192.168.100.70 二、攻击过程 方法一&#xff1a;msfconsole 启动 msfconsole msfconsole 选用攻击模块&#xff0c;并设置参数 use auxiliary/scanner/mssql/mssql_login set rhosts 192.168.100.70 set USER_FILE /userna…