激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 一文了解MyBatis Plus批量數據插入功能

一文了解MyBatis Plus批量數據插入功能

2022-01-20 00:51Java中文社群 Java教程

mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了MyBatis Plus批量數據插入功能的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近 Review 小伙伴代碼的時候,發(fā)現了一個小小的問題,小伙伴竟然在 for 循環(huán)中進行了 insert (插入)數據庫的操作,這就會導致每次循環(huán)時都會進行連接、插入、斷開連接的操作,從而導致一定的性能問題,簡化后代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 插入操作
 */
@RequestMapping("/save")
public Object save() {
    boolean flag = false; // 返回結果
    // 待添加(用戶)數據
    for (int i = 0; i < 1000; i++) {
        User user = new User();
        user.setName("test:"+i);
        user.setPassword("123456");
        // 插入數據
        flag = userService.save(user);
        if(!flag) break;
    }
    return flag;
}

這樣做并不會改變程序最終的執(zhí)行結果,但會對程序的執(zhí)行效率帶來很大的影響,就好比你現在要從 A 地點送 10 件貨到 B 地點,你可以選擇 1 次送 1 件,送 10 次的方案;也可以選擇 1 次送 10 件,送 1 次的方案,請問你會選擇哪種?這就是多次循環(huán)插入和批量一次插入的問題。?

PS:要插入的數據量越大,批量插入的時間(相比于循環(huán)多次插入來說)也越短、其優(yōu)勢也越大。

批量插入實現方案

本文我們使用 MyBatis-Plus(下文簡稱 MP)自帶的 saveBatch 方法,來實現數據的批量插入功能,因為 MP 不是本文討論的重點,所以這里咱們就不介紹了,如果有不熟悉的朋友可以去他的官方自行惡補:https://baomidou.com/guide/,咱們本文重點介紹一下 MP 實現批量插入的具體步驟。

1.引入 MP 框架

首先,打開您的 pom.xml 文件,在文件中添加以下內容:

?
1
2
3
4
5
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>mybatis-plus-latest-version</version>
</dependency>

注意:mybatis-plus-latest-version 表示 MP 框架的最新版本號,可訪問 https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 查詢最新版本號,但在使用的時候記得一定要將上面的 “mybatis-plus-latest-version”替換成換成具體的版本號,如 3.4.3 才能正常的引入框架。

2.創(chuàng)建數據庫和表

此步驟可省略,主要用于本文功能的實現,創(chuàng)建數據庫和數據表的腳本如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-- ----------------------------
-- 創(chuàng)建數據庫
-- ----------------------------
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP DATABASE IF EXISTS `testdb`;
CREATE DATABASE `testdb`;
USE `testdb`;
 
-- ----------------------------
-- 創(chuàng)建 user 表
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
  `createtime` datetime NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
 
-- ----------------------------
-- 添加測試數據
-- ----------------------------
INSERT INTO `user` VALUES (1, '趙云', '123456', '2021-09-10 18:11:16');
INSERT INTO `user` VALUES (2, '張飛', '123456', '2021-09-10 18:11:28');
INSERT INTO `user` VALUES (3, '關羽', '123456', '2021-09-10 18:11:34');
INSERT INTO `user` VALUES (4, '劉備', '123456', '2021-09-10 18:11:41');
INSERT INTO `user` VALUES (5, '曹操', '123456', '2021-09-10 18:12:02');
 
SET FOREIGN_KEY_CHECKS = 1;

3.具體代碼實現(重點)

① 實體類

先來創(chuàng)建數據庫所對應的 User 實體類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
import lombok.Getter;
import lombok.Setter;
 
import java.util.Date;
 
@Getter
@Setter
public class User {
    private int id;
    private String name;
    private String password;
    private Date createtime;
}

② Controller 層代碼

本文的核心是使用 MP 框架中,IService 類提供的 saveBatch 方法,來實現批量數據的插入功能,對應在 Controller 中的實現代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import com.example.demo.model.User;
import com.example.demo.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.ArrayList;
import java.util.List;
 
@RestController
@RequestMapping("/u")
public class UserController {
 
    @Autowired
    private UserServiceImpl userService;
 
    /**
     * MP 批量插入
     */
    @RequestMapping("/savebatch")
    public boolean saveBatch() {
        List<User> list = new ArrayList<>();
        // 待添加(用戶)數據
        for (int i = 0; i < 1000; i++) {
            User user = new User();
            user.setName("test:"+i);
            user.setPassword("123456");
            list.add(user);
        }
        // 批量插入
        return userService.saveBatch(list);
    }
}

③ Service 層代碼(重點)

接下來,我們要創(chuàng)建一個 UserService 接口,繼承 MP 框架中的 IService 接口,實現代碼如下:

?
1
2
3
4
5
6
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.model.User;
 
public interface UserService extends IService<User> {
 
}

然后再創(chuàng)建一個 UserService 的實現類:

?
1
2
3
4
5
6
7
8
9
10
11
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
 
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User>
        implements UserService {
 
}

PS:注意 UserServiceImpl 必須要繼承 MP 框架中的 ServiceImpl,不然要重寫很多方法。

④ Mapper 層代碼

Mapper 層的實現相對來說就比較簡單了,只需要創(chuàng)建一個 Mapper 類繼承 MP 框架中的 BaseMapper 類即可,實現代碼如下:

?
1
2
3
4
5
6
7
8
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
 
@Mapper
public interface UserMapper extends BaseMapper<User>{
 
}

PS:BaseMapper 提供了對某個對象(類)最基礎的 CRUD 操作。

總結

本文我們介紹了 MP(MyBatis Plus)中實現批量插入的具體實現步驟,它的核心是通過調用 MP 中 IService 提供的 saveBatch 方法來完成的,但如果項目中沒有引入 MP 框架該如何處理?是不是使用了 MP 就可以躺平了呢?不著急,下篇我們再聊批量插入的另一種方式(原生批量插入的實現方式),以及二者之間的優(yōu)缺點分析。

原文鏈接:https://www.cnblogs.com/vipstone/p/15339786.html

延伸 · 閱讀

精彩推薦
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 爱看久久| 成人情欲视频在线看免费 | 国产午夜亚洲精品 | 国产亚洲精品成人a | 黄色网址免费入口 | 久久亚洲成人 | 日本成人在线免费 | 欧美日韩在线看片 | 素人视频在线观看免费 | 国产无遮挡一区二区三区毛片日本 | 国产免费让你躁在线视频 | 欧美精品一区二区三区四区 | 91经典视频| 国产九色在线观看 | 狠狠99 | 亚洲一区二区 | 最新黄色电影网站 | 国产一级www | 国产精品视频一区二区三区四区国 | 国产精品久久久久久久久久10秀 | 国产精品久久久久久久久久久天堂 | 欧美成人黄色小视频 | 国产精品一区在线免费观看 | 久久久久久久.comav | 国产日韩在线观看视频 | 精品国产99久久久久久宅男i | 欧美成人免费在线视频 | 国产精品视频亚洲 | 精品久久久久久久久中文字幕 | 免费毛片在线视频 | 久久精品亚洲欧美日韩精品中文字幕 | 欧美色性 | 在线视频观看一区二区 | 在线成人www免费观看视频 | 免费观看国产视频 | 国产91丝袜在线熟 | 日韩精品一二三区 | 精选久久 | 国产成人高清成人av片在线看 | 中文字幕伦乱 | 九九综合九九 |