项目中很多地方要用到表格,自然而然就需要用到数据的分页了,分页的思路大致有两种:
一种是前端分页,方式就是通过ajax请求到所有数据,然后通过js将数据迭代整理,然后将信息渲染到视图上,这种方式特点是简单,可以减少服务器的请求次数,非常适合小型web应用,但是如果数据量大了响应速度就会变慢,用户打开个列表估计会急死;
第二种就是后端分页,实现方式就是传统的条件页数查询,这种方式会根据用户需求合理的去获取少量数据,缺点是对服务器及数据库的请求次数会特别多,方式相对第一种来说会繁琐很多,但是可以保证在数据量特别大的时候也不会导致请求时间过长,适合大型web应用。
接触的数据库框架里留下印象最深的就是Hibernate和MyBatis啦,Hibernate使用封装后的hql实现对数据库的操作,MyBatis则直接使用原生的sql语句,相对来说原声sql的灵活度比较高,针对数据的分页Mybatis出了一个脱离mapper文件的分页插件PageHelper,使用方式如下:
①.导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
②.在全局配置文件中配置插件
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 方言 -->
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
</plugin>
</plugins>
③.编写接口
public List<User> queryUserListLikeName(@Param("name") String name);
④.编写映射文件
<select id="queryUserListLikeName" parameterType="String" resultType="User">
SELECT <include refid="my.common.userColumns"/> FROM tb_user WHERE name LIKE '%${name}%'
</select>
⑤.测试分页
@Test
public void testQueryUserListLikeName() {
//设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
PageHelper.startPage(1, 3, true);
List<User> users = this.userMapper.queryUserListLikeName(null);
for (User user : users) {
System.out.println(user);
}
}
结果:
可以使用PageInfo 查看分页信息
@Test
public void testQueryUserListLikeName() {
//设置分页条件,Parameters:pageNum 页码pageSize 每页显示数量count 是否进行count查询
PageHelper.startPage(1, 3, true);
List<User> users = this.userMapper.queryUserListLikeName(null);
PageInfo<User> pageInfo = new PageInfo<User>(users);
//打印分页信息
System.out.println("数据总数:" + pageInfo.getTotal());
System.out.println("数据总页数:" + pageInfo.getPages());
System.out.println("最后一页:" + pageInfo.getLastPage());
for (User user : pageInfo.getList()) {
System.out.println(user);
}
}
PageInfo的方法
(注:图片为转载)
MyBatis提供的这个分页插件对我这种懒人来说真的是福音,传统的分页方式就是在查询数据之前要先去查询数据的总
条数,然后在真正需要查询的语句后加上limit语句,使用这种方式或造成很多代码的重复,在mapper.xml中可能十几
行才能写完一个完整的分页接口,想想就可怕。PageHelper插件分页采用的是拦截方式,在拦截到需要分页的请求后
进到拦截方法中,经过一系列的校验在确定语句无误之后通过物理的方式拼接上分页字段放行进行数据库相关数据的查
询,然后自动把数据进行封装成page对象,可以通过他的内置方法进行相应数据的读取。
另外囤几张MyBatis批量操作数据库的代码截图