当前位置: 首页 > news >正文

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis,MybatisPlus实现数据库查询分页功能

目录

  • 基于Mybatis,MybatisPlus实现数据库查询分页功能
    • 使用Mybatis插件实现分页
      • 数据库准备
      • 分页插件配置和使用
        • 常用数据:
    • 使用MybatisPlus插件实现分页
      • 数据库准备
      • 分页插件配置和使用
      • 自定义分页查询
    • 总结

在实际项目开发过程中,分页查询功能用的还是比较多的,自己也写过不少,但每次写也都要翻一些资料,故自行整理一篇以备查看

使用Mybatis插件实现分页

使用pagehelper插件实现分页功能

数据库准备

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for t_emp
-- ----------------------------
DROP TABLE IF EXISTS `t_emp`;
CREATE TABLE `t_emp`  (`eid` int(11) NOT NULL AUTO_INCREMENT,`emp_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`age` int(11) NULL DEFAULT NULL,`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`email` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`did` int(11) NULL DEFAULT NULL,PRIMARY KEY (`eid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 53 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of t_emp
-- ----------------------------
INSERT INTO `t_emp` VALUES (1, '张三', 23, '男', '123@qq.com', 1);
INSERT INTO `t_emp` VALUES (2, '李四', 43, '女', '123@qq.com', 2);
INSERT INTO `t_emp` VALUES (3, '王五', 12, '女', '123@qq.com', 3);
INSERT INTO `t_emp` VALUES (4, '赵六', 54, '男', '123@qq.com', 1);
INSERT INTO `t_emp` VALUES (5, '田七', 23, '男', '123@qq.com', 2);
INSERT INTO `t_emp` VALUES (11, 'a', NULL, NULL, NULL, NULL);
INSERT INTO `t_emp` VALUES (12, 'a', NULL, NULL, NULL, NULL);
INSERT INTO `t_emp` VALUES (13, 'a1', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (14, 'a2', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (15, 'a3', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (16, 'a1', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (17, 'a2', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (18, 'a3', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (19, 'a1', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (20, 'a2', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (21, 'a3', 23, '男', '123@qq.com', NULL);
INSERT INTO `t_emp` VALUES (22, 'a', NULL, NULL, NULL, NULL);
INSERT INTO `t_emp` VALUES (23, 'a', NULL, NULL, NULL, NULL);
INSERT INTO `t_emp` VALUES (24, 'a', NULL, NULL, NULL, NULL);SET FOREIGN_KEY_CHECKS = 1;

分页插件配置和使用

1、添加pom依赖

<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
</dependency>

2、在MyBatis的核心配置文件(mybatis-config.xml)中配置插件

该插件就是一种拦截器,给查询添加Limit限制

    <plugins><!--设置分页插件--><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins><!--设置连接数据库的环境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED">
<!--                <property name="driver" value="com.mysql.jdbc.Driver"/>--><property name="driver" value="${jdbc.driver}"/>
<!--                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>--><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments>

3、创建测试方法测试功能

    @Testpublic void testPage() {SqlSession sqlSession = null;try {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);sqlSession = sqlSessionFactory.openSession(true);EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);// pageNum=5, pageSize=4, 表示第五页,每页四条数据PageHelper.startPage(5, 4);List<Emp> list = mapper.selectAll();PageInfo<Emp> page = new PageInfo<>(list,5);list.forEach(emp -> System.out.println(emp));System.out.println(page);} catch (IOException e) {e.printStackTrace();}}

4、结果

PageInfo{pageNum=5, pageSize=4, size=4, startRow=17, endRow=20, total=47, pages=12, list=Page{count=true, pageNum=5, pageSize=4, startRow=16, endRow=20, total=47, pages=12, reasonable=false, pageSizeZero=false}[Emp{eid=22, empName='a', age=null, sex='null', email='null', did=null}, Emp{eid=23, empName='a', age=null, sex='null', email='null', did=null}, Emp{eid=24, empName='a', age=null, sex='null', email='null', did=null}, Emp{eid=25, empName='a', age=null, sex='null', email='null', did=null}], prePage=4, nextPage=6, isFirstPage=false, isLastPage=false, hasPreviousPage=true, hasNextPage=true, navigatePages=5, navigateFirstPage=3, navigateLastPage=7, navigatepageNums=[3, 4, 5, 6, 7]}
常用数据:
  • pageNum:当前页的页码
  • pageSize:每页显示的条数
  • size:当前页显示的真实条数
  • total:总记录数
  • pages:总页数
  • prePage:上一页的页码
  • nextPage:下一页的页码
  • isFirstPage/isLastPage:是否为第一页/最后一页
  • hasPreviousPage/hasNextPage:是否存在上一页/下一页
  • navigatePages:导航分页的页码数
  • navigatepageNums:导航分页的页码,[1,2,3,4,5]

使用MybatisPlus插件实现分页

可见,上述Mybatis基于xml配置的方式实现分页,还是有些麻烦的。MybatisPlus是对Mybatis的进一步封装和加强,因此分页功能会比Mybatis更便捷。测试的SpringBoot目录结构如下
在这里插入图片描述

数据库准备

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` bigint(20) NOT NULL COMMENT '主键ID',`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',`age` int(11) NULL DEFAULT NULL COMMENT '年龄',`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jone', 18, 'test1@baomidou.com');
INSERT INTO `user` VALUES (2, 'Jack', 20, 'test2@baomidou.com');
INSERT INTO `user` VALUES (3, 'Tom', 28, 'test3@baomidou.com');
INSERT INTO `user` VALUES (4, 'Sandy', 21, 'test4@baomidou.com');
INSERT INTO `user` VALUES (5, 'Billie', 24, 'test5@baomidou.com');SET FOREIGN_KEY_CHECKS = 1;

分页插件配置和使用

1、配置分页插件

@Configuration
// 扫描mapper接口所在的包
@MapperScan("com.mystudy.mybatisplus.mapper")
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){// 分页插件配置MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return mybatisPlusInterceptor;}}

2、创建mapper文件

@Repository
public interface UserMapper extends BaseMapper<User> {}

这里什么也不需要写,继承BaseMapper类即可,MybatisPlus提供了默认方法
在这里插入图片描述
3、创建测试方法测试功能

@SpringBootTest
public class PluginsTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testPage(){// 设置当前页和每页显示的条数,即第一页,每页三个,因此会将前三条记录查出Page<User> page = new Page<>(1, 3);userMapper.selectPage(page, null);System.out.println("===============================");System.out.println(page.getRecords());System.out.println(page.getTotal());System.out.println(page.getPages());System.out.println(page.hasNext());System.out.println(page.hasPrevious());}}

4、查询结果

[User(id=1, name=Jone, age=18, email=test1@baomidou.com), User(id=2, name=Jack, age=20, email=test2@baomidou.com), User(id=3, name=Tom, age=28, email=test3@baomidou.com)]
5
2
true
false

自定义分页查询

1、自定义查询条件

自定义分页功能,通过年龄查询用户信息并分页

@Repository
public interface UserMapper extends BaseMapper<User> {/*** 自定义分页功能,通过年龄查询用户信息并分页* @param page MybatisPlus提供的分页对象,必须位于第一个参数的位置* @param age* @return*/Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);}

2、创建xml映射文件(与Mybatis方式相同)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mystudy.mybatisplus.mapper.UserMapper"><!--    Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);--><select id="selectPageVo" resultType="User">select id, name, age, email from user where age > #{age}</select></mapper>

这里可以对User进行别名配置,在yml配置文件中:

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 配置类型别名所对应的包type-aliases-package: com.mystudy.mybatisplus.pojo

可以看到,我们并没有在sql语句中写关于分页的信息

3、创建测试方法测试功能

    @Testpublic void testPageVo(){Page<User> page = new Page<>(1, 3);userMapper.selectPageVo(page, 20);System.out.println("===============================");System.out.println(page.getRecords());System.out.println(page.getTotal());System.out.println(page.getPages());System.out.println(page.hasNext());System.out.println(page.hasPrevious());}

4、查询结果

[User(id=3, name=Tom, age=28, email=test3@baomidou.com), User(id=4, name=Sandy, age=21, email=test4@baomidou.com), User(id=5, name=Billie, age=24, email=test5@baomidou.com)]
3
1
false
false

总结

在真正项目开发中,分页功能是必不可少的,需要前端向后端传输page和pageSize两个参数,我们这里的功能仅作演示,因此是写死的。熟能生巧,多用多会。

相关文章:

基于Mybatis,MybatisPlus实现数据库查询分页功能

基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能 目录 基于Mybatis&#xff0c;MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据&#xff1a; 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…...

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…...

技术文档的定义和规范,以及技术文档模板参考

技术文档是指用于记录、传达和共享技术信息的文档&#xff0c;通常涵盖系统设计、开发过程、用户指南、维护手册等内容。技术文档的质量直接影响到项目的可维护性、可扩展性和团队的协作效率。以下是技术文档的定义和一些规范&#xff1a; 一、定义 技术文档是用于描述产品、系…...

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…...

力扣9. 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数 是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…...

C#—BitArray点阵列

C#—BitArray点阵列 在 C# 中&#xff0c;BitArray 类用来管理一个紧凑型的位值数组&#xff0c;数组中的值均为布尔类型&#xff0c;其中 true&#xff08;1&#xff09;表示此位为开启&#xff0c;false&#xff08;0&#xff09;表示此位为关闭。 当需要存储位&#xff08…...

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证

华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统&#xff0c;标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布&#xff0c;使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…...

esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用

esxi8 虚拟机使用模板后 没有ip配置文件&#xff0c;只有ipv6链接正常使用&#xff0c;/etc/NetworkManager/system-connections配置下没有配置文件 只有/etc/netplan/有文件 sudo ip addr add 192.168.1.9/24 dev ens35 # 临时设置ip&#xff0c; 接口名ens35 sudo vi /et…...

【Qualcomm】IPQ5018查看连接终端RSSI、SNR、NF方法

IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...

【构建工具】现代开发的重要角色

你可能有所听闻构建工具&#xff0c;但是不知道是干什么的&#xff0c;或者是开发中用到了&#xff0c;大概会使用&#xff0c;但是想理解一下具体的工作原理等&#xff0c;那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时&#xff0c;可以把它…...

【Linux系统】—— 初识 shell 与 Linux 中的用户

【Linux系统】—— 初识shell 与 Linux 中的用户 1 Xshell 运行原理1.1 命令行的组成1.2 外壳程序 2 Linux中的用户2.1 两种用户2.2 创建普通用户2.3 用户切换2.3.1 普通->超级2.3.2 超级->普通 3 指令的短暂提权3.1 为什么要提权3.2 sudo 指令3.3 人人都能提权吗 1 Xshe…...

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强)

二维码数据集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco标注&#xff0c;3044张各种二维码原始图片&#xff08;未图像增强&#xff09; 数据集分割 训练组70&#xff05; 2132图片 有效集20&#xff05; 607图片 测试集10&#xff05; 305图…...

Vue指令

创建项目&#xff1a; vue init webpack 项目名称 element-ui npm i element-ui -saxios npm i axios1.1.3 -S vuex npm i vuex3.6.2 -S vuex持久化 npm i -S vuex-persistedstate4.1.0代理模版 proxyTable: {/api: {target: http://localhost:8081/,changeOrigin: true,pathRe…...

数据保护策略:如何保障重要信息的安全

一、什么是数据安全&#xff1f; 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程&#xff0c;负责监督信息的收集、存储和传输。 机密性&#xff1a;保护数据免遭未授权方访问。 完整性&#xff1a;保护数据免遭未经授权的修改、损坏…...

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器&#xff0c;不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址&#xff1a; Chrome for Testing availability 我下载的是如下两个安装包&#xff0c;解压即可。 2.导包 pip install selenium然后用python代码引用即可…...

递归求最大公约数

#include <stdio.h>// 函数声明 int gcd(int a, int b);int main() {int x, y;printf("请输入两个正整数&#xff1a;");scanf("%d %d", &x, &y);printf("最大公约数是&#xff1a;%d\n", gcd(x, y));return 0; }// 递归求最大公约…...

关于在浏览器里面获取手机方向的事件

先说问题&#xff1a;浏览器有一个自带原生的获取手机方向的事件方法 deviceorientation: https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent/DeviceOrientationEvent 这个事件里面有个实例absolute 看名字知道意思吧&#xff0c;对就是绝对坐标的意…...

STM32 出租车计价器系统设计(一) 江科大源码改写

STM32 出租车计价器系统设计 功能目标 驱动步进电机模拟车轮旋转&#xff0c;并实现调速功能。 设置车轮周长和单价&#xff0c;检测车轮转速和运转时间。 计算并显示行驶里程和价格。 硬件材料 28BYJ48 五线四相步进电机和 ULN2003 驱动板模块 测速传感器模块 嵌入式小系统…...

eclipse rcp-创建rcp-创建target

1.创建一个target文件&#xff0c;将其命名为mine-rcp.target 2. 编辑target 2.1 点击add按钮&#xff0c;选中software site 2.2 选择一个software site 打开浏览器。 选择一个合适的eclipse作为基础版本。进入https://download.eclipse.org/eclipse/downloads/https://dow…...

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...