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

MybatisPlus 核心功能

MybatisPlus 核心功能

文章目录

  • MybatisPlus 核心功能
    • 1. 条件构造器
      • 1.1 QueryWrapper
      • 1.2 LambdaQueryWrapper(推荐)
      • 1.3 UpdateWrapper
      • 1.4 LambdaUpdateWrapper
    • 2. 自定义SQL
    • 3. Service接口

1. 条件构造器

当涉及到查询或修改语句时,MybatisPlus需要使用条件构造器来进行条件判断,它提供了以下条件构造器:

在这里插入图片描述

  • QueryWrapperLambdaQueryWrapper:用来构建select、delete、update的where条件部分
  • UpdateWrapperLambdaUpdateWrapper:通常只有在set语句比较特殊的时候才使用

1.1 QueryWrapper

QueryWrapper下有许多方法可以使用,用来充当指定where条件部分:

  • select:指定需要查询的字段
  • eq:和指定内容相等的数据
  • like:进行模糊查询
  • ge:比指定数大的数据
  • le:比指定数小的数据

代码示例

①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:

@Test
void testQueryWrapper() {// 1. 构建查询条件QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id", "username", "info", "balance").like("username", "o").le("balance", 1000);// 2. 查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);
}

在这里插入图片描述

②更新用户名为jack的用户的余额为2500:

@Test
void testUpdateByQueryWrapper1() {// 1. 要更新的数据User user = new User();user.setBalance(2500);// 2. 更新的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");// 3. 更新数据userMapper.update(user, wrapper);
}

在这里插入图片描述

③删除名为Thomas的数据:

@Test
void testDeleteByQueryWrapper() {// 1. 删除的条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "Thomas");// 2. 删除数据userMapper.delete(wrapper);
}

在这里插入图片描述

1.2 LambdaQueryWrapper(推荐)

LambdaQueryWrapper的具体作用与QueryWrapper一样,用来构建select、delete、update的where条件部分,但它与QueryWrapper的不同在于,LambdaQueryWrapper更能防止硬编码,因此更推荐使用LambdaQueryWrapper

LambdaQueryWrapper在操作上和的不同点便是使用了类名::方法的方式来填充数据,而不是将查询条件“写死”。

代码示例

①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:

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

②更新用户名为jack的用户的余额为5000:

@Test
void testUpdateByLambdaQueryWrapper() {// 1. 要更新的数据User user = new User();user.setBalance(5000);// 2. 更新的条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().eq(User::getUsername, "XiaoMi");// 3.更新数据userMapper.update(user, wrapper);
}

相较于QueryWrapper更推荐使用LambdaQueryWrapper来作为条件构造器!!

1.3 UpdateWrapper

set语句比较特殊时可以使用UpdateWrapper来进行条件构造,如加减数据:

代码示例

更新id为1,2,4的用户的余额,扣200:

@Test
void testUpdateWrapper1() {List<Long> ids = List.of(1L, 2L,4L);UpdateWrapper<User> wrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id", ids);userMapper.update(null, wrapper);
}

在这里插入图片描述

1.4 LambdaUpdateWrapper

使用方式与UpdateWrapper基本相同,只是将指定字段修改为可变字段:

代码示例

更新id为1,2,4的用户的余额,扣200:

@Test
void testLambdaUpdateWrapper() {List<Long> ids = List.of(1L, 2L,4L);LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<User>().setSql("balance = balance - 200").in(User::getId, ids); // 这里与`UpdateWrapper`不同userMapper.update(null, wrapper);
}

在这里插入图片描述

2. 自定义SQL

MyBatisPlus中,当我们需要使用复杂的sql语句进行操作时,往往是通过自定义SQL+条件构造器的方式来解决问题的!即通过条件构造器来构建复杂的Where的条件,剩余部分则通过自定义sql解决:

代码示例

更新id为1,2,3的用户的余额,扣指定金额:

  1. 基于Wrapper构建Where条件

    @Test
    void testCustomSqlUpdate1() {// 1. 更新条件List<Long> ids = List.of(1L, 2L, 3L);int amount = 200;// 2. 定义条件LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);// 3. 调用自定义SQL方法userMapper.updateBalanceByLBIds(wrapper, amount);
    }
    
  2. 在Mapper方法参数中通过Param注解声明wrapper变量名称, 必须写ew

    public interface UserMapper extends BaseMapper<User> {void updateBalanceByLBIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
    }
    
  3. 编写自定义sql,并使用Wrapper充当条件

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

    在这里插入图片描述

