好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

一文了解MyBatis Plus批量数据插入功能

前言

最近 Review 小伙伴代码的时候,发现了一个小小的问题,小伙伴竟然在 for 循环中进行了 insert (插入)数据库的操作,这就会导致每次循环时都会进行连接、插入、断开连接的操作,从而导致一定的性能问题,简化后代码如下:

?

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;

}

这样做并不会改变程序最终的执行结果,但会对程序的执行效率带来很大的影响,就好比你现在要从 A 地点送 10 件货到 B 地点,你可以选择 1 次送 1 件,送 10 次的方案;也可以选择 1 次送 10 件,送 1 次的方案,请问你会选择哪种?这就是多次循环插入和批量一次插入的问题。?

PS:要插入的数据量越大,批量插入的时间(相比于循环多次插入来说)也越短、其优势也越大。

批量插入实现方案

本文我们使用 MyBatis-Plus(下文简称 MP)自带的 saveBatch 方法,来实现数据的批量插入功能,因为 MP 不是本文讨论的重点,所以这里咱们就不介绍了,如果有不熟悉的朋友可以去他的官方自行恶补:https://baomidou测试数据/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测试数据/artifact/com.baomidou/mybatis-plus-boot-starter 查询最新版本号,但在使用的时候记得一定要将上面的 [mybatis-plus-latest-version]替换成换成具体的版本号,如 3.4.3 才能正常的引入框架。

2.创建数据库和表

此步骤可省略,主要用于本文功能的实现,创建数据库和数据表的脚本如下:

?

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

-- ----------------------------

-- 创建数据库

-- ----------------------------

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

DROP DATABASE IF EXISTS `testdb`;

CREATE DATABASE `testdb`;

USE `testdb`;

 

-- ----------------------------

-- 创建 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.具体代码实现(重点)

① 实体类

先来创建数据库所对应的 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 层代码(重点)

接下来,我们要创建一个 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> {

 

}

然后再创建一个 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 层的实现相对来说就比较简单了,只需要创建一个 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 就可以躺平了呢?不着急,下篇我们再聊批量插入的另一种方式(原生批量插入的实现方式),以及二者之间的优缺点分析。

原文链接:https://HdhCmsTestcnblogs测试数据/vipstone/p/15339786.html

查看更多关于一文了解MyBatis Plus批量数据插入功能的详细内容...

  阅读:29次