springboot 注解方式批量插入数据的实现

作者:什么都干的派森 时间:2022-02-20 19:03:50 

一.使用场景

一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%。

二.实现方法

1.mysql表结构

springboot 注解方式批量插入数据的实现

2.domain

springboot 注解方式批量插入数据的实现

package com.cxstar.order.domain;

import java.util.Date;

@lombok.Data
public class Data {
   private int id;
   private String ruid;
   private String title;
   private String author;
   private String coverUrl;
   private String detialUrl;
   private String code;
   private int type;
   private String publisher;
   private int groupId;
   private String groupName;
   private int pageNo;
   private String searchKey;
   private Date createTime;
}

3.mapper

springboot 注解方式批量插入数据的实现

package com.cxstar.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cxstar.order.domain.Data;
import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Mapper
public interface DataMapper extends BaseMapper<Data> {

@InsertProvider(type = Provider.class, method = "batchInsert")
   int batchInsert(List<Data> data);

class Provider {
       /* 批量插入 */
       public String batchInsert(Map map) {
           List<Data> data = (List<Data>) map.get("list");
           StringBuilder sb = new StringBuilder();
           sb.append("INSERT INTO data (" +
                       "ruid," +
                       "title," +
                       "author," +
                       "code," +
                       "type," +
                       "publisher," +
                       "group_id," +
                       "group_name," +
                       "page_no," +
                       "search_key," +
                       "create_time," +
                       "cover_url," +
                       "detial_url" +
                   ") VALUES ");
           MessageFormat mf = new MessageFormat(
                   "(" +
                       "#'{'list[{0}].ruid}, " +
                       "#'{'list[{0}].title}, " +
                       "#'{'list[{0}].author}, " +
                       "#'{'list[{0}].code}, " +
                       "#'{'list[{0}].type}, " +
                       "#'{'list[{0}].publisher}, " +
                       "#'{'list[{0}].groupId}, " +
                       "#'{'list[{0}].groupName}, " +
                       "#'{'list[{0}].pageNo}, " +
                       "#'{'list[{0}].searchKey}, " +
                       "#'{'list[{0}].createTime}, " +
                       "#'{'list[{0}].coverUrl}, " +
                       "#'{'list[{0}].detialUrl}" +
                   ")"
           );

for (int i = 0; i < data.size(); i++) {
               sb.append(mf.format(new Object[] {i}));
               if (i < data.size() - 1)
                   sb.append(",");
           }
           return sb.toString();
       }

}

}

4.测试类

springboot 注解方式批量插入数据的实现

package com.cxstar.order;

import com.alibaba.fastjson.JSONObject;
import com.cxstar.order.domain.Data;
import com.cxstar.order.mapper.DataMapper;
//import com.cxstar.order.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;

@SpringBootTest
class OrderApplicationTests {

@Autowired
   DataMapper dataMapper;

@Test
   void data_batch_insert() {

ArrayList<Data> batchInsertList = new ArrayList<>();

Data data = new Data();
       data.setTitle("历史上的今天");
       data.setAuthor("郭漫");
       data.setCoverUrl("http://image31.bookschina.com/2011/20110520/s5143135.jpg");
       data.setDetialUrl("http://www.bookschina.com/5143135.htm");
       data.setGroupId(1);
       data.setGroupName("中国图书网");
       data.setRuid(UUID.randomUUID().toString().replaceAll("-",""));
       data.setType(1);
       data.setCode(null);
       data.setPublisher(null);
       data.setPageNo(1);
       data.setSearchKey("历史上的今天");
       data.setCreateTime(new Date());

batchInsertList.add(data);

System.out.println(dataMapper.batchInsert(batchInsertList));
   }

}

5.测试结果

springboot 注解方式批量插入数据的实现

springboot 注解方式批量插入数据的实现

三.插入效率对比

1.批量插入

springboot 注解方式批量插入数据的实现

2.一条一条插入

springboot 注解方式批量插入数据的实现

来源:https://blog.csdn.net/weixin_43721000/article/details/123751975

标签:springboot,注解,批量插入
0
投稿

猜你喜欢

  • Java多线程的其他知识_动力节点Java学院整理

    2023-09-06 06:01:58
  • IDEA怎么生成UML类图的实现

    2023-12-07 15:40:21
  • 浅析Java设计模式编程中的单例模式和简单工厂模式

    2021-10-13 15:27:54
  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    2023-11-08 09:40:31
  • Java 中Comparable和Comparator区别比较

    2023-10-28 23:16:34
  • spring cloud将spring boot服务注册到Eureka Server上的方法

    2023-12-08 19:42:09
  • C# 如何调用SAP RFC

    2023-07-02 18:11:42
  • Java reservedcodecachesize虚拟机参数案例详解

    2022-03-15 12:18:48
  • Java中的泛型方法详解及简单实例

    2023-09-11 13:28:05
  • 深入理解Java责任链模式实现灵活的请求处理流程

    2022-06-06 23:33:53
  • Java最简洁数据结构之冒泡排序快速理解

    2023-12-01 06:31:52
  • 解决springmvc关于前台日期作为实体类对象参数类型转换错误的问题

    2023-11-28 20:53:42
  • Maven中央仓库发布的实现方法

    2023-12-09 07:15:06
  • spring框架集成flyway项目的详细过程

    2023-09-14 11:47:14
  • Spring Boot深入排查 java.lang.ArrayStoreException异常

    2023-07-11 16:31:27
  • SparkSQL开窗函数分析使用示例

    2022-04-16 02:26:32
  • java 中模式匹配算法-KMP算法实例详解

    2022-01-30 09:08:08
  • Java Code Cache满导致应用性能降低问题解决

    2021-06-18 18:17:56
  • Java循环对bean的属性进行赋值的实现

    2023-01-27 10:18:05
  • Java面试题冲刺第二十三天--分布式

    2023-09-24 07:30:43
  • asp之家 软件编程 m.aspxhome.com