日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis Plus 批量数据插入功能,yyds!

發(fā)布時(shí)間:2025/3/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis Plus 批量数据插入功能,yyds! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 | 王磊

來(lái)源 | Java中文社群(ID:javacn666)

轉(zhuǎn)載請(qǐng)聯(lián)系授權(quán)(微信ID:GG_Stone

最近 Review 小伙伴代碼的時(shí)候,發(fā)現(xiàn)了一個(gè)小小的問(wèn)題,小伙伴竟然在 for 循環(huán)中進(jìn)行了 insert (插入)數(shù)據(jù)庫(kù)的操作,這就會(huì)導(dǎo)致每次循環(huán)時(shí)都會(huì)進(jìn)行連接、插入、斷開(kāi)連接的操作,從而導(dǎo)致一定的性能問(wèn)題,簡(jiǎ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; }

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

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

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

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

1.引入 MP 框架

首先,打開(kāi)您的 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 框架的最新版本號(hào),可訪問(wèn) https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 查詢最新版本號(hào),但在使用的時(shí)候記得一定要將上面的 “mybatis-plus-latest-version”替換成換成具體的版本號(hào),如 3.4.3 才能正常的引入框架。

2.創(chuàng)建數(shù)據(jù)庫(kù)和表

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

-- ---------------------------- -- 創(chuàng)建數(shù)據(jù)庫(kù) -- ---------------------------- 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;-- ---------------------------- -- 添加測(cè)試數(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, '關(guān)羽', '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.具體代碼實(shí)現(xiàn)(重點(diǎn))

① 實(shí)體類

先來(lái)創(chuàng)建數(shù)據(jù)庫(kù)所對(duì)應(yīng)的 User 實(shí)體類:

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 方法,來(lái)實(shí)現(xiàn)批量數(shù)據(jù)的插入功能,對(duì)應(yīng)在 Controller 中的實(shí)現(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 {@Autowiredprivate 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 層代碼(重點(diǎn))

接下來(lái),我們要?jiǎng)?chuàng)建一個(gè) UserService 接口,繼承 MP 框架中的 IService 接口,實(shí)現(xiàn)代碼如下:

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

然后再創(chuàng)建一個(gè) UserService 的實(shí)現(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 層的實(shí)現(xiàn)相對(duì)來(lái)說(shuō)就比較簡(jiǎn)單了,只需要?jiǎng)?chuàng)建一個(gè) Mapper 類繼承 MP 框架中的 BaseMapper 類即可,實(shí)現(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 提供了對(duì)某個(gè)對(duì)象(類)最基礎(chǔ)的 CRUD 操作。

總結(jié)

本文我們介紹了 MP(MyBatis Plus)中實(shí)現(xiàn)批量插入的具體實(shí)現(xiàn)步驟,它的核心是通過(guò)調(diào)用 MP 中 IService 提供的 saveBatch 方法來(lái)完成的,但如果項(xiàng)目中沒(méi)有引入 MP 框架該如何處理?是不是使用了 MP 就可以躺平了呢?

不著急,下篇我們?cè)倭呐坎迦氲牧硪环N方式(原生批量插入的實(shí)現(xiàn)方式),以及二者之間的優(yōu)缺點(diǎn)分析。

總結(jié)

以上是生活随笔為你收集整理的MyBatis Plus 批量数据插入功能,yyds!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。