[Spring MVC 4] MyBatis 分页开发

news2024/11/30 14:39:25

在做Web开发的时候,需要对查询结果进行分页查询,初学者会使用原生的sql查询方式,例如limit关键字,不过这种属于对数据库物理分页了,然而会造成数据库本身的压力,所以分页管理就诞生了。一般在Mybatis中使用的就是RowBounds,当然了也有PageHelper.

本章内容较为基础,建议可以和上一期的MyBatis开发进行联系学习。MyBatis详解

目录

  • RowBounds 分页
    • 概述
    • RowBounds分页使用
    • RowBounds 分页原理
  • 分页插件PageHelper

RowBounds 分页

概述

分页查询,就是将数据库查询的结果在有限的界面分好多页显示,分页是许多网站常用的功能,也是最基本的功能。分页查询可分为逻辑分页和物理分页。
逻辑分页:数据库返回全部数据,通过代码获取分页数据。一次性从数据库查询全部数据并存储到List集合,List集合有序,根据索引指定范围。
物理分页:使用数据库自身所带的分页机制。Mysql的limit机制进行分页,因为是对数据库实实在在数据分页条件查询。
而我们没有必要将属于数据库端的压力施加到应用端来,建议使用物理分页而不是逻辑分页

RowBounds分页使用

MyBatis提供可以进行逻辑分页的RowBounds类,通过传递对象,来进行数据库分页操作,任何select都可以使用。遗憾的是是对ResultSet结果集分页,也就是常所说的逻辑分页,用sql查询所有结果,然后根据从第几条取回。

在AyUserMapper.xml添加select查询:

 <resultMap id="userMap" type="com.thr.pojo.User">
        <id property="userId" column="id"/>
        <result property="userName" column="username"/>
        <result property="userAge" column="age"/>
        <result property="userBirthday" column="birthday"/>
        <result property="userSex" column="sex"/>
        <result property="userAddress" column="address"/>
    </resultMap>
 
    <!-- 分页查询所有用户,通过原生limit -->
    <select id="selectAllUserByLimit" resultMap="userMap">
        select * from t_user limit #{start},#{size}
    </select><sql id="userField">
        a.id as "id",
        a.name as "name",
        a.password as "password"
    </sql>
<!--    获取所有用户-->
    <select id="findAll" resultType="com.ay.model.AyUser">
        select
        <include refid="userField"/>
            from ay_user as a

    </select>

然后,在AyUserDao接口添加查询方法findAll,方法入参是RowBounds,注意service层我就不再书写。

 List<AyUser> findAll(RowBounds rowBounds);

进行测试会显示全部的信息,当然我们可以进行指定:

 public class AyUserDaoTest  extends BaseJunit4Test{
    @Resource
    private AyUserDao ayUserDao;

    @Test
    public void testFindAll() {
        List<AyUser> userList = ayUserDao.findAll(new RowBounds(0,1));
        for(int i=0;i<userList.size();i++) {
            System.out.println(userList.get(i).getName());
        }
    }

}

在这里插入图片描述
数据库的内容:,可以分页结果就是(0,1)内容。
在这里插入图片描述

RowBounds 分页原理

这里先展现一部分RowBounds的源码部分:

//构造函数
public RowBounds() {
	this.offset = NO_ROW_OFFSET;
	this.limit = NO_ROW_LIMIT;
}

offset表示从第几行开始读取,limit表示返回的记录数
接着我们来看一下DefaultSqlSession类的查询接口,部分源码如下:

<E> List<E> selectList(String statement,Object parameter);
<E> List<E> selectList(String statement,Object parameter,RowBounds row)

可见,查询接口是以RowBounds作为参数来进行分页的。

分页插件PageHelper

是一款开源免费的Mybatis的物理分页插件。可以方便实现物理分页。与RowBounds相比其查询更好。
首先添加依赖:

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.4</version>
        </dependency>

在applicationContext.xml配置文件添加PageHelper相关配置:

<!--3、配置SqlSessionFactory对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--扫描sql配置文件:mapper需要的xml文件-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!-- mybatis配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <!-- 配置分页插件 -->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                            reasonable=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>

    </bean>

在AyUserDaoTest进行开发测试用例:

@Test
    public void testPageHelper() {
    //(第几页,多少条数据)
        PageHelper.startPage(0,1);
        List<AyUser> list = ayUserDao.findAll();
        //用pageinfo对结果进行包装
        PageInfo pageInfo = new PageInfo(list);
    }

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

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

相关文章

校园二手交易系统,二手交易网站,闲置物品交易系统毕业设计作品

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的二手交易网站系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;用户通过登录网站&#xff0c;查询二手交易商品&#xff0c;购买二手交易网站…

对于volatile的看法

volatile原意是易变的&#xff0c;编译器对volatile修饰的变量&#xff0c;当要读取这个变量时&#xff0c;任何情况下都会从内存中读取&#xff0c;而不会从寄存器缓存中读取。 编译器不会对volatile修饰的变量进行任何优化 1&#xff09;非volatile变量 在这个用例中&#…

codery-why蘑菇街商城项目梳理笔记

supermallagain-学习记录 项目目录搭建 安装vue以及整理目录 样式初始化 引入assets/css/normalize.css文件 在实际开发中&#xff0c;经常会将浏览器默认的样式进行重置 *{margin:0;padding:0;border:0;}但是*是通配符&#xff0c;需要把所有的标签都遍历一遍&#xff0c;…

MySQL底层知识总结

MySQL数据库配置主从 三大日志 -binlog 归档日志 -redolog 重做日志 -undolog docker run --name mysql102 -p 33062:3306 -e MYSQL_ROOT_PASSWORD123 -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ciGRANT REPLICATION SLAVE ON *.* t…

Spring Bean 的生命周期(看着图不迷路)

目录 Bean的生命周期5步走系列&#xff1a; BeanLifeCycle类 Spring.xml 配置文件 BeanLifeTest测试方法 运行结果&#xff1a; Bean的生命周期7步走系列:在实例化Bean的前和后加了两步。​​​​ 定义myInstantiationAwareBeanPostProcessor 类 实现InstantiationAwar…

【JavaWeb】一文搞懂Java过滤器与拦截器的区别

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要分享Java过滤器与拦截器的知识。…

字节跳动测开实习生面试,拿15K过分吗?

今年9月面了字节跳动的测试开发岗&#xff08;日常实习岗&#xff09;&#xff0c;2面技术面和1面hr面。拿到offer后&#xff0c;考虑到自己还是想保研怕成绩掉&#xff0c;选择留在学校&#xff0c;拒offer。 很幸运的是我的简历被内推到了其他部门&#xff0c;今年10月初字节…

【MySQL性能优化系列】select count(*)走二级索引比主键索引快几百倍,你敢信?

问题 在MySQL版本5.7数据测试过程中&#xff0c;一张百万数据的表用 select count(*)查询特别慢需要20s并且是走了主键索引&#xff0c;为什么查询还需要这么久&#xff1f;如何优化&#xff1f;下面我们将请到当事SQL进行发言 验证分析 猜想 先猜想一波为什么走了主键索引依…

【Vue3】手把手教你创建前端项目 Vue3 + Ts + vite + pinia

文章目录一、 项目初始化二、 代码风格安装eslint安装prettier三、 状态管理工具--Pinia优点使Pinia 基本使用四、Vue-Router4 快速上手指南五、VueUse快速上手指南什么是 VueUse简单上手六、全局样式CSS原生 css 新特性scss 或 less封装axios安装依赖封装UI 样式库一、 项目初…

数据结构(二叉树)——Java实现

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 树型结构 什么是树 树的相关概念 树的表现形式 树的引用 二叉树 概念 二叉树的种类 常规二叉树 满二叉树 完全二叉树 二叉树的性…

京东商品接口加解密算法解析

最近,闲来没事,打开看了一下京东图书的热销榜,想通过接口查看下它接口的加密方式,于是直接打开了M站的地址:https://m.jd.com/,然后打开搜索页面,如下图。 打开页面,打开开发者工具,往下滑动鼠标,获取接口地址。 解析一下接口,接口返回值跟没什么特殊说明,首尾加…

spring boot 整合 shiro 框架

1、整合shiro 1.1、创建spring boot项目 1.2、引入依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.9.0</version> </dependency><!--mybatis…

云手机在黑产中的应用

虚拟化技术是当下黑灰产的热门技术。使用虚拟化环境&#xff0c;让黑灰产可以利用虚拟环境在应用运行环境的更底层这一优势&#xff0c;对 App 进行神不知鬼不觉的修改&#xff0c;从而避免在分析、破解 App 上的投入。 较早之前以 VirtualApp 为代表的 Android 虚拟化多开工具…

OpenHarmony源码分析(二):系统安全

1、 概要 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gc6K9a9A-1667380110547)(PNG/11.png)] 2、 进程隔离 OpenHarmony 内核态的进程之间无隔离,共享一块VMM空间,用户态进程每个用户用于自己独立的空间,相互之间不可见,通过MMU 机制实现进…

拓端tecdat|python在Scikit-learn中用决策树和随机森林预测NBA获胜者

全文链接&#xff1a;http://tecdat.cn/?p5222 原文出处&#xff1a;拓端数据部落公众号 在本文中&#xff0c;我们将以Scikit-learn的决策树和随机森林预测NBA获胜者。美国国家篮球协会&#xff08;NBA&#xff09;是北美主要的男子职业篮球联赛&#xff0c;被广泛认为是首屈…

【Transformers】第 5 章:微调文本分类的语言模型

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Go语言入门【1】数据类型、变量、常量

常见基本数据类型 uint8&#xff1a;无符号8位整形&#xff0c;取值范围&#xff1a;0-255 uint16&#xff1a;无符号16位整形&#xff0c;取值范围&#xff1a;0-65535 uint32&#xff1a;无符号32位整形&#xff0c;取值范围&#xff1a;0-4294967295 uint64&#xff1a;…

高分辨空间代谢组学测试的样品要求以及常见问题

高分辨空间代谢组学可实现定量检测&#xff0c;亦可定性检测&#xff0c;且可一次可同时检出多种类型的化合物&#xff0c;包括脂类、小分子代谢物、蛋白质、药物及其载体等&#xff0c;并且能够呈现出这些物质的空间分布情况。高分辨空间代谢组学测试的样品要求&#xff1a; …

单链表思路讲解+C语言代码实现

单链表的实现什么是单链表单链表的结构图讲解创建链表打印链表尾插链表尾删链表头插链表和头删链表查询链表特定位置插入特定位置删除销毁链表总结学海无涯&#xff0c;苦作舟啊&#xff01; 老铁们加油 源代码放在总结处&#xff0c;需要的同志可以直接跳转到最后什么是单链表…

题库API调用详细教程

题库API调用详细教程 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…