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

相关推荐
yuanbenshidiaos30 分钟前
c++---------数据类型
java·jvm·c++
向宇it34 分钟前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
Lojarro1 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干1 小时前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion1 小时前
Springboot的创建方式
java·spring boot·后端
zjw_rp2 小时前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob2 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
TodoCoder2 小时前
【编程思想】CopyOnWrite是如何解决高并发场景中的读写瓶颈?
java·后端·面试
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行2 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate