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 {

    @Autowired
    private MUserService mUserService;

    @Test
    void testQuery() {
        List<User> users = mUserService.listByIds(List.of(1L,2L,3L));
        users.forEach(System.out::println);
    }

    @Test
    void 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.mfbz.cn/a/794323.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8、matlab彩色图和灰度图的二值化算法汇总

1、彩色图和灰度图的二值化算法汇总原理及流程 彩色图和灰度图的二值化算法的原理都是将图像中的像素值转化为二值&#xff08;0或1&#xff09;&#xff0c;以便对图像进行简化或者特定的图像处理操作。下面分别介绍彩色图和灰度图的二值化算法的原理及流程&#xff1a; 1&a…

怎么录制网页上的视频?这篇文章告诉你

在数字化时代&#xff0c;网页视频已成为我们获取信息、学习知识和娱乐放松的重要途径。然而&#xff0c;有时我们可能想要保存或分享网页上的视频内容&#xff0c;却苦于没有合适的工具和方法。那么怎么录制网页上的视频呢&#xff1f;本文将详细介绍两种常见的网页视频录制方…

【基础算法总结】链表

链表 1.链表常用技巧和操作总结2.两数相加4.两两交换链表中的节点4.重排链表5.合并 K 个升序链表6.K 个一组翻转链表 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&…

一个开源完全免费的无损视频或音频的剪切/裁剪/分割/截取和视频合并工具

大家好&#xff0c;今天给大家分享一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具LosslessCut。 LosslessCut是一款致力于成为顶尖跨平台FFmpeg图形用户界面应用的软件工具&#xff0c;专为实现对视频、音频、字幕以及其他相关媒体资产的超高速无损编辑而精心打造。…

LabVIEW电子水泵性能测试平台

开发了一种车用电子水泵性能测试平台&#xff0c;该平台以工控机为载体&#xff0c;利用LabVIEW开发上位机软件&#xff0c;采用PLC控制阀门和水泵等电气元件&#xff0c;通过RS485进行数据采集并传输到上位机。通过上位机与下位机的协同控制&#xff0c;实现了数据交互处理和性…

备考美国数学竞赛AMC8和AMC10:吃透1850道真题和知识点

距离接下来的AMC8、AMC10美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;…

c语言题目之喝汽水问题

文章目录 一、题目二、思路三、代码实现3.1方法一3.1方法二 一、题目 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 二、思路 20元首先可以喝20瓶&#xff0c;此时手中有20个空瓶子两个空瓶子可以喝一瓶&#xff0c;喝完之后&#xff0c;空瓶子剩余&…

跳水板00

题目链接 跳水板 题目描述 注意点 返回的长度需要从小到大排列必须正好使用k块木板0 < shorter < longer0 < k < 100000 解答思路 用k块两种不同的木板&#xff0c;组合数为k 1&#xff0c;最小的组合为全部使用shorter&#xff0c;每多一块longer&#xff0…

前端一面之 同步 vs 异步

异步 vs 同步 先看一下 下面的 demo console.log(100) setTimeout(function () {console.log(200) }, 1000) console.log(300) 执行结果 100 300 200console.log(100) alert(200) // 1秒钟之后点击确认 console.log(300) 这俩到底有何区别&#xff1f;—— 第一个示例中间的…

再度领跑的极兔速递不存在估值缺口?

随着618的尘埃落地&#xff0c;线上零售的最强辅助们也将陆续公布最新业务量数据了。 整体上&#xff0c;上半年国内快递业的需求量维持稳增势。据国家邮政局监测数据&#xff0c;截至6月30日&#xff0c;今年上半年我国快递业务量突破800亿件&#xff0c;比2023年提前59天。其…

echarts解决数据差异过大的问题

问题描述 使用echarts折线图和柱状图展示数据时&#xff0c;如果数据差异值较大&#xff0c;会导致显示图形差异过大&#xff0c;图表不美观。 如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000]&#xff0c;渲染出来的效果如下图&#xff1a; 可以看到由于最大值和最小值差…

netscaler LDAP+RADIUS传统的双因素认证方式(之一)

如果使用传统的双因素认证方式&#xff0c;可以通过在Citrix ADC (NetScaler) 13.1上配置Gateway Virtual Server来实现LDAP和RADIUS的双因素认证。当前配置方式&#xff0c;采用Cateway vServer两个Basic Authtication Policy方式实现&#xff0c;以下是详细步骤&#xff1a; …

【Python】使用PyQt6创建简单的登录界面

使用PyQt6创建简单的登录界面 介绍 PyQt6是Python绑定的Qt库&#xff0c;可以用来开发跨平台的桌面应用程序。本教程将介绍如何使用PyQt6创建一个简单的登录界面&#xff0c;包括用户名和密码输入框以及登录按钮。当用户点击登录按钮时&#xff0c;程序会验证输入的凭据并显示…

Matplotlib入门

#折线图用来表示数据的变化 plt.plot(x,y) #直方图用来统计连续性数据 无间隔 plt.hist(data数组,组数) #条形图用来统计离散的数组 并且反映其变化 有间隔 plt.bar(x,y,width 0.3) plt.barh(y,x,height 0.3) #散点图用来xy轴之间的联系 趋势 plt.scatter(x,y) #导入p…

Python大数据分析——K近邻模型(KNN)

Python大数据分析——K近邻模型 数学部分模型思想模型步骤距离度量指标欧氏距离曼哈顿距离余弦相似度 K值选择 代码部分函数示例1——知识掌握程度示例2——预测发电量 数学部分 模型思想 如图所示&#xff0c;模型的本质就是寻找k个最近样本&#xff0c;然后基于最近样本做“…

Qwen-7B推理教程【Python调用+web端部署】

前提 操作系统为Ubuntu22.04.4 LTS安装Anaconda&#xff08;本人安装教程如下&#xff09; Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】-CSDN博客 安装python3.9/pytorch/torchvision&#xff08;本人安装教程如下&#xff09; Ubuntu22.04.4系统/安装python3.9/pytorch/…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)

跑 jekins任务的服务器不能连接外网下载依赖包&#xff0c;就将本地下载的 node_modules直接上传到服务器上&#xff0c;但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…

深度学习设计模式之代理模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 代理模式是结构型设计模式&#xff0c;主要是为其他对象提供一种代理以控制对这个对象的访问。 一、介绍 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用…

快速在springboot项目中应用EasyExcel

一、介绍 EasyExcel 是阿里巴巴开源的简化Excel文件读取和写入的开源库。主要的特点如下&#xff1a; 简单易用的API&#xff1a;EasyExcel提供简单API&#xff0c;隐藏处理Excel文件的底层细节。注解支持&#xff1a;支持使用注解将Java对象映射到Excel列&#xff0c;便于Ja…