3. Service接口

MybatisPlus除了给我们提供快速实现CURD的功能外,也为我们提供了可直接使用的Service接口:

在这里插入图片描述

IService接口为我们提供了一系列可以封装好的接口,而我们需要做的就是继承然后使用它:

在这里插入图片描述

使用流程

  1. 自定义Service接口并继承IService接口

    public interface MUserService extends IService<User> {// 注意需要给上述泛型提供实体类
    }
    
  2. 自定义Service实现类,实现自定义接口并继承ServiceImpl接口

    @Service
    public class MUserServiceImpl extends ServiceImpl<UserMapper, User> implements MUserService {// 注意需要给上述泛型提供Mapper接口和实体类
    }
    

测试一下

@SpringBootTest
class MUserServiceImplTest {@Autowiredprivate MUserService mUserService;@Testvoid testQuery() {List<User> users = mUserService.listByIds(List.of(1L,2L,3L));users.forEach(System.out::println);}@Testvoid testInsert() {User user = new User();user.setUsername("XiaoTian");user.setPassword("11111");user.setPhone("10085");user.setBalance(200);user.setInfo(UserInfo.of(25, "体育老师", "man"));user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());mUserService.save(user);}}

在这里插入图片描述

在这里插入图片描述以上便是MybatisPlus提供的一些核心功能了!!

相关文章:

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…...

vivado EQUIVALENT_DRIVER_OPT、EXCLUDE_PLACEMENT

Vivado工具将所有逻辑上等效的信号的驱动程序合并为单个驱动程序 在逻辑优化过程中指定-merge_equivalent_drivers选项时 &#xff08;opt_design&#xff09;。请参阅《Vivado Design Suite用户指南&#xff1a;实施》中的此链接 &#xff08;UG904&#xff09;[参考文献20]了…...

docker也能提权??内网学习第6天 rsync未授权访问覆盖 sudo(cve-2021-3156)漏洞提权 polkit漏洞利用

现在我们来说说liunx提权的操作&#xff1a;前面我们说了环境变量&#xff0c;定时任务来进行提权的操作 rsync未授权访问覆盖 我们先来说说什么是rsync rsync是数据备份工具&#xff0c;默认是开启的873端口 我们在进行远程连接的时候&#xff0c;如果它没有让我们输入账号…...

TF卡病毒是什么?如何防范和应对?

在存储芯片及存储卡领域&#xff0c;TF卡病毒是一个备受关注的话题。在本文中&#xff0c;拓优星辰将详细解释TF卡病毒的含义、来源以及如何防范和应对这一问题&#xff0c;帮助客户更好地了解和处理TF卡病毒的风险。 1. TF卡病毒的含义 TF卡病毒是指针对TF存储卡&#xff08;T…...

window对象监听浏览器页签之间的切换状态;前端监听浏览器切换页签的触发时机

window对象监听浏览器页签之间的切换状态 记录两种办法 第一种&#xff1a;会将任何鼠标点进或点出浏览器的操作监听&#xff1b;同页面也会触发 // 窗口获得焦点时的回调函数 function onWindowFocus() {console.log(窗口获得焦点);querySubmit() } // 窗口失去焦点时的回调函…...

MySQL 条件函数/加密函数/转换函数

条件函数 IF(): 如果条件为真&#xff0c;返回一个值&#xff0c;否则返回另一个值。 -- 示例&#xff1a;根据员工的薪水返回薪水等级 SELECT name, salary, IF(salary < 3000, Low, IF(salary BETWEEN 3000 AND 7000, Medium, High)) AS salary_level FROM employ…...

初学SpringMVC之接收请求参数及数据回显

pom.xml 文件导入 lombok 的依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示这是一个控制器 RequestParam 表示从前端接收…...

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法&#xff1a; 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…...

【cocos creator】2.x,伪3d拖拽,45度视角,60度视角,房屋装扮

伪3d拖拽,45度视角,60度视角 工程下载:(待审核) https://download.csdn.net/download/K86338236/89530812 dragItem2.t s import mapCreat2 from "./mapCreat2";const {ccclass, property } = cc._decorator; /*** 拖拽类,挂在要拖拽的节点上*/ @ccclass export…...

【thingsbord源码编译】 显示node内存不足

编译thingsbord显示报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory问题原因分析 重新安装java版本 编译通过...

内存巨头SK海力士正深化与TSMC/NVIDIA合作关系,开发下一代HBM

据BusinessKorea报道&#xff0c;内存巨头SK海力士正深化与台积电(TSMC)及英伟达(NVIDIA)的合作关系&#xff0c;并计划在9月的台湾半导体展(Semicon Taiwan)上宣布更紧密的伙伴关系。 SK海力士与台积电的合作历史已久。2022年&#xff0c;台积电在其北美技术研讨会上宣布成立O…...

基于Pinia的WebSocket管理与优化实践(实现心跳重连机制,异步发送)

WebSocket作为一种全双工通信协议&#xff0c;允许服务器和客户端之间建立持久的连接&#xff0c;提供了比传统HTTP请求更为高效的数据交换方式。本文将探讨如何使用Pinia状态管理库在Vue应用中优雅地管理和优化WebSocket连接&#xff0c;以实现稳定、高效的实时数据传输。 环境…...

Perl词法作用域:自定义编程环境的构建术

&#x1f3ad; Perl词法作用域&#xff1a;自定义编程环境的构建术 在Perl编程中&#xff0c;词法作用域&#xff08;lexical scoping&#xff09;是一种控制变量可见性的方式&#xff0c;它允许变量在特定的作用域内可见&#xff0c;从而避免变量名的冲突。Perl提供了灵活的机…...

vscode使用ssh连接远程服务器

开工啦 vscode连接远程服务器&#xff08;傻瓜式教学&#xff09; 正常根据上面文章的步骤就可以连接了 报错可以尝试的文章&#xff1a; VScode通过remote ssh连接虚拟机 & 报错过程试图写入的管道不存在&#xff08;已解决&#xff09; vscode remote ssh linux[血泪…...

linux 常用和不那么常用命令记录02 磁盘占用

常用的磁盘相关命令 du 有的时候我们想要查询一个文件所占用的磁盘空间大小&#xff0c;可以使用du命令来查看 命令 配置 参数 du [options] [files or directories]-h&#xff1a;以人类可读的格式显示输出&#xff08;例如 KB、MB、GB&#xff09;。 -s&#xf…...

mybatis日志记录方案

首先对指定表进行监控 对表进行监控,那么就要使用的是statementInterceptor 拦截器 使用拦截器那么就要写intercepts写拦截条件进行拦截 监控只对与增删改 查询不进行监控 对于字段的监控,是谁修改了字段,那么就进行报警,或者提醒 消息提醒使用钉钉机器人进行消息提醒 P…...

【LeetCode】最长连续序列

目录 一、题目二、解法完整代码 一、题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nu…...

Windows下终端Kafka指令常用操作

1、创建Topic kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test 2、查看Topic列表 kafka-topics.bat --list --bootstrap-server localhost:9092 3、设置Topic最大消息大小 kafka-topics.bat --bootstrap-s…...

QT---lineEdit相关信号

1.returnPressed信号 connect(ui.lineEdit_passWord, &QLineEdit::returnPressed, []() { // 输入密码回车后&#xff0c;调用校验密码接口ui.lineEdit_passWord->clearFocus(); //失去焦点on_param_confirmBtn_clicked();});2.输入后失去焦点才获取编辑框内新信息 参…...

基于vue的地图特效(飞线和标注)

这段代码的主要功能是在页面加载完成后&#xff0c;初始化一个 echarts 地图图表&#xff0c;并配置了相关的地理数据、散点数据、线条数据以及样式效果&#xff0c;最后在指定的 div 元素中进行展示。 需要再vue中的框架实现&#xff0c;不能单独直接运行。 标注 type: effe…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...

手动给中文分词和 直接用神经网络RNN做有什么区别

手动分词和基于神经网络&#xff08;如 RNN&#xff09;的自动分词在原理、实现方式和效果上有显著差异&#xff0c;以下是核心对比&#xff1a; 1. 实现原理对比 对比维度手动分词&#xff08;规则 / 词典驱动&#xff09;神经网络 RNN 分词&#xff08;数据驱动&#xff09…...