千家信息网

MyBatis Plus如何实现批量数据插入功能

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,小编给大家分享一下MyBatis Plus如何实现批量数据插入功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言最近
千家信息网最后更新 2024年09月22日MyBatis Plus如何实现批量数据插入功能

小编给大家分享一下MyBatis Plus如何实现批量数据插入功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    前言

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

    /** * 插入操作 */@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.com/guide/,咱们本文重点介绍一下 MP 实现批量插入的具体步骤。

    1.引入 MP 框架

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

        com.baomidou    mybatis-plus-boot-starter    mybatis-plus-latest-version

    注意:mybatis-plus-latest-version 表示 MP 框架的最新版本号,可访问 https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 查询最新版本号,但在使用的时候记得一定要将上面的 "mybatis-plus-latest-version"替换成换成具体的版本号,如 3.4.3 才能正常的引入框架。

    2.创建数据库和表

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

    -- ------------------------------ 创建数据库-- ----------------------------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 实体类:

    import lombok.Getter;import lombok.Setter;import java.util.Date;@Getter@Setterpublic class User {    private int id;    private String name;    private String password;    private Date createtime;}

    ② Controller 层代码

    本文的核心是使用 MP 框架中,IService 类提供的 saveBatch 方法,来实现批量数据的插入功能,对应在 Controller 中的实现代码如下:

    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 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 接口,实现代码如下:

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

    然后再创建一个 UserService 的实现类:

    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;@Servicepublic class UserServiceImpl extends ServiceImpl        implements UserService {}

    PS:注意 UserServiceImpl 必须要继承 MP 框架中的 ServiceImpl,不然要重写很多方法。

    ④ Mapper 层代码

    Mapper 层的实现相对来说就比较简单了,只需要创建一个 Mapper 类继承 MP 框架中的 BaseMapper 类即可,实现代码如下:

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.demo.model.User;import org.apache.ibatis.annotations.Mapper;@Mapperpublic interface UserMapper extends BaseMapper{}

    PS:BaseMapper 提供了对某个对象(类)最基础的 CRUD 操作。

    以上是"MyBatis Plus如何实现批量数据插入功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

    0