MybatisPlus(2)

news2025/1/16 20:03:00

 前言🍭

❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️

Spring + Spring MVC + MyBatis_冷兮雪的博客-CSDN博客

 上篇我们简单介绍了MybatisPlus的方便之处,这篇来深入了解MybatisPlus的其他功能。

一、标准分页功能制作🍭

MyBatis-Plus提供了方便易用的标准分页功能,可以轻松实现分页查询。

1、实现分页功能🍉

在上篇我们简单介绍了 一些MybatisPlus带来的简单方法,现在来看看它所带来的分页功能是如何实现的。

可以看到这个函数需要一个page参数。

<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);

点进源码发现这是一个IPage(这是一个接口)的对象,我们就给它一个对应的对象。

@Test
    void testGetByPage(){
        IPage page=new Page(1,1);//第一个参数表示第几页,第二个参数表示一页多少条
        userDao.selectPage(page,null);
        System.out.println("当前页码值:"+page.getCurrent());
        System.out.println("每页显示数:"+page.getSize());
        System.out.println("一共多少页:"+page.getPages());
        System.out.println("每页显示数:"+page.getTotal());
        System.out.println("数据:"+page.getRecords());
    }

 运行测试代码:

 我们可以发现这其中多少页、多少条并没有准确显示,而且看数据它将所有数据都查出来了,这就是简单的查询所有数据。为什么会这样?因为还没有设置完全,需要给分页功能添加拦截器才可以使用。

2、分页拦截器🍉

实现这个分页功能需要配置MybatisPlus分页拦截器,如果那个类需要使用这个分页功能则需要加入到拦截器中。那我们来实现一下:

package com.example.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }
}

随便配置打印 MyBatis-plus 执行的 SQL

mybatis-plus:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis-plus 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

然后再次运行代码

我们可以发现所有数据都正确显示了,查询的数据也只有一条,然后再看SQL语句,我们查询第二页再看一下:

可以发现查询第一页和第二页的SQL语句不太一样,有两个参数,MybatisPlus这也太智能了吧,这也让我们的分页操作十分简单了。

二、加快控制台运行速率🍭

1、不打印日志🍉

创建一个logback.xml,可以让控制台的日志打印消失。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>

未添加xml前: 

添加后: 

 2、不打印Spring图标和MyBatisPlus图标🍉

分别给mybatic-plus和Spring设置banner属性:

# 配置数据库的连接字符串
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/ku2022?characterEncoding=utf8
    username: root
    password: "123456"
    driver-class-name: com.mysql.cj.jdbc.Driver
  main:
    banner-mode: off #不显示logo
mybatis-plus:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis-plus 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: false #不显示logo

 运行测试代码,发现只有SQL信息和打印信息:

三、条件查询的三种语句🍭

MyBatisPlus将书写复杂的SOL查询条件进行了封装,使用编程的形式完成查询条件的组合。

可以看到大部分select语句都有一个相同的Wrapper接口,这些Wrapper接口就是用来封装查询操作的。

1、按条件查询🍉

现在数据库中有三个用户,我们去查询出age小于18的用户。

测试代码: 

@Test
    void textGetAll() {
        //方式一:按条件查询
        QueryWrapper<User> qw=new QueryWrapper<>();//这里的泛型指不指点都可以
        qw.lt("age",18);//lt是表示小于
        List<User> list=userDao.selectList(qw);
        System.out.println(list);
    }

运行: 

2、lambda格式表达式(推荐)🍉

Ⅰ、第一种🍓

我们现在使用lambda表达式的方式去查询age小于20的用户

@Test
    void textGetAll() {
        //方式二:lambda格式按条件查询
        QueryWrapper<User> qw = new QueryWrapper<>();//这里的泛型必须指点,不然下面User::getAge会报错
        qw.lambda().lt(User::getAge, 20);
        List<User> userList = userDao.selectList(qw);
        System.out.println(userList);
    }

运行:

Ⅱ、 第二种🍓

