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,性能最好
相关文章:
02MyBatisPlus条件构造器,自定义SQL,Service接口
一、条件构造器 1.MyBatis支持各种复杂的where条件,满足开发的需求 Wrapper是条件构造器,构建复杂的where查询 AbstractWrapper有构造where条件的所有方法,QueryWrapper继承后并有自己的select指定查询字段。UpdateWrapper有指定更新的字段的…...
c语言练习11周(6~10)
输入任意字串,将串中除了首尾字符的其他字符升序排列显示,串中字符个数最多20个。 题干 输入任意字串,将串中除了首尾字符的其他字符升序排列显示,串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…...
钉钉API与集简云无代码开发连接:电商平台与营销系统的自动化集成
连接科技与能源:钉钉API与集简云的一次集成尝试 在数字化时代,许多公司面临着如何将传统的工作方式转变为更智能、高效的挑战。某能源科技有限公司也不例外,他们是一家专注于能源科技领域的公司,产品包括节能灯具、光伏逆变器、电…...
C++算法:包含三个字符串的最短字符串
涉及知识点 有序集合 字符串 题目 给你三个字符串 a ,b 和 c , 你的任务是找到长度 最短 的字符串,且这三个字符串都是它的 子字符串 。 如果有多个这样的字符串,请你返回 字典序最小 的一个。 请你返回满足题目要求的字符串。…...
华为开源carbondata中的使用问题处理
carbondata中的使用问题处理 Q:什么是不良记录? A:由于数据类型不兼容而无法加载到CarbonData中的记录或为空或具有不兼容格式的记录被归类为不良记录。 Q:CarbonData中的不良记录存储在哪里? A:不良记录…...
AI:76-基于机器学习的智能城市交通管理
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
区块链游戏,游戏开发
区块链游戏是一种基于区块链技术的新兴游戏类型,它具有去中心化、安全性高、透明度高、可追溯等特点。与传统的游戏开发相比,区块链游戏开发需要更多的技术和知识储备,同时也需要更加注重游戏本身的玩法和用户体验。 在区块链游戏中ÿ…...
单片机程序无法下载?
原因一:电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题: 1. 电源电压不足:如果STM32微控制器没有足够的电压供应,它可能无法正常工作或下载程…...
【数据库】【sql】如何用SQL实现跨行计算
【背景】 这里的跨行计算不是指整体聚合类的函数比如SUM等的功能,而是指递归算法。 比如我接到有需求,有一个结果字段需要是目前所有行该字段的和,这是属于递归类的算法,SQL中如何实现呢? 【方法】 可以使用窗口函数…...
Oracle(概念含安装)
Oracle是一种关系数据库管理系统(RDBMS),是由美国甲骨文公司(Oracle Corporation)开发的。它是一个客户端/服务器系统,可以在各种操作系统上运行,包括Windows、Linux和Unix等。Oracle的设计重点…...
P6入门:项目初始化4-项目详情之预算日志及汇总Budget
前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…...
CSS 中BFC是什么?
在CSS中,BFC(块级格式化上下文)是一个重要的概念,它对于理解和解决布局中的一些问题非常有帮助。本文将深入探讨BFC是什么,以及如何使用代码来详细解释BFC的概念和应用。 引言 在Web开发中,页面布局是一个…...
uniapp的几种跳转方式
1、UniApp是一个跨平台的应用开发框架,可以用于开发同时支持多个平台(如iOS、Android、H5等)的应用程序。在UniApp中,有多种方式可以实现页面之间的跳转。以下是其中一些常用的跳转方式: 页面跳转(navigat…...
【MySQL】初识数据库
目录 1.概念2.基本使用显示当前的数据库列表创建数据库使用数据库创建表向表中插入数据查看创建的表中的数据 3.SQL的分类4.存储引擎 1.概念 MySQL本质是基于C(mysql)S(mysqld)模式的一种网络服务。 mysqld:它是数据库的服务器端(这是一个守护进程&…...
计算机网络(一)
一、什么是计算机网络、计算机协议? 计算机网络就是由计算机作为收发端,不同计算机相互连接的网络,包括互联网(Internet),公司或者家用网络(intranet)等等;其中Internet…...
英语经典名句,柯桥成人英语培训
.Every man has his price.--“天生我材必有用必有用”. Well begun is half done.--“好的开端是成功的一半”. Good wine needs no bush.--“好酒不怕巷子深”. Little stone fell great oaks.--“滴水穿石” Man is good but old is hot.--"人是实的好,…...
@JSONField或@JsonProperty注解使用
一、需求 使用JSONField或JsonProperty注解,来解决bean与json字段不一致问题,或者字段定义不符合前端所需要的标准,最近在项目中发现实体类属性中,同时使用了JSONField和JsonProperty注解,用于重新声明属性key。有时候…...
高效简洁的文档翻译网站
一款简单而强大的文档翻译网站 一款文字/文件翻译的网站,支持多个领域的翻译,支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度,每月系统还会随机赠送翻译额度,…...
SpringBoot自动装配定义先后顺序失效原因极其解析
SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …...
API 集成测试工具Hitchhiker 0.1.1 正式发布
Hitchhiker 是一款开源的 Restful Api 集成测试工具,你可以在轻松部署到本地,和你的 team 成员一起管理 Api。 能做什么 * Team 协作开发 Api * Api 历史修改记录及支持 diff 展示 * 支持多环境变量及运行时变量 * 支持 Schedule 及批量 run * 不同…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...
