使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是“新增“和“修改”方法是对一条数据进行处理的,如果有一万条数据就会和数据库交互一万次所以效率就低。如何提高效率就需要批量操作,如下展示批量插入和批量修改的代码,数据库使用mysql。

1、建表语句

CREATE TABLE yc_test_t  (
id int COMMENT '主键ID',
name VARCHAR(40) COMMENT '姓名',
note VARCHAR(100) COMMENT '备注',
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='测试';

2、实体类

package com.example.demo.domain;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; /**
* <p>
* 测试表。
* </p>
*
* @author yc
* @since 2024-09-03
*/
@TableName(value = "yc_test_t")
public class YcTestT {
private static final long serialVersionUID = 1L; /**
* ID。
*/
@TableId
private Integer id;
/**
* 姓名。
*/
private String name;
/**
* 备注。
*/
private String note; public void setId(Integer id) {
this.id = id;
} public Integer getId() {
return id;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setNote(String note) {
this.note = note;
} public String getNote() {
return note;
} }

3、mapper类

package com.example.demo.mapper;

import com.example.demo.domain.YcTestT;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; /**
* <p>
* 测试表 Mapper 接口。
* </p>
*
* @author yc
* @since 2024-09-03
*/
public interface YcTestTMapper extends BaseMapper<YcTestT> { }

4、接口

package com.example.demo.service;

import com.example.demo.domain.YcTestT;
import com.baomidou.mybatisplus.extension.service.IService; import java.util.Collection; /**
* <p>
* 测试表 服务类。
* </p>
*
* @author yc
* @since 2024-09-03
*/
public interface IYcTestTService extends IService<YcTestT> {
//批量插入
boolean saveBatch(Collection<YcTestT> entityList); /**
* 批量更新。
* @param oldNote 旧
* @param newNote 新
* @return status
*/
boolean updateBatch(String oldNote,String newNote); /**
* 单记录新增测试表。
*
* @param ycTestT 参数说明
* @return status
*/
int insert(YcTestT ycTestT); }

5、接口实现

package com.example.demo.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.demo.domain.YcTestT;
import com.example.demo.mapper.YcTestTMapper;
import com.example.demo.service.IYcTestTService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; /**
* <p>
* 测试表 服务实现类。
* </p>
*
* @author yc
* @since 2024-09-03
*/
@Service
public class YcTestTServiceImpl extends ServiceImpl<YcTestTMapper, YcTestT> implements IYcTestTService {
@Autowired
YcTestTMapper ycTestTMapper; //批量插入
@Override
public boolean saveBatch(Collection<YcTestT> entityList) {
return super.saveBatch(entityList);
} /**
* 批量更新。
* @param oldNote 旧
* @param newNote 新
* @return status
*/
@Override
public boolean updateBatch(String oldNote,String newNote) {
// 创建 UpdateWrapper 实例
UpdateWrapper<YcTestT> updateWrapper = new UpdateWrapper<>();
// 设置更新条件,例如根据 userId 更新
updateWrapper.lambda().eq(YcTestT::getNote, oldNote);
// 设置需要更新的字段值
updateWrapper.set("note",newNote); // 调用 update 方法进行批量更新
return this.update(updateWrapper);
} /**
* 单记录新增测试表。
*
* @param ycTestT 参数说明
* @return status
*/
@Override
public int insert(YcTestT ycTestT) {
return ycTestTMapper.insert(ycTestT);
} }

6、控制类

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.IYcTestTService;
import com.example.demo.domain.YcTestT;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.ArrayList;
import java.util.List; /**
* <p>
* 测试表 前端控制器。
* </p>
*
* @author yc
* @since 2024-09-03
*/ @RestController
@RequestMapping("/test")
public class YcTestTController { @Autowired
private IYcTestTService ycTestTService; /**
* 批量插入。
*
* @return AjaxResult
*/
@PostMapping(value = "/saveBatch")
@ResponseBody
public String saveBatch() { List<YcTestT> list = new ArrayList<>();
for (int i = 0; i < 5000; i++) {
YcTestT ycTestT = new YcTestT();
ycTestT.setId(i);
ycTestT.setName("张三" + (i + ""));
ycTestT.setNote("旧");
list.add(ycTestT);
if ((i + 1) % 3000 == 0) {
try {
ycTestTService.saveBatch(list);
} catch (Exception e) {
// 批量插入失败,改为单条插入
for (int j = 0; j < list.size(); j++) {
try {
YcTestT testT = list.get(j);
//单条插入
ycTestTService.insert(testT);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} finally {
list.clear();
}
}
}
//处理除3000余数的数据
if (list.size() >= 1) {
ycTestTService.saveBatch(list);
} return "批量插入成功!";
} @PostMapping(value = "/updateBatch")
@ResponseBody
public String updateBatch() {
ycTestTService.updateBatch("旧","新");
return "批量更新成功!";
} }

7、postman接口

批量插入:http://127.0.0.1:8080/test/saveBatch

批量修改:http://127.0.0.1:8080/test/updateBatch

8、效果-后台执行的更新效果是一次批量更新

  源码获取方式(免费):

(1)登录-注册:http://resources.kittytiger.cn/

(2)签到获取积分

(3)搜索:mybatis-plus批量增加-修改样例

(4)文件列表

mybatis-plus批量增加、批量修改样例+建表语句+postman接口的更多相关文章

  1. mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询

    1. 1)MySQL 连接本地数据库,从cmd中进入mysql命令编辑器: root root分别为用户名和密码 mysql -uroot -proot 2)MySQL 连接本地数据库,用户名为“ro ...

  2. c#调用存储过程实现批量增加和修改数据

    1 例如当我在编辑表格数据,一次编辑了多行需要保存到数据库时,就需要判断数据库中是否已经存在,存在则修改,不存在则新增一条或多条数据,即所谓批量增加或者跟新数据. 首先需要构建数据包,把要添加或者跟新 ...

  3. Oracle 批量增加 / 批量跟新

    在使用oracl过程中踩到好多坑,在此记录,也分享给大家. 第一:批量插入 代码一(在为明确表和字段的情况下,动态批量增加): @Insert("<script> " ...

  4. Mysql批量删除和修改某个前缀的表

    1.批量删除某个前缀的表名,首先选出这些个表. select concat( 'drop table ', table_name, ';' ) from information_schema.tabl ...

  5. 利用MySQL原数据信息批量转换指定库数据表生成Hive建表语句

    1.写出文件工具类 package ccc.utile; import java.io.*; /** * @author ccc * @version 1.0.0 * @ClassName Write ...

  6. 批量导出hive表的建表语句

    转的这里的 首先先导出所有的table表 hive -e "use xxxdb;show tables;" > tables.txt 然后再使用hive内置语法导出hive表 ...

  7. ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

    转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...

  8. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

  9. ECharts组件应用样例代码

    一.从Echarts官网上下载最新版本组件 Echarts是百度开发的开源Web图表组件,界面美观,使用简单.组件下载地址:http://echarts.baidu.com/echarts2/doc/ ...

  10. SQL SEVER 2008中的演示样例数据库

    SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...

随机推荐

  1. Luogu P5745 区间最大和

    原题链接:Luogu P5745 区间最大和 初看这道题,

  2. 「Pygors跨平台GUI」2:安装MinGW-w64、MSYS2还是WSL2

    「Pygors系列」一句话导读: MinGW-w64只有编译器,MSYS2带着更新环境,WSL2实用性比较高 历史与渊源   Windows平台 Linux平台 二进制兼容 WSL2:运行Linux程 ...

  3. [oeasy]python0050_动态类型_静态类型_编译_运行

    动态类型_静态类型 回忆上次内容 上次了解了 帮助文档的 生成 开头的三引号注释 可以生成 帮助文档 文档 可以写成网页   python3 本身 也有 在线的帮助手册   目前的程序 提高了 可读性 ...

  4. [oeasy]python0041_ 转义字符_转义序列_escape_序列_sequence

    转义序列 回忆上次内容 上次回顾了5bit-Baudot博多码的来历 从 莫尔斯码 到 博多码 原来 人 来 收发电报 现在 机器 来 收发电报 输入方式 从 电键 改成 键盘 输出方式 从 纸带 变 ...

  5. 测试思想-流程规范 用例优先级定义与使用规范 V1.0

    用例优先级定义与使用规范 V1.0 By:授客   1.      规范说明 目的 对软件测试过程中的用例级别进行详细描述及标准化定义,明确不同测试阶段的测试范围,减少测试冗余投入,提高测试效率,建立 ...

  6. P6680 [CCO2019] Marshmallow Molecules 题解

    P6680 题意 一个 \(n\) 点 \(m\) 边的图,图无重边,无自环. 满足这样一条性质:如果三边互不相等,则三边可以构成三角形. 思路 思路简单,用集合的思想来做. 引用一下 K0stlin ...

  7. Python threading实现多线程 基础篇

    讲多线程前,先要了解什么是进程,什么是线程,已经知道的请略过. 一.进程与线程: 进程是资源分配的最小单位,一个程序至少有一个进程. 线程是程序执行的最小单位,一个进程至少有一个线程. 进程都有自己独 ...

  8. Jmeter二次开发函数 - 将指定时间转换为时间戳

    1.达到效果:在jmeter的函数助手增加一个"timeStamp"函数,调用"timeStamp"函数可以将用户传入的时间转换为时间戳. 2.eclipse项 ...

  9. 【Java】JDBC Part2 工具类封装实现

    JDBC 工具类封装实现 - 注册和配置都放在静态代码块完成 - 静态方法获取连接,和释放资源 - 本类不产生实例 - 5版本 + 已经可以实现无驱动注册,所以驱动部分注释了 package cn.d ...

  10. Ubuntu18.04 系统环境下 vscode中忽略pylint某些错误或警告

    相关: ubuntu18.04系统环境下使用vs code安装pylint检查python的代码错误 ====================================== 假设已经在前文(ht ...