MyBatis-Plus实现普通查询/分页查询[MyBatis-Plus系列] - 第484篇

历史文章(文章累计480+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

EasyPoi实战系列集合

MyBatis-Plus是什么以及特性[MyBatis-Plus系列] - 第481篇

MyBatis-Plus快速开始[MyBatis-Plus系列] - 第482篇

MyBatis-Plus快速实现增删改[MyBatis-Plus系列] - 第483篇

师傅:徒儿,最近看你状态还不错来着~

悟纤:必须的必~

师傅:有何喜事,分享一下来着。

悟纤:最近感情顺了很多~前些日子差点要搞emo,隔三差五就要来一波小情绪,真的是没法搞。

师傅:有何感悟可以分享一下?

悟纤:每天生活在一起,问题会比较快爆发出来。这个时候吗,就看两个人的情绪稳定性以及对对方的喜欢和包容程度了,越喜欢包容度会越高,存在的问题也会比较少。

师傅:看来这一次,徒儿这是动真格了,恭喜恭喜,情绪管理和耐心又升级了一个段位。

悟纤:每个女人都是一所大学~^_^

师傅:那倒是~ 但这所大学无法教会你技术哦~ 技术还得自己学习来着。

悟纤:技术是生存的根本,徒儿不能丢,Good good study,day day up!

导读

Hi,大家好,我是悟纤。我就是我,不一样的烟火。我就是我,与众不同的小苹果。

在前面有个小节中,就有查询的例子了,为什么这类要单独罗列出来一个篇章呢?

在实际的项目中,删除是最简单的,一般大部分的需求场景根据id删除;对于创建和修改可以认为是一个事情,当然如果是修改状态的话,那么就是单个字段的修改,大同小异。

因此在项目中最难的是查询操作,如果是单表查询,那到还好,但是如果是多表查询的话,那么复杂程度会增加;再者就是业务场景中常见的分页查询。

👉🏻 关于如何快速开始使用MyBatis-Plus,可以关注公众号「SpringBoot」,

回复关键字「483」查看相应的文章。

👇🏻👇🏻👇🏻EasyPoi实战系列

01.《MyBatis-Plus是什么以及特性[MyBatis-Plus系列]-第482篇》

02.《MyBatis-Plus快速开始 [MyBatis-Plus系列]-第483篇》

03.《MyBatis-Plus快速实现增删改 [MyBatis-Plus系列]-第484篇》

一、普通查询

先来看下普通查询(未分页),这种查询很简单,就是查询条件如何进行设置,常规的查询条件就是等于,大于,小于,模糊查询之类的。

2.1 查询所有数据

没有条件的查询,使用的方法是selectList:

@Testpublic void testSelectAll() {    List<User> userList = userMapper.selectList(null);    userList.forEach(System.out::println);}

运行结果:

说明:这里的执行信息的打印还是很清晰的。

(1)预执行的SQL:SELECT id,name,age,email FROM user

(2)Parameters:参数(这里没有条件参数)

(3)Columns/Row:返回的列名和每一行的信息。

(4)Total:总共返回的行数。

2.2 条件查询

在实际项目讲数据库所有数据都查出来的这样子的需求毕竟是少数,更多的是场景是根据某个查询条件进行查询,比如id查询、名称模糊查询,年龄大于查询等。

(-)根据id进行查询:

@Testpublic void testSelectById() {    User user = userMapper.selectById(1L);    System.out.println(user);}

运行结果:

说明:

(1)预执行的SQL:SELECT id,name,age,email FROM user WHERE id=?

(2)Parameters:参数,这里1是id=1的查询条件

(3)Columns/Row:返回的列名和每一行的信息。

(4)Total:总共返回的行数。

(-)名称模糊查询:

模糊插叙在实际的业务场景中,经常会碰到,比如:电商系统中根据商品的名称、描述、标签之类的进行模糊查询;在社交app中,通过模糊搜索自己关注的网友…

@Testpublic void testSelectLike() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.like("name","悟");    List<User> userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

这种写法也可以通过eq方法来实现通过id查询的方式:

@Testpublic void testSelectById2() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.eq("id",1);    List<User> userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

这里可以在调整的地方,通过id进行查询,数据很明显只有1条,那么可以调用参数相同的另外一个方法selectOne:

@Testpublic void testSelectById3() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.eq("id",1);    User user = userMapper.selectOne(wrapper);    System.out.println(user);}

说明:执行结果是一样的,区别就在两个方法的返回值,一个集合List,一个注解是实体对象User。

(3)大于查询:

常规的查询都是使用到QueryWrapper,这个类提供了很多开箱即用的方法:等于、大于、小于、between区间…

对于需求查询出年龄21以上的,可以这么做:

@Testpublic void testSelectGT() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.gt("age",21);    List<User> userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

说明需求是年龄大于等于21岁的,可以使用方法ge("age",21)。

(4)自定义查询语句:

有些时候,框架提供的约定的方法无法满足产品需求,这个时候可以使用自定义查询语句的方式:

@Testpublic void testSelectApply() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.apply("email like {0} and age>={1}","%qq.com%",18);    List<User> userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

2.3 自定义查询字段

在开发的时候,前端页面并不会展示数据库中的所有字段,那么这个时候,只需要返回某些字段就可以:

