溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis Plus如何實現(xiàn)批量數(shù)據(jù)插入功能

發(fā)布時間:2021-09-27 10:44:32 來源:億速云 閱讀:151 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下MyBatis Plus如何實現(xiàn)批量數(shù)據(jù)插入功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    前言

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

    /**
     * 插入操作
     */
    @RequestMapping("/save")
    public Object save() {
        boolean flag = false; // 返回結(jié)果
        // 待添加(用戶)數(shù)據(jù)
        for (int i = 0; i < 1000; i++) {
            User user = new User();
            user.setName("test:"+i);
            user.setPassword("123456");
            // 插入數(shù)據(jù)
            flag = userService.save(user);
            if(!flag) break;
        }
        return flag;
    }

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

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

    批量插入實現(xiàn)方案

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

    1.引入 MP 框架

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

    <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)建數(shù)據(jù)庫和表

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

    -- ----------------------------
    -- 創(chuàng)建數(shù)據(jù)庫
    -- ----------------------------
    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;
    
    -- ----------------------------
    -- 添加測試數(shù)據(jù)
    -- ----------------------------
    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.具體代碼實現(xiàn)(重點)

    ① 實體類

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

    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 方法,來實現(xiàn)批量數(shù)據(jù)的插入功能,對應在 Controller 中的實現(xiàn)代碼如下:

    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<>();
            // 待添加(用戶)數(shù)據(jù)
            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 接口,實現(xiàn)代碼如下:

    import com.baomidou.mybatisplus.extension.service.IService;
    import com.example.demo.model.User;
    
    public interface UserService extends IService<User> {
    
    }

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

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

    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 操作。

    以上是“MyBatis Plus如何實現(xiàn)批量數(shù)據(jù)插入功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI