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提供的一些核心功能了!!

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

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

相关文章

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布&#xff0c;Kendo UI for React为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性…

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…

绝地求生PUBG奇幻大乱斗怎么玩 奇幻大乱斗什么时候回归

《绝地求生》(PUBG) 是由韩国开发的一款战术竞技型射击类沙盒游戏&#xff0c;游戏中我们需要和队友组队乘坐飞机跳伞到达一座空岛&#xff0c;之后我们需要搜索一切我们可以用到的物资&#xff0c;之后我们于敌人进行对战&#xff0c;期间不断躲避毒圈的追击&#xff0c;最后当…

Redis+Caffeine 实现两级缓存实战

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

防火墙安全策略及用户认证实验

目录 一、实验拓扑 二、实验要求 三、实验思路 四、实验配置 1、配置vlan 2、配置路由器、防火墙IP地址&#xff0c;划分区域 3、配置安全策略 ​策略一&#xff1a; 策略二&#xff1a; 策略三&#xff1a; 4、配置用户认证 策略一&#xff1a; 策略二&#xff1a…

WebGIS基础原理

该部分内容与部分插图、学习框架的主要参考的网站与博主如下&#xff08;也趁机分享给大家&#xff09;&#xff1a; OSGeo开源WebGIS在线教程&#xff1a;http://webgis.cn/ OSGeo《地理信息系统原理》&#xff1a;https://www.osgeo.cn/gis-tutorial/index.html OSGeo《Pyth…

DSC主备归档报错

先看一个报错&#xff1a; 2024-07-10 22:12:21.725 [ERROR] database P0000003511 T0000000000000003696 rafil_list_overlap_consecutive_check failed, rfil(DMDATA/data/DSC02/arch/ARCHIVE_LOCAL1_0x57843343_EP1_2024-07-10_20-44-40.log)->next_seq(2901) > nex…

部署Harbor仓库

本章内容&#xff1a; 安装docker-ce部署harbor仓库上传和拉取 1.安装docker 1&#xff09;拉取源码 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2&#xff09;安装docker-ce yum -y install docker-ce 3&#…

C++入门到进阶(图文详解,持续更新中)

C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 目录 C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 数据 数据类型 基本数据类型/内置数据类型 C常用运算符 赋值运算符 关系运算符 逻辑运算符 杂项运算符 数据的本地化…

第二课:使用域名dns ping通www.baidu.com

需要一台dns服务器&#xff0c;实现域名解析&#xff0c;把对应的网址变为Ip地址。 首先按照之前博客的配置&#xff0c;自动分配给PC1和PC2的IP地址等相关配置。 然后增加一台server交换机连接到交换机上&#xff0c;配置好ip地址&#xff0c;192.168.1.100。在dnsServer中。…

7.11日学习打卡----初学Redis(六)

7.11日学习打卡 目录&#xff1a; 7.11日学习打卡一. redis事务事务的概念与ACID特性Redis事务三大特性Redis事务执行的三个阶段Redis事务基本操作 二. redis集群主从复制主从复制环境搭建主从复制原理剖析 哨兵监控哨兵监控环境搭建哨兵工作原理剖析 故障转移Cluster模式Clust…

c++初阶知识——类和对象(1)

目录 1.类和对象 1.1 类的定义 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 对象大小 内存对齐规则 3.this指针 1.类和对象 1.1 类的定义 &#xff08;1&#xff09;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xf…

达梦数据库中的线程和进程

达梦数据库中的线程和进程 在达梦数据库中&#xff0c;线程和进程的概念与操作系统中的定义类似&#xff0c;但有一些特定的实现细节和用途。以下是达梦数据库中线程和进程的一些关键点&#xff1a; 进程&#xff08;Process&#xff09;&#xff1a; 在达梦数据库中&#x…

mysql数据库被偷家,数据全部丢失。还勒索我给他比特币

歹徒留下的勒索信息。 解决办法&#xff1a; 1、设置ip白名单&#xff0c; 2、端口不要使用默认端口&#xff0c;随便换个端口就行。 3、密码设置复杂一点。

【Java16】多态

向上类型转换 对于引用变量&#xff0c;在程序中有两种形态&#xff1a;一种是编译时类型&#xff0c;这种引用变量的类型在声明它的时候就决定了&#xff1b;另一种则是运行时类型&#xff0c;这种变量的类型由实际赋给它的对象决定。 当一个引用变量的编译时类型和运行时类…

【Pytorch】Conda环境pack打包迁移报错处理

文章目录 Anaconda虚拟环境打包一、源电脑的环境打包1.安装conda-pack工具2.确定环境3.打包环境4.将打包环境拷贝到U盘 二、环境迁移到目标电脑上三、异常处理pip install -e. 导致无法pack→忽略管理的文件已经被删除或者被覆盖→压缩成tar注意 重新激活环境 Anaconda虚拟环境…

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(一)

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;一&#xff09; 0. 引言1. 关于m_ll2xy和m_xy2ll2. 关于m_lldist3. 关于m_xydist4 关于m_fdist5 关于m_idist6. 总结 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0…

Nuxt3封装网络请求 useFetch $fetch

前言&#xff1a; 刚接触、搭建Nuxt3项目的过程还是有点懵的&#xff0c;有种摸石头过河的感觉&#xff0c;对于网络请求这块&#xff0c;与之前的Vue3项目有所区别&#xff0c;在Vue项目通常使用axios这个库进行网络请求&#xff0c;但在Nuxt项目并不推荐&#xff0c;因为有内…

RK3568平台(显示篇)主屏副屏配置

一.主屏副屏配置 目前在RK3568平台上有两路HDMIOUT输出&#xff0c;分别输出到两个屏幕上&#xff0c;一路配置为主屏&#xff0c;一路配置为副屏。 硬件原理图&#xff1a; &hdmi0_in_vp2 {status "okay"; };&hdmi1_in_vp0 {status "okay"; }…

axios使用sm2加密数据后请求参数多了双引号解决方法

axios使用sm2加密数据后请求参数多了双引号解决 背景问题描述解决过程 背景 因项目安全要求&#xff0c;需对传给后端的入参加密&#xff0c;将请求参数加密后再传给后端 前期将axios降低到1.6.7后解决了问题&#xff0c;但最近axios有漏洞&#xff0c;安全要求对版本升级&…