02MyBatisPlus条件构造器,自定义SQL,Service接口

一、条件构造器

1.MyBatis支持各种复杂的where条件,满足开发的需求

 Wrapper是条件构造器,构建复杂的where查询

 AbstractWrapper有构造where条件的所有方法,QueryWrapper继承后并有自己的select指定查询字段。UpdateWrapper有指定更新的字段的方法

2.案例:基于QueryWrapper查询

①查询出名字带“o”的,存款大于等于1000元的人的id,username,info,balance字段

@Test
void test(){// 构建查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id","username","info","balance").like("username","o") // where条件.ge("balance",1000);// 查询user2Mapper.selectList(wrapper);
}

LambdaQueryWrapper方法

@Test
void testl() {// 构建查询条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().select(User::getId, User::getUsername, User::getInfo, User::getBalance).like(User::getUsername, "o") // where条件.ge(User::getBalance, 1000);// 查询List<User> users = user2Mapper.selectList(wrapper);System.out.println(users);
}

②更新用户名为jack的用户的余额为2000

@Test
void test2(){// 更新字段User user = new User();user.setBalance(2000);// 构建查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");user2Mapper.update(user, wrapper);
}

update(更新的数据,更新的条件)

3.案例:基于UpdateWrapper更新

①更新id为1,2,4的用户的金额扣200

 

@Test
void test3() {// 更新条件的idsList<Long> ids = new ArrayList<>();ids.add(1L);ids.add(2L);ids.add(4L);// 更新的内容和条件UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id",ids);user2Mapper.update(null, wrapper);
}

4.条件构造器的用法总结

QueryWrapper和LambdaQueryWrapper通常构建select,delete,update的wher条件部分

②UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用

③尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码。

二、自定义SQL

1.用法

通过MP的Wrapper来构建复杂的where条件,然后自己定义SQL语句剩下的部分。

2.案例将id在指定范围内的用户(1,2,4)的余额扣减指定值

把mp构建好的条件传递到mapper,进行sql组装

①基于Wrapper构建where条件

@Test
void test3() {// 更新条件的idsList<Long> ids = new ArrayList<>();ids.add(1L);ids.add(2L);ids.add(4L);// 更新的内容int amount = 200;// 编写where更新条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId,ids);// 用户自定义SQLuser2Mapper.updateBalanceByIds(wrapper,amount);
}

②用户自定义mapper方法参数中用Param注解声明wrapper变量,必须是ew

void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount")int amount);

③编写sql语句,进行where拼接

<update id="updateBalanceByIds">update tb_user set balance = balance - #{amount} ${ew.customSqlSegment}
</update>

三、Service接口

1.IService接口的方法

 2.IService接口的继承

 ①自定义Service接口继承IService接口

 ②自定义Service实现类,实现自定义接口并继承ServiceImpl类

 ③新增用户案例

@PostMapping
@ApiOperation("新增")
public void addUser(@RequestBody UserFormDTO userFormDTO){// DTO拷贝到POUser user = new User();BeanUtils.copyProperties(userFormDTO,user);// 保存userService.save(user);
}

3.案例:IService的Lambda查询

需求:实现一个根据复杂条件查询用户的接口,查询条件如下:

name:用户名关键字,可以为空

status:用户状态,可以为空

原始的MyBatis

 LambdaQuery

@Override
public List<User> getUserList(UserQuery query) {// 获取参数String name = query.getName();Integer status = query.getStatus();// 构造查询语句return lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).list();
}

4.案例:IService的Lambda更新

需求:改造根据id修改用户余额的接口,要求如下

完成对用户状态校验

完成对用户余额校验

如果扣减后余额为0,则将用户status修改为冻结状态2

@Service
public class UserServiceImpl extends ServiceImpl<User2Mapper, User> implements IUserService {@Overridepublic void deductBalance(String id, Integer money) {// 查询用户User user = getById(id);// 检验用户状态if (user == null || user.getStatus() == 2) {throw new RuntimeException("用户状态异常");}// 检验余额if (user.getBalance() < money) {throw new RuntimeException("余额不足");}// 扣减余额int remainBalance = user.getBalance() - money;// 执行更新lambdaUpdate().set(User::getBalance,remainBalance).set(remainBalance==0,User::getStatus,2).eq(User::getId,id).update();}

5.IService的批量新增

需求:批量插入10万条用户数据,并作出对比:

