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