Mybatis Plus 增删改查方法(一、增)

server/2024/12/4 21:08:39/

先定义一个简单的测试表,执行脚本如下:

create table user(id bigint primary key auto_increment,name varchar(255) not null,age int not null default 0 check (age >= 0)
);

根据Spingboot+mybatisplus的结构根据表自行构建结构,大致如下: 

Mapper Interface(Mapper层)

insert

// 插入一条记录
int insert(T entity);/*** Mapper层 提供的新增方法  insert() 方法:int insert(T entity)*/public void insert_test(User user) {int insert = userMapper.insert(user);// 受影响行数System.out.println("insert:" + insert);// 获取插入数据的主键 IDLong id = user.getId();System.out.println("id:" + id);}

功能描述: 插入一条记录。
返回值: int,表示插入操作影响的行数,通常为 1,表示插入成功。
参数说明:

类型参数名描述
Tentity实体对象

Service Interface(Service层)

save

// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);/***Service 层  提供的新增方法  save() 方法:boolean save(T entity)*/public void save_test(User user) {boolean save = this.save(user);//是否保存成功System.out.println("save:" + save);// 返回主键IDLong id = user.getId();System.out.println("主键 ID: " + id);}/*** Service 层  提供的批量新增方法  saveBatch() 方法:boolean saveBatch(Collection<T> entityList)* 伪批量插入,命名虽然包含了批量的意思,但这不是真的批量插入* @param userList*/public void savaBatch_test(List<User> userList) {boolean saveBatch = this.saveBatch(userList);System.out.println("saveBatch:" + saveBatch);}/*** 伪批量插入,int 表示批量提交数,默认为 1000*   savaBatch(Collection<T>, int) : boolean*   int 表示批量提交数,即多少 SQL 操作执行一次,默认为 1000* @param userList*/public void savaBatch_test2(List<User> userList) {boolean saveBatch = this.saveBatch(userList, 2);System.out.println("saveBatch:" + saveBatch);}

功能描述: 插入记录,根据实体对象的字段进行策略性插入。
返回值: boolean,表示插入操作是否成功。
参数说明:

类型参数名描述
Tentity实体对象
Collection<T>entityList实体对象集合
intbatchSize插入批次数量

注意:savaBatch 伪批量插入,命名虽然包含了批量的意思,但这不是真的批量插入。

批量新增源码分析

这里用到了insert方法,再往executeBatch里看:

    public static <E> boolean executeBatch(Class<?> entityClass, Log log, Collection<E> list, int batchSize, BiConsumer<SqlSession, E> consumer) {// 断言需要批处理数据集大小不等于1Assert.isFalse(batchSize < 1, "batchSize must not be less than one", new Object[0]);// 判空数据集,若不为空,则开始执行批量处理return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, (sqlSession) -> {int size = list.size();// 将批处理大小与传入的操作集合大小进行比较,取最小的那个int idxLimit = Math.min(batchSize, size);int i = 1;// 迭代器循环for(Iterator var7 = list.iterator(); var7.hasNext(); ++i) {// 获取当前需要执行的数据库操作E element = var7.next();// 回调 sqlSession.insert() 方法consumer.accept(sqlSession, element);// 判断是否达到需要批处理的阀值if (i == idxLimit) {// 开始批处理,此方法执行并清除缓存在 JDBC 驱动类中的执行语句sqlSession.flushStatements();idxLimit = Math.min(idxLimit + batchSize, size);}}});}

 相比较自己手动 for 循环执行插入,Mybatis Plus 这个伪批量插入性能会更好些,内部会将每次的插入语句缓存起来,等到达到 1000 条的时候,才会统一推给数据库,虽然最终在数据库那边还是一条一条的执行 INSERT,但还是在和数据库交互的 IO 上做了优化。

saveOrUpdate(增或改)

// TableId 注解属性值存在则更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

功能描述: 根据实体对象的主键 ID 进行判断,存在则更新记录,否则插入记录。
返回值: boolean,表示插入或更新操作是否成功。
参数说明:

类型参数名描述
Tentity实体对象
Wrapper<T>updateWrapper实体对象封装操作类 UpdateWrapper
Collection<T>entityList实体对象集合
intbatchSize插入批次数量

例子: 

 /*** Service 层  提供的新增或更新方法  saveOrUpdate() 方法:boolean saveOrUpdate(T entity)* 保存或者更新。即当你需要执行的数据,数据库中不存在时,就执行插入操作*  如设置了主键 ID,因为主键 ID 必须是唯一的,Mybatis Plus 会先执行查询操作,判断数据是否存在,存在即执行更新,否则,执行插入操作*  TableId 注解属性值存在则更新记录,否插入一条记录* @param user*/public void saveOrUpdate_test(User user){boolean saveOrUpdate = this.saveOrUpdate(user);System.out.println("saveOrUpdate:" + saveOrUpdate);}/***  Service 层  提供的新增或更新方法 boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);*  updateWrapper 条件构造器*  根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法* @param user*/public void saveOrUpdate_test2(User user){LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();wrapper.eq(User::getName, user.getName());boolean saveOrUpdate = this.saveOrUpdate(user, wrapper);System.out.println("saveOrUpdate:" + saveOrUpdate);}/*** Service 层  提供的批量新增或更新方法  saveOrUpdateBatch() 方法:boolean saveOrUpdateBatch(Collection<T> entityList)* @param userList*/public void saveOrUpdateBatch_test(List<User> userList){boolean saveOrUpdateBatch = this.saveOrUpdateBatch(userList);System.out.println("saveOrUpdateBatch:" + saveOrUpdateBatch);}/*** Service 层  提供的批量新增或更新方法  saveOrUpdateBatch() 方法:boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize)* int 表示批量提交数,即多少 SQL 操作执行一次,默认为 1000* @param userList*/public void saveOrUpdateBatch_test2(List<User> userList){boolean saveOrUpdateBatch = this.saveOrUpdateBatch(userList, 3);System.out.println("saveOrUpdateBatch:" + saveOrUpdateBatch);}


http://www.ppmy.cn/server/146259.html

相关文章

MySQL中的锁与MVCC

目录 锁 共享锁&#xff08;Shared Locks&#xff09; 排他锁&#xff08;Exclusive Locks&#xff09; 意向锁&#xff08;Intention Locks&#xff09; 记录锁&#xff08;Record Locks&#xff09; 临键锁&#xff08;Next-Key Locks&#xff09; MVCC机制 MVCC的核心…

【线上问题记录 | 排查网络连接问题】

问题描述 现在有我们程序是部署在服务器A的&#xff0c;A链接的是B。程序从B的redis进行存储和取数据的。 我们的业务是: 信息展示&#xff0c;也就是如果发现机器有异常了&#xff0c;实时进行监控。突然发现有一天&#xff0c;信息显示延迟了。 然后我们就开始排查究竟什么原…

在xml的sql的子查询中使用row_number over之后再在mapper的接口层传入Page对象实现分页功能,出现Bug

1.报错信息复现&#xff1a; Mapper接口&#xff1a; List<UserInfo> queryUserPage(Param(“vo”) UserQury query,Page<UserInfo> page); UserQury 类中的状态字段&#xff1a; ApiModelproperty(“状态”) private String status; Xml中sql如下&#xff1…

详解SpringCloud集成Camunda7.19实现工作流审批(二)

本章将分享的是camunda流程设计器--Camunda Modeler的基本使用&#xff08;对应camunda版本是7.19&#xff09;&#xff0c;包括bpmn流程图画法&#xff0c;各种控件使用以及一些日常业务场景的流程图的实现 参考资料&#xff1a; Camunda BPMN 基础组件-CSDN博客 Camunda: Exe…

【PX4_Autopolite飞控源码】中飞控板初始化过程中的引脚IO控制(拉低/拉高)

先选择自己飞控板支持的硬件平台 打开对应的路径我的是Desktop/px4/PX4-Autopilot/boards/zhty/nora 找到board_config.h文件&#xff0c;打开nora后再往下去找Desktop/px4/PX4-Autopilot/boards/zhty/nora/src/borad_config.h 打开后可以看到有很多GPIO引脚的定义&#xff0c…

UPLOAD LABS | PASS 01 - 绕过前端 JS 限制

关注这个靶场的其它相关笔记&#xff1a;UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 本关的目标是上传一个 WebShell 到目标服务器上&#xff0c;并成功访问&#xff1a; 我们直接尝试上传后缀为 .php 的一句话木马&#xff1a; 如上&#xff0c;靶场弹…

鲜花销售管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…

Day48 | 动态规划 :线性DP 编辑距离

Day48 | 动态规划 &#xff1a;线性DP 编辑距离 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 最长公共子序列 编辑距离_哔哩哔哩_bilibili 动态规划学习&#xff1a; 1.思考回溯法&#xff08;深度优先遍历…