MyBatis Plus批量写入慢?

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 来优化性能。通过合理的配置和代码实现,我们能够显著提高数据插入的效率,提升应用程序的整体性能。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

服务端相声演员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值