MybatisPlus(2)
前言🍭
❤️❤️❤️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(这是一个接口)的对象,我们就给它一个对应的对象。
@Testvoid 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 {@Beanpublic 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.xmlconfiguration: # 配置打印 MyBatis-plus 执行的 SQLlog-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=utf8username: rootpassword: "123456"driver-class-name: com.mysql.cj.jdbc.Drivermain:banner-mode: off #不显示logo
mybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration: # 配置打印 MyBatis-plus 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:banner: false #不显示logo
运行测试代码,发现只有SQL信息和打印信息:
三、条件查询的三种语句🍭
MyBatisPlus将书写复杂的SOL查询条件进行了封装,使用编程的形式完成查询条件的组合。

可以看到大部分select语句都有一个相同的Wrapper接口,这些Wrapper接口就是用来封装查询操作的。
1、按条件查询🍉
现在数据库中有三个用户,我们去查询出age小于18的用户。

测试代码:
@Testvoid 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的用户
@Testvoid 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表达式的方式,这也是比较常用的一种方法了。
@Testvoid 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的数据🍉
Ⅰ、正常查询🍓
@Testvoid 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)🍒
@Testvoid 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)🍒
@Testvoid 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:
@Testvoid 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给我们提供了更好的方法。
@Testvoid textGetAll() {UserQuery uq=new UserQuery();uq.setAge2(20);LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();//判断是否为nulllqw.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);}
运行:


相关文章:
MybatisPlus(2)
前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 上篇我们简单介绍了MybatisPlus的方便之处,这篇来深入了解Myb…...
iOS UITableView上拉加载解决偶然跳动的Bug
最近做项目,测试测出来一个Bug,列表添加了上拉刷新和下拉加载,当我弹窗消失时,调用刷新列表后,在某个手机型号上,偶发列表刷新跳动的bug。(一般在列表上拉加载刷新到最后一页后,再弹窗消失,reload列表,会出现此bug) Bug复现如下:RPReplay_Final1693296737 解决方案…...
MySQL 外键使用详解
1、MySQL 外键约束语法 MySQL 支持外键,允许在表之间进行相关数据的交叉引用,并有助于保持相关数据的一致性。 一个外键关系涉及到一个父表,该父表保存初始列值,和一个子表,子表的列值引用父表的列值。外键约束定义在…...
MongoDB实验——在MongoDB集合中查找文档
在MongoDB集合中查找文档 一、实验目的二、实验原理三、实验步骤1.启动MongoDB数据库、启动MongoDB Shell客户端2.数据准备-->person.json3.指定返回的键4 .包含或不包含 i n 或 in 或 in或nin、$elemMatch(匹配数组)5.OR 查询 $or6.Null、$exists7.…...
事务的总结
数据库事务 数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行。事务管理是一个重要组成部分,RDBMS 面向企业应用程序,以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性描述…...
[ROS]yolov5-7.0部署ROS
YOLOv5是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的最新版本。与其它目标检测算法相比,YOLOv5在速度和准确性方面取得了显著的提升。在ROS(Robot Operating System)中使用Python部署YOLOv5可…...
Java抽象方法、抽象类和接口——第七讲
前言 上一讲,我们深入了解面向对象,介绍了面向对象有三个特征——封装、继承、多态,以及介绍方法的重载和重写,这些都是开发中很常用的特征,基本都尊重面向对象思想。再上一讲我们了解到了继承的时候,子类要重新写父类的方法,才能遵循子类的规则,那么忘记重写怎么办呢?…...
kafka集群之kraft模式
一、概要 Kafka作为一种高吞吐量的分布式发布订阅消息系统,在消息应用中广泛使用,尤其在需要实时数据处理和应用程序活动跟踪的场景,kafka已成为首选服务;在Kafka2.8之前,Kafka强依赖zookeeper来来负责集群元数据的管理…...
虹科案例 | 缆索挖掘机维护—小传感器,大作用!
一、 应用背景 缆索挖掘机 缆索挖掘机的特点是具有坚固的部件,如上部结构、回转环和底盘。底盘是用于移动挖掘机的下部机械部件,根据尺寸和型号的不同,由轮子或履带引导,并承载可转动的上部车厢。回转环连接上部和下部机器部件&am…...
Windows安装FFmpeg说明
下载地址 官网 Download FFmpeg Csdn ffmpeg安装包,ffmpeg-2023-08-28-git-b5273c619d-full-build.7z资源-CSDN文库 解压安装,添加环境变量 命令行输入ffmpeg 安装成功...
电子电路原理题目整理(1)
电子电路原理题目整理(1) 最近在学习《电子电路原理》,记录一下书后面试题目,答案为个人总结,欢迎讨论。 1.电压源和电流源的区别? 电压源在不同的负载电阻下可提供恒定的负载电压,而电流源对于…...
iPhone 15预售:获取关键信息
既然苹果公司将于9月12日正式举办iPhone 15发布会,我们了解所有新机型只是时间问题。如果你是苹果的狂热粉丝,或者只是一个早期用户,那么活动结束后,你会想把所有的注意力都集中在iPhone 15的预购上——这样你就可以保证自己在发布日会有一款机型。 有很多理由对今年的iPh…...
Kind创建本地环境安装Ingress
目录 1.K8s什么要使用Ingress 2.在本地K8s集群安装Nginx Ingress controller 2.1.使用Kind创建本地集群 2.1.1.创建kind配置文件 2.1.2.执行创建命令 2.2.找到和当前k8s版本匹配的Ingress版本 2.2.1.查看当前的K8s版本 2.2.2.在官网中找到对应的合适版本 2.3.按照版本安…...
MySQL与Oracle数据库通过系统命令导出导入
MySQL导出 mysqldump -uroot -ppassword 库名 表名 --where"s_dtend<2023-05-01 00:00:00 and s_dtend>2023-01-01 00:00:00 and (i_mbr!10000 OR (i_mbr 10000 AND I_ACTV IN (SELECT I_ACTV FROM t_mk_activity WHERE S_DTEND < 2023-05-01 00:00:00)))"…...
从零学算法(剑指 Offer 36)
123.输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。…...
【Unity3D】UI Toolkit容器
1 前言 UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery,本文将介绍 UI Toolkit 中的容器,主要包含 VisualElement、ScrollView、ListView、UI Toolkit,官方介绍详见→UXML elements reference。 2 VisualElement(空容器&…...
手把手教你写出第一个C语言程序
Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…...
flink维度表关联
分析&回答 根据我们业务对维表数据关联的时效性要求,有以下几种解决方案: 1、实时查询维表 实时查询维表是指用户在Flink 的Map算子中直接访问外部数据库,比如用 MySQL 来进行关联,这种方式是同步方式,数据保证是…...
Docker Compose 安装使用 教程
Docker Compose 1.1 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的 快速编排 。从功能上看,跟 OpenStack 中的 Heat 十分类似。 其代码目前在 https://github.com/docker/compose 上开源。 Compose 定位是 「定义和运行多个…...
睿趣科技:开抖音小店挣钱吗到底
在当今数字化时代,社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台,自然也成为了许多人开设小店、进行创业的选择之一。那么,开抖音小店能否真正实现盈利,成为了一个备受关注的话题。…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