  • 普通for循环插入
  • IService的批量插入

①构建批量插入的方法

// 批量插入的方法
private User buildUser(int i){User user = new User();user.setUsername("Wang_"+i);user.setPassword("123");user.setPhone("18688990011"+i+"");user.setBalance(200);user.setInfo("{\"age\": 26, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());return user;
}

②使用普通的for循环插入

@Test
void testSaveOneByOne() {long b = System.currentTimeMillis();// 循环插入for (int i = 1; i < 100000; i++) {userService.save(buildUser(i));}long e = System.currentTimeMillis();System.out.println("耗时" + (e - b));
}

耗时:210005ms,210s

②使用批处理

@Test
void testSaveBatch(){// 每次批量插入1000,插入100次就是10万条数据// 1.准备1个容量为1000的集合List<User> list = new ArrayList<>(1000);long b = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {// 2.添加一个userlist.add(buildUser(i));// 3.每1000条批量插入一次if (i % 1000 == 0){// 4. 批量插入userService.saveBatch(list);// 5. 清空list.clear();}}long e = System.currentTimeMillis();System.out.println("耗时" + (e - b));
}

耗时:26258ms,26s

性能进一步提升,配置jdbc参数,开rewriteBatchedStatements=true

 

总结:

  • 普通for循环逐条插入速度极差,不推荐
  • MP的批量新增,基于预编译的批处理,性能不错
  • 配置jdbc参数,开rewriteBatchedStatements=true,性能最好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/189383.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 winget 在 Windows 上安装 kubectl

目录 kubectl 是什么&#xff1f; 安装 kubectl 以管理员身份打开 PowerShell 使用 winget 安装 kubectl 测试一下&#xff0c;确保安装的是最新版本 导航到你的 home 目录&#xff1a; 验证 kubectl 配置 kubectl 是什么&#xff1f; kubectl 是 Kubernetes 的命令行工…

STM32 寄存器配置笔记——GPIO配置输出

一、概述 本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置&#xff0c;输出模式配置。以STM32F10xxx系列为例&#xff0c;配置PA8、PD2端口作为输出&#xff0c;输出高/低电平。 二、配置流程 1&#xff09;GPIO外设时钟 通过查找STM32F10xxx中文参考手册得知&#xf…

江西开放大学引领学习新时代:电大搜题助力学子迈向成功

江西开放大学&#xff08;简称江西电大&#xff09;一直以来致力于为学子提供灵活便捷的学习服务。近年来&#xff0c;携手电大搜题微信公众号&#xff0c;江西开放大学以其卓越的教学质量和创新的教学手段&#xff0c;为广大学子开启了一扇通向成功的大门。 作为一家知名的远…

asp.net 在线音乐网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 在线音乐网站系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net 在线音乐网站系统1 应用…

数据结构—内部排序(上)

文章目录 8.内部排序(上)(1).排序基础#1.为什么是内部排序#2.排序的稳定性 (2).冒泡排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (3).选择排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (4).插入排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (5).希…

advanced-css: No.1

本套教程学习来自视频&#xff1a;https://www.bilibili.com/video/BV1n94y1o7yS/?p7&spm_id_frompageDriver&vd_sourceb79be8283df9418cb45941cc0bd583c6 案例 实现效果图 代码 HTML: <!DOCTYPE html> <html lang"en"><head><meta c…

Docker - 安装

Docker安装 Docker的基本组成 镜像&#xff08;image&#xff09;: ​ Docker镜像就好比是一个模板&#xff0c;可以通过这个模板来创建容器服务&#xff0c;tomcat镜像 -> run -> tomcat01容器&#xff08;提供服务器&#xff09;&#xff0c;通过这个镜像可以创建多个…

Git基本概念和使用方式

Git 是一种版本控制系统&#xff0c;用于管理文件版本的变化。以下是其基本概念和使用方式&#xff1a; 仓库&#xff08;repository&#xff09;&#xff1a;Git 存储代码的地方&#xff0c;可以理解为一个项目的文件夹。提交&#xff08;commit&#xff09;&#xff1a;Git …

联邦学习的梯度重构

联邦学习中的梯度出现挑战&#xff1a; 暴露原始训练数据的某些属性 利用生成对抗网络生成与私有训练图像类似的图片 尽管许多研究已经证实从梯度中重构原始数据的可能性&#xff0c;这些研究通常基于一个前提假设&#xff0c;即用户上传的梯度是全梯度。 联邦学习系统更倾…

栈和队列:栈

栈的概念&#xff1a; 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。…

Antd G6实现自定义工具栏

在使用g6实现知识图谱可视化中&#xff0c;产品经理提出了有关图谱操作的不少功能&#xff0c;需要放置在工具栏中&#xff0c;其中有些功能不在g6自带的功能里&#xff0c;且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢&#xff1f; g6官方的工具栏案例…

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件&#xff0c;有时候我们需要对一些重要的Excel文件进行加密&#xff0c;以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一&#xff1a;通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码&#xff08;密码只可以使数字、字…

从0开始python学习-34.pytest常用插件

目录 1. pytest-html&#xff1a;生成HTML测试报告 2.pytest-xdist&#xff1a;并发执行用例 3. pytest-order&#xff1a;自定义用例的执行顺序 4. pytest-rerunfailures&#xff1a;用例失败时自动重试 5. pytest-result-log:用例执行结果记录到日志文件 1. pytest-html…

Nacos热更新

Nacos热更新 相比其他注册中心&#xff0c;Nacos的优势之一在于热更新。 热更新&#xff0c;就是不需要重启服务&#xff0c;就能够更新配置。 nacos配置中心 首先&#xff0c;需要搭建 Nacos&#xff0c;详情见&#xff1a; https://www.cnblogs.com/expiator/p/17392549.h…

Docker本地部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

数据管理系统-week1-文件系统、数据库和数据库管理系统

文章目录 前言一、 文件系统文件系统的限制 二、 数据库系统三、 数据库管理系统参考文献 前言 一、 文件系统 对于更高级的数据处理应用程序来说&#xff0c;基于数据块的持久存储逻辑模型过于简单数据块序列被划分为称为文件的数据块的可变子序列&#xff0c;与文件相关的名…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打&#xff0c;yyds&#xff01; 目录 一.欢迎来到我的酒馆二.键盘规格三.键盘分区 二.键盘规格 经常看视频&#xff0c;看到别人在键盘上一通干净利索的操作&#xff0c;就打出想要的文字。心里突然来一句&#xff1a;卧槽&#xff0c;打字贼快啊&#…

pytest全局变量的使用

这里重新阐述下PageObject设计模式&#xff1a; PageObject设计模式是selenium自动化最成熟&#xff0c;最受欢迎的一种模式&#xff0c;这里用pytest同样适用 这里直接提供代码&#xff1a; 全局变量 conftest.py """ conftest.py 全局变量&#xff0c;主要实…

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语…