当前位置: 首页 > news >正文

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条件&#xff0c;满足开发的需求 Wrapper是条件构造器&#xff0c;构建复杂的where查询 AbstractWrapper有构造where条件的所有方法&#xff0c;QueryWrapper继承后并有自己的select指定查询字段。UpdateWrapper有指定更新的字段的…...

c语言练习11周(6~10)

输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。 题干 输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…...

钉钉API与集简云无代码开发连接:电商平台与营销系统的自动化集成

连接科技与能源&#xff1a;钉钉API与集简云的一次集成尝试 在数字化时代&#xff0c;许多公司面临着如何将传统的工作方式转变为更智能、高效的挑战。某能源科技有限公司也不例外&#xff0c;他们是一家专注于能源科技领域的公司&#xff0c;产品包括节能灯具、光伏逆变器、电…...

C++算法:包含三个字符串的最短字符串

涉及知识点 有序集合 字符串 题目 给你三个字符串 a &#xff0c;b 和 c &#xff0c; 你的任务是找到长度 最短 的字符串&#xff0c;且这三个字符串都是它的 子字符串 。 如果有多个这样的字符串&#xff0c;请你返回 字典序最小 的一个。 请你返回满足题目要求的字符串。…...

华为开源carbondata中的使用问题处理

carbondata中的使用问题处理 Q&#xff1a;什么是不良记录&#xff1f; A&#xff1a;由于数据类型不兼容而无法加载到CarbonData中的记录或为空或具有不兼容格式的记录被归类为不良记录。 Q&#xff1a;CarbonData中的不良记录存储在哪里&#xff1f; A&#xff1a;不良记录…...

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

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

区块链游戏,游戏开发

区块链游戏是一种基于区块链技术的新兴游戏类型&#xff0c;它具有去中心化、安全性高、透明度高、可追溯等特点。与传统的游戏开发相比&#xff0c;区块链游戏开发需要更多的技术和知识储备&#xff0c;同时也需要更加注重游戏本身的玩法和用户体验。 在区块链游戏中&#xff…...

单片机程序无法下载?

原因一&#xff1a;电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题&#xff1a; 1. 电源电压不足&#xff1a;如果STM32微控制器没有足够的电压供应&#xff0c;它可能无法正常工作或下载程…...

【数据库】【sql】如何用SQL实现跨行计算

【背景】 这里的跨行计算不是指整体聚合类的函数比如SUM等的功能&#xff0c;而是指递归算法。 比如我接到有需求&#xff0c;有一个结果字段需要是目前所有行该字段的和&#xff0c;这是属于递归类的算法&#xff0c;SQL中如何实现呢&#xff1f; 【方法】 可以使用窗口函数…...

Oracle(概念含安装)

Oracle是一种关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;是由美国甲骨文公司&#xff08;Oracle Corporation&#xff09;开发的。它是一个客户端/服务器系统&#xff0c;可以在各种操作系统上运行&#xff0c;包括Windows、Linux和Unix等。Oracle的设计重点…...

P6入门:项目初始化4-项目详情之预算日志及汇总Budget

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…...

CSS 中BFC是什么?

在CSS中&#xff0c;BFC&#xff08;块级格式化上下文&#xff09;是一个重要的概念&#xff0c;它对于理解和解决布局中的一些问题非常有帮助。本文将深入探讨BFC是什么&#xff0c;以及如何使用代码来详细解释BFC的概念和应用。 引言 在Web开发中&#xff0c;页面布局是一个…...

uniapp的几种跳转方式

1、UniApp是一个跨平台的应用开发框架&#xff0c;可以用于开发同时支持多个平台&#xff08;如iOS、Android、H5等&#xff09;的应用程序。在UniApp中&#xff0c;有多种方式可以实现页面之间的跳转。以下是其中一些常用的跳转方式&#xff1a; 页面跳转&#xff08;navigat…...

【MySQL】初识数据库

目录 1.概念2.基本使用显示当前的数据库列表创建数据库使用数据库创建表向表中插入数据查看创建的表中的数据 3.SQL的分类4.存储引擎 1.概念 MySQL本质是基于C(mysql)S(mysqld)模式的一种网络服务。 mysqld&#xff1a;它是数据库的服务器端&#xff08;这是一个守护进程&…...

计算机网络(一)

一、什么是计算机网络、计算机协议&#xff1f; 计算机网络就是由计算机作为收发端&#xff0c;不同计算机相互连接的网络&#xff0c;包括互联网&#xff08;Internet&#xff09;&#xff0c;公司或者家用网络&#xff08;intranet&#xff09;等等&#xff1b;其中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.--"人是实的好&#xff0c;…...

@JSONField或@JsonProperty注解使用

一、需求 使用JSONField或JsonProperty注解&#xff0c;来解决bean与json字段不一致问题&#xff0c;或者字段定义不符合前端所需要的标准&#xff0c;最近在项目中发现实体类属性中&#xff0c;同时使用了JSONField和JsonProperty注解&#xff0c;用于重新声明属性key。有时候…...

高效简洁的文档翻译网站

一款简单而强大的文档翻译网站 一款文字/文件翻译的网站,支持多个领域的翻译&#xff0c;支持常见的语言翻译(韩/日/法/英/俄/德…),最大百分比的保持原文排版(及个别除外基本100%还原)。 新用户注册就有100页的免费额度&#xff0c;每月系统还会随机赠送翻译额度&#xff0c;…...

SpringBoot自动装配定义先后顺序失效原因极其解析

SpringBoot自动装配定义先后顺序失效原因极其解析 1、场景分析1.1、问题总结 2、使用AutoConfigureBefore、AutoConfigureAfter和AutoConfigureOrder注解指定加载顺序2.2、AutoConfigureXX注解失效原因总结 3、使用静态内部装配类提升加载顺序4、bean加载顺序规则 1、场景分析 …...

API 集成测试工具Hitchhiker 0.1.1 正式发布

Hitchhiker 是一款开源的 Restful Api 集成测试工具&#xff0c;你可以在轻松部署到本地&#xff0c;和你的 team 成员一起管理 Api。 能做什么 * Team 协作开发 Api * Api 历史修改记录及支持 diff 展示 * 支持多环境变量及运行时变量 * 支持 Schedule 及批量 run * 不同…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...