@Testpublic void testSelectPointFields() {    QueryWrapper<User> wrapper = new QueryWrapper();    wrapper.select("id","name");    wrapper.ge("age",21);//gt、ge    List<User> userList = userMapper.selectList(wrapper);    userList.forEach(System.out::println);}

运行结果:

说明:从运行结果来看这个时候,就只返回字段id和name了。

二、分页查询

由于数据一般都会比较多,一次性返回会撑爆服务器的内存,另外返回那么多的数据意义也不是很大,所以在实际的项目中,都会做分页查询。

对于MyBatis-Plus也提供了开箱即用的分页方法进行使用,在使用之前需要先做一个添加一个配置:

package com.kfit.config;import com.baomidou.mybatisplus.annotation.DbType;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;//Spring boot方式@Configurationpublic class MybatisPlusConfig {    // 最新版    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        return interceptor;    }    // 旧版//    @Bean//    public PaginationInterceptor paginationInterceptor() {//        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();//        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false//        // paginationInterceptor.setOverflow(false);//        // 设置最大单页限制数量,默认 500 条,-1 不受限制//        // paginationInterceptor.setLimit(500);//        // 开启 count 的 join 优化,只针对部分 left join//        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));//        return paginationInterceptor;//    }}

要将mybatisPlusInterceptor 这个方法注册到Bean里面,不然插件就会失效。

分页查询代码:

@Testpublic void testSelectPage() {    QueryWrapper<User> wrapper = new QueryWrapper();    IPage<User> page = new Page<>(2,3);    page  = userMapper.selectPage(page,wrapper);    long total =  page.getTotal();//总条数    long pageNum = page.getCurrent();//当前页码    long pageSize = page.getSize();//每页显示条数    List<User> records = page.getRecords();//记录数据    System.out.println("total:"+total+",pageNum:"+pageNum+",pageSize:"+pageSize);}

说明:定义分页查询对象Page,调用selectPage()方法。

运行结果:

说明:通过结果可以看出,这里会执行两次的SQL,一次就是查询符合条件的总记录数,一次就是通过limit查询出分页数据。

小结

这一节讲解了查询相关的以及如何分页查询,来总结本节的重点:

(1)普通查询主要是使用到的方法:selectList()、selectById()、selectOne()。

(2)分页查询:selectPage(page,wrapper)。

(3)条件类:查询是QueryWrapper,修改/删除是UpdateWrapper。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

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

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

相关文章

kali 安装cpolar内网穿透实现 ssh 远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过cpolar 内网穿透软件实现ssh 远程连接kali! 1. 启动kali ssh 服务 默认新安装的kali系统会关闭ssh 连接服务,我们通…

【GPT引领前沿】GPT4技术与AI绘图

推荐阅读&#xff1a; 1、遥感云大数据在灾害、水体与湿地领域典型案例实践及GPT模型应用 2、GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程…

内网隧道代理技术(二十)之 CS使用HTTP代理上线不出网机器

CS使用HTTP代理上线不出网机器 CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,…

Promise常用方法笔记

mixin.methods.getList(xxx) 是axios的二次封装 是通过Promise进行基本封装 let a mixin.methods.getList(toosSet.gettype);let b mixin.methods.getList(toosSet.gettypes);let c mixin.methods.getList(toosSet.gettypess);Promise.all([a, b, c]).then((res) > {aler…

026:vue中el-progress逆向倒计时方式显示

第026个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

一文了解tcp/ip协议的运行原理

接触代理ip的人都了解https/sock5等ip协议&#xff0c;那么TCP/IP 协议又是什么&#xff1f; 一、什么是TCP/IP 协议&#xff1f; TCP/IP 协议实际上是一系列网络通信协议的一个统称&#xff0c;他负责具体的数据传输工作&#xff0c;核心的两个协议包括TCP以及IP&#xff0c…

群晖NAS:黑群cpu信息显示不正确修正

群晖NAS&#xff1a;黑群cpu信息显示不正确修正 黑群晖的面板信息&#xff0c;cpu信息一直是错误的&#xff0c;很难受&#xff0c;修正方法如下&#xff1a; 【1】下载插件&#xff1a; 打开&#xff1a; https://github.com/FOXBI/ch_cpuinfo/releases 下载&#xff1a; …

基于nRF52840 Dongle配合Wireshark对Mesh网络抓包并解析(Nordic)

Mesh网络抓包解析 准备说明配置过滤解密分析 准备 1&#xff09;nRF52840 Dongle 2&#xff09;Mesh节点 3&#xff09;手机作为配网器&#xff08;苹果手机安装nRF Mesh APP&#xff09; 说明 1&#xff09;节点使用的例程目录&#xff1a;nrf5sdkformeshv500src\examples\…

贷款公司如何精准获客,大数据获客

近年来&#xff0c;贷款中介机构在金融服务领域发挥着越来越重要的作用。随着时代的发展&#xff0c;贷款中介机构不仅是贷款服务的提供者&#xff0c;也是能够帮助客户更准确获取客户的服务提供者。 为此&#xff0c;贷款中介机构应把握以下几个方面。 首先&#xff0c;贷款…

nginx-基于range做断点续传

nginx默认开启了range断点续传&#xff0c;只要再请求时载请求头上添加header&#xff0c;range&#xff0c;nginx就可以根据range范围返回相应的字节。

keepalived 主备都存在vip, keepalived主备跨网段配置;keepalived主备服务器不在同一个网段怎么配置

keepalived 主备都有vip问题&#xff1b;主备服务器不在同一个网段怎么配置 主机&#xff1a;128.192.10.10 备机&#xff1a;128.192.11.11 备机&#xff1a;128.192.22.22 # keepalived的配置文件增加如下配置即可实现 # 主机&#xff1a;128.192.10.10 vrrp_instance VI_1 {…

React笔记(一)初识React

一、React概述 1、什么是react react的官网:React 用于构建用户界面的 JavaScript 库&#xff0c;它也是一个渐进式的用于构建用户界面的javascript框架 2、主要特征 声明式&#xff1a;使用原生JS编写的页面存在着开发效率低下、性能较差的情况&#xff0c;使用react大家就…