springboot?注解方式批量插入數(shù)據(jù)的實(shí)現(xiàn)
一.使用場(chǎng)景
一次請(qǐng)求需要往數(shù)據(jù)庫(kù)插入多條數(shù)據(jù)時(shí),可以節(jié)省大量時(shí)間,mysql操作在連接和斷開(kāi)時(shí)的開(kāi)銷(xiāo)超過(guò)本次操作總開(kāi)銷(xiāo)的40%。
二.實(shí)現(xiàn)方法
1.mysql表結(jié)構(gòu)

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.測(cè)試類(lèi)

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("中國(guó)圖書(shū)網(wǎng)");
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.測(cè)試結(jié)果


三.插入效率對(duì)比
1.批量插入

2.一條一條插入

到此這篇關(guān)于springboot 注解方式批量插入數(shù)據(jù)的文章就介紹到這了,更多相關(guān)springboot 注解方式批量插入數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot利用ThreadPoolTaskExecutor批量插入百萬(wàn)級(jí)數(shù)據(jù)
- springboot使用ThreadPoolTaskExecutor多線(xiàn)程批量插入百萬(wàn)級(jí)數(shù)據(jù)的實(shí)現(xiàn)方法
- SpringBoot Mybatis批量插入Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)
- Springboot?手動(dòng)分頁(yè)查詢(xún)分批批量插入數(shù)據(jù)的實(shí)現(xiàn)流程
- Spring Boot分段處理List集合多線(xiàn)程批量插入數(shù)據(jù)的解決方案
相關(guān)文章
java并發(fā)編程工具類(lèi)JUC之ArrayBlockingQueue
類(lèi)ArrayBlockingQueue是BlockingQueue接口的實(shí)現(xiàn)類(lèi),它是有界的阻塞隊(duì)列,內(nèi)部使用數(shù)組存儲(chǔ)隊(duì)列元素,通過(guò)代碼給大家說(shuō)明如何初始化一個(gè)ArrayBlockingQueue,并向其中添加一個(gè)對(duì)象,對(duì)java并發(fā)編程工具類(lèi)ArrayBlockingQueue相關(guān)知識(shí)感興趣的朋友一起看看吧2021-05-05
簡(jiǎn)單談?wù)凧ava 中的線(xiàn)程的幾種狀態(tài)
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava 中的線(xiàn)程的幾種狀態(tài)的相關(guān)資料,需要的朋友可以參考下2020-02-02
Java ArrayList與Vector和LinkedList的使用及源碼分析
ArrayList、Vector、LinkedList類(lèi)均在java.util包中,均為可伸縮數(shù)組,即可以動(dòng)態(tài)改變長(zhǎng)度的數(shù)組。ArrayList 和 Vector都是基于存儲(chǔ)元素的Object[] array來(lái)實(shí)現(xiàn)的,它們會(huì)在內(nèi)存中開(kāi)辟一塊連續(xù)的內(nèi)存來(lái)存儲(chǔ)2022-11-11
Java Swing實(shí)現(xiàn)窗體添加背景圖片的2種方法詳解
這篇文章主要介紹了Java Swing實(shí)現(xiàn)窗體添加背景圖片的2種方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Swing實(shí)現(xiàn)窗體添加背景圖片的方法,并總結(jié)分析了Swing重繪中repaint與updateUI的區(qū)別,需要的朋友可以參考下2017-11-11
Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟
這篇文章主要介紹了Jenkins自動(dòng)構(gòu)建部署項(xiàng)目到遠(yuǎn)程服務(wù)器上的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
教你怎么用Java完成人民幣大寫(xiě)轉(zhuǎn)化
這篇文章主要介紹了教你怎么用Java完成人民幣大寫(xiě)轉(zhuǎn)化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
IDEA+Maven創(chuàng)建Spring項(xiàng)目的實(shí)現(xiàn)步驟
這篇文章主要介紹了IDEA+Maven創(chuàng)建Spring項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07

