• [Spring MVC 4] MyBatis 分页开发


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

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

    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>
     
        
        <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

     List<AyUser> findAll(RowBounds rowBounds);
    
    • 1

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

     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());
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    RowBounds 分页原理

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

    //构造函数
    public RowBounds() {
    	this.offset = NO_ROW_OFFSET;
    	this.limit = NO_ROW_LIMIT;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

    分页插件PageHelper

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

    <dependency>
                <groupId>com.github.pagehelpergroupId>
                <artifactId>pagehelperartifactId>
                <version>5.1.4version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            
            <property name="dataSource" ref="dataSource"/>
            
            <property name="mapperLocations" value="classpath:mapper/*.xml"/>
            
            <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在AyUserDaoTest进行开发测试用例:

    @Test
        public void testPageHelper() {
        //(第几页,多少条数据)
            PageHelper.startPage(0,1);
            List<AyUser> list = ayUserDao.findAll();
            //用pageinfo对结果进行包装
            PageInfo pageInfo = new PageInfo(list);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Python高级_第5章_Python高级语法与正则表达式
    协同存储,为边缘计算创造更大价值
    开篇——初识云原生
    数据库基础——3.SQL概述及规范
    如何通过Express和React处理SSE
    操作系统读者-写者问题中算是允许多个进程进入临界区吗
    五分钟了解MES与MOM的区别和联系
    JavaScript FormData基本方法介绍
    Lagging issues of Ubuntu 20.04 on VMWare Player(卡顿问题)
    supervisor管理进程用法详解
  • 原文地址:https://blog.csdn.net/QAZJOU/article/details/127643290