springboot 注解方式批量插入数据的实现
作者:什么都干的派森 发布时间:2022-02-20 19:03:50
标签:springboot,注解,批量插入
一.使用场景
一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%。
二.实现方法
1.mysql表结构
2.domain
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
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.测试类
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.测试结果
三.插入效率对比
1.批量插入
2.一条一条插入
来源:https://blog.csdn.net/weixin_43721000/article/details/123751975


猜你喜欢
- 前言最近在使用Spring框架时遇到了一些问题,主要是Spring的事务传播问题,一个不带事务的方法调用带事务的方法,有时候会出现不回滚的情
- HttpClient介绍HttpClient 不是一个浏览器。它是一个客户端的 HTTP 通信实现库。HttpClient的目标是发 送和接
- 本文实例讲述了基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览的方法。分享给大家供大家参考。具体分析如下:一
- 本文实例讲述了Android自定义个性化的Dialog。分享给大家供大家参考,具体如下:Dialog:mDialog = new Dialo
- C# 自带的HttpWebRequest效率太低,对于自组HTTP封包不好操作。在写超级SQL注入工具时,研究了很长一段时间如何使用Sock
- Android小白第一次写博客,心情无比激动。下面给大家展示一下卫星菜单的实现。1.简单介绍卫星菜单在应用程序中,有很多展示菜单的方式,但其
- 一、前言之前介绍了JMeter engine启动原理,但是里面涉及到HashTree这个类结构没有给大家详细介绍,这边文章就详细介绍JMet
- ELK环境安装ELK是指Elasticsearch、Kibana、Logstash这三种服务搭建的日志收集系统,具体搭建方式可以参考《Spr
- android仿照qq的顶部栏效果,主要就是利用fragment manager把fragment设置显示内容(1)在activity_ma
- 这篇会深化View拖拽实例,利用Flutter Animation、插值器以及AnimatedBuilder教大家实现带动画的抽屉效果。先来
- Kotlin中函数都是头等的,这意味着它可以存储在变量与数据结构中、作为参数传递给其他高阶函数以及从其他高阶函数返回。可以向操作任何其他非函
- 导读Spring Boot应用可以使用spring-boot-maven-plugin快速打包,构建一个可执行jar。Spring Boot
- 原理 Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主
- 单行文本的输入存在严重的缺陷,也不适合实际的运用,本节通过一个无功能的记事本来介绍可以进行多行输入的JTextArea:JTextArea(
- 开发环境:android4.1.1实验功能:在第一个Hello World!为标签的activity中显示good,该界面中有一个名为Nex
- 一、背景在上一篇文章中,我们使用Seata整合了SpringBoot,在这篇文章中我们使用Seata整合SpringCloud。同时有了上一
- 实例如下://选择文件,点击【浏览】,选择文件 private void button1_Click(object sender, Even
- 什么是命名查询? Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询 使用命名查询有什么好处? 由于使用H
- TextWatcher是一个监听字符变化的类。当我们调用EditText的addTextChangedListener(TextWatche
- 项目结构项目路径可以自己定义,只要路径映射正确就可以pom.xml <properties> <spring.versio