这是另一种lambda表达式的方式,这也是比较常用的一种方法了。

    @Test
    void textGetAll() {
        //方式三:lambda格式按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge, 25);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

3、查询大于10小于22的数据🍉

Ⅰ、正常查询🍓

    @Test
    void textGetAll() {
        //方式三:lambda格式按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.gt(User::getAge,10);
        lqw.lt(User::getAge, 22);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

Ⅱ、组合查询条件(链式编程格式)🍓

并且 (and)🍒

    @Test
    void textGetAll() {
        //方式三:lambda格式按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,23).ge(User::getAge,10);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

或者 (or)🍒

    @Test
    void textGetAll() {
        //方式三:lambda格式按条件查询
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,22).or().ge(User::getAge,10);
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

 四、条件查询null判定🍭

当我们需要判断一个值是否为null时,我们一般使用if语句进行判断,而在MybatisPlus中有更好的方法。

UserQuery类

package com.example.domain;

import lombok.Data;

@Data
public class UserQuery extends User{
    private Integer age2;
}

一般情况使用if:

@Test
    void textGetAll() {
        UserQuery uq=new UserQuery();
        uq.setAge(18);
        uq.setAge2(20);
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        if (null!=uq.getAge2()){
            lqw.gt(User::getAge,uq.getAge2());
        }
        if (null!=uq.getAge()){
            lqw.lt(User::getAge,uq.getAge());
        }
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

但这样十分麻烦,而MybatisPlus给我们提供了更好的方法。

@Test
    void textGetAll() {
        UserQuery uq=new UserQuery();
        uq.setAge2(20);
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        //判断是否为null
        lqw.gt(null!=uq.getAge2(),User::getAge,uq.getAge2());
        lqw.lt(null!=uq.getAge(),User::getAge,uq.getAge());
        List<User> userList = userDao.selectList(lqw);
        System.out.println(userList);
    }

运行: 

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

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

相关文章

探索生成式人工智能的前景

一、什么是生成式人工智能&#xff1f; 生成式人工智能&#xff08;Generative AI&#xff09;是一类人工智能&#xff08;AI&#xff09;技术和模型&#xff0c;旨在创建新颖的内容。与简单的复制不同&#xff0c;这些模型通过利用从训练数据集中收集到的模式和见解&#xff…

飞桨花滑骨骼点动作识别比赛记 2

基于 PaddleVideo 的花滑骨骼点动作识别 2s-AGCN配置文件节点流配置文件 2s-agcn_ntucs_joint_fsd.yamlMODEL 字段DATASET 字段PIPELINE 和 INFERENCE 字段OPTIMIZER 字段 agcn2s.pygraph输入通道数 骨骼流 Dataset 和 Pipeline配置文件DATASETPIPELINE 源码skeleton.pyskeleto…

Elasticsearch 7.6 - API高阶操作篇

ES 7.6 - API高阶操作篇 分片和副本索引别名添加别名查询所有别名删除别名使用别名代替索引操作代替插入代替查询 场景实操 滚动索引索引模板创建索引模板查看模板删除模板 场景实操一把索引的生命周期数据迁移APIGEO(地理)API索引准备矩形查询圆形查询多边形查询 自定义分词器…

Spring理解,重要概念及图解,2023秋招spring常见八股文

按照自己的需求&#xff0c;找到自己不会的地方去解决 1.Spring的核心 1&#xff09;Spring的两大核心&#xff1a;IoC和AOP Spring框架包含众多模块&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整个Spring框架的核心模块。Core模块提供…

进程的挂起状态

进程的挂起状态详解 当我们谈论操作系统和进程管理时&#xff0c;我们经常听到进程的各种状态&#xff0c;如“就绪”、“运行”和“阻塞”。但其中一个不那么常被提及&#xff0c;但同样重要的状态是“挂起”状态。本文将深入探讨挂起状态&#xff0c;以及为什么和在何时进程…

linux中安装nodejs,卸载nodejs,更新nodejs,git,linux中安装nginx并配置

文章目录 node的安装与卸载&#xff08;更新版本&#xff09;卸载nodejs安装新版本node git安装与拉取代码安装解决 linux git 每次推拉(push/pull)代码都要输入用户名密码的问题 nginx 安装、配置和卸载安装nginx配置**.conf 文件内容 nginx 卸载 注意&#xff0c;我的是Ubunt…

【Linux】root和子用户都能执行的命令,sudo无法执行(已解决)

全流程帖子 https://ask.oceanbase.com/t/topic/35604437/7 1.问题 如题&#xff0c;在编译miniob的时候遇到如下错误 [muvm-cnt8:~/code/miniob]$ sudo bash build.sh init build.sh init HEAD is now at 5df3037d Merge branch release-2.1.12-stable-pull into patches-2.…

一文搞定全进程间通讯(IPC)八大方式-管道、命名管道、信号、信号量、消息队列、共享内存+内存映射、套接字

进程间通讯&#xff08;IPC&#xff09; 参考 / 引用&#xff1a; 如何在Linux下的进行多进程编程&#xff08;初步&#xff09; - 知乎 (zhihu.com)。浅析进程间通信的几种方式&#xff08;含实例源码&#xff09; - 知乎 (zhihu.com)。 linux基础——linux进程间通信&#…

从零开始,使用C语言实现扫雷小游戏

扫雷 1. 前言2. 准备工作3. 设计思路4. 定义数组5. 初始化6. 打印7. 布置雷8. 排查雷9. 完整代码 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼。今天我们会用C语言实现一个经典的windows小游戏&#xff1a;扫雷。扫雷是一款单机小游戏&#xff0c;我上中学时特喜欢在电脑…

网易24届内推

【网易】2024届网易互联网秋季校园招聘内推开始啦&#xff01;给你分享我的专属内推邀请函&#xff1a;https://bole.campus.163.com/campus/home?projectId55&type99&isShare1&boleId7b842acc7c2b42db&boleType2&signatured5f2a3dc23bed70777a8be1a14b49…

简单了解IPv4编址

目录 一、IPv4地址 二、进制转换 三、有类IPv4 四、无类IPv4 3.1 子网掩码 3.2 地址规划 3.3 VLSM可变长子网掩码 五、私有IPv4地址 六、IPv4报文格式 七、IP地址解析 一、IPv4地址 IPv4地址由“网络位主机位”构成&#xff0c;所谓的网络位就是我们通常所指的网段区…

python 列表extend方法和+(拼接)的区别

1.extend方法会直接作用于原始列表&#xff0c;会修改原始列表的值 a [10, 20, 30] b [1, 2, 3]print(a b) print(a) a.extend(b) print(a) 2.extend接收到的参数是一个可迭代的对象(iterable)&#xff0c;不管是list,tuple,str,dict,set a [10, 20, 30] b {"name&qu…

公司内部网段多管控乱,该如何规范跨网文件传输交换?

古往今来&#xff0c;高筑墙一直是有效的防御措施。从边塞长城到护城河外的高高城墙&#xff0c;都是利用隔离地域的形式实现保护安全域的效果。这样一来&#xff0c;城内的安全域可以在遇到危险时受到有效保护。 在企业网络安全防护方面&#xff0c;网络安全域隔离也是网络安全…

3D点云处理:圆柱侧面点云展开为平面 凹凸缺陷检测(附源码)

文章目录 1. 基本内容展开部分推导2. 展开流程3. 代码实现4. 应用文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_目标:对采集的圆柱面点云展开为平面;应用:可用于检测圆柱侧面的凹凸缺陷;1. 基本内容 圆柱的侧面展开原理是将一个圆柱体(或柱体)的侧面展开成一个…

el-table实现纯前端导出(适用于el-table任意表格)

2023.9.1今天我学习了如何使用el-table实现前端的导出功能&#xff0c;该方法的好处有无论你的el-table长什么样子&#xff0c;导出之后就是什么样子。 1.安装三个插件 npm install file-save npm install xlsx npm install xlx-style 2.创建Export2Excel.js // 根据dom导出表…

Windows右键添加用 IDEA 打开

1.安装IDEA时 安装时会有个选项来添加&#xff0c;如下&#xff1a; 勾选即可 2.修改注册表 安装时未勾选&#xff0c;可以把下面代码中程序路径改为自己的&#xff0c;保存为对应的 idea.reg文件&#xff0c;双击即可 Windows Registry Editor Version 5.00[HKEY_CLASSES…

问题记录:jenkins添加节点时Launch method没有Launch agents via SSH选项

jenkins问题记录 在jenkins主页&#xff0c;左侧点击Manage Jenkins&#xff0c;找到plugins选项&#xff0c;搜索如下插件安装&#xff1a; 安装完插件后&#xff0c;即可看到ssh选项出来了

2023开学礼《乡村振兴战略下传统村落文化旅游设计》西学图灵许少辉八一新书

2023开学礼《乡村振兴战略下传统村落文化旅游设计》西学图灵许少辉八一新书

Linux工具

一、yum yum可以看作一个客户端&#xff08;应用商店&#xff09;、应用程序&#xff0c;它如何知道去哪里下载软件&#xff1f; yum也是一个指令/程序&#xff0c;可以找到它的安装路径。 在list中可以看到yum能安装的所有软件&#xff0c;通过管道找到想要的&#xff0c;yum …

ChatGPT 总结前端HTML, JS, Echarts都包含哪些内容

AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.csdn.cn/zBytu