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

[Spring MVC 4] MyBatis 分页开发

在做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);
    }

相关文章:

  • linux环境配置以及远程登录linux
  • EXCEL表格-批量去除百分号%的三种方案
  • 重装系统后打印机状态已暂停如何恢复
  • 薪资17K,在字节外包工作是一种什么体验...
  • 自学Python,学不会怎么办?
  • 【老生谈算法】matlab实现图像增强处理算法源码——图像增强处理算法
  • 【HTML5期末大作业】制作一个简单HTML我的班级网页(HTML+CSS+JS)
  • 互联网摸鱼日报(2022-11-03)
  • Qt 自定义控件
  • 字节跳动测开实习生面试,拿15K过分吗?
  • 【javaEE】多线程初阶(Part6 阻塞队列)
  • java-php-python-中小型超市管理系统计算机毕业设计
  • 如何使用Jupyter Notebook
  • MongoDB 数据库(一):MongoDB的介绍与安装
  • 数商云采购管理系统:采购业务模式介绍,助力汽车零部件企业采购业务高效协同
  • ES6指北【2】—— 箭头函数
  • 自己简单写的 事件订阅机制
  • [译]前端离线指南(上)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android开源项目规范总结
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HashMap剖析之内部结构
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java-详解HashMap
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Logstash 参考指南(目录)
  • Material Design
  • Mybatis初体验
  • node 版本过低
  • Python_网络编程
  • Python实现BT种子转化为磁力链接【实战】
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Zsh 开发指南(第十四篇 文件读写)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 电商搜索引擎的架构设计和性能优化
  • 官方解决所有 npm 全局安装权限问题
  • 聚类分析——Kmeans
  • 理清楚Vue的结构
  • 配置 PM2 实现代码自动发布
  • 我是如何设计 Upload 上传组件的
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ###C语言程序设计-----C语言学习(3)#
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (力扣题库)跳跃游戏II(c++)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)ABI是什么