Hutool使用指南(五):分页工具

     阅读本篇文章大约花费您4~5分钟!


     今天是Hutool的第五篇文章,一起了解一下分页工具的使用。

     分页工具:PageUtil,主要帮助操作数据库的方便,几乎所有的网页都需要使用分页来显示过多的数据,以MySQL为例,常用的是limit子句,用于限制查询的结果,limit后面的参数是起始记录,而我们更加习惯于第几页和每一页的容量来描述分页,分页工具可以很方便的帮助我们转换。

PageUtil的静态方法

方法 含义
transToStartEnd(int,int):int[] 将页数和页容量转换为数据表中的起始位置
totalPage(int,int):int 由总记录数和页容量获得页数
rainbow(int,int):int[] 彩虹分页算法
rainbow(int,int,int):int[] 彩虹分页算法

分页描述方式的转换

可以使用transToStartEnd(int,int):int[]进行转换,第一个参数是页码数,第二个参数是每一页的容量,返回值是一个长度为2的数组,分别表示开始位置和结束位置。

新建一个数据表User如下:

一共有9条数据,我们假设每一页只能显示4条记录,进行如下测试

package hutool.test.page;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import cn.hutool.core.util.PageUtil;

public class Test {
	
	/*获得数据库连接*/
	public static Connection getConnection() {
		String driverClass="com.mysql.cj.jdbc.Driver";
		String jdbcUrl="jdbc:mysql://localhost:3306/zh_hibernate?serverTimezone=UTC";
		String user="root";
		String password="****";
		try {
			Class.forName(driverClass);
			return DriverManager.getConnection(jdbcUrl, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 获得指定页的结果集
	 * @param pageNum 页数(从1开始)
	 * @param pageSize 每页容量
	 * @return 结果集ResultSet
	 */
	public static ResultSet getDatas(int pageNum,int pageSize) {
		int startEnd[]=PageUtil.transToStartEnd(pageNum, pageSize);
		String sql="select name,password from user limit ?,?";
		PreparedStatement ps=null;
		Connection con=null;
		try {
			con=Test.getConnection();
			ps=con.prepareStatement(sql);
			ps.setInt(1, startEnd[0]);
			ps.setInt(2,startEnd[1]);
			return ps.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 显示每页的数据
	 * @param pageNum 页号(从1开始)
	 * @param pageSize 每页容量
	 */
	public static void showPageDatas(int pageNum,int pageSize) {
		ResultSet resultSet=Test.getDatas(pageNum,pageSize);
		try {
			System.out.println("第"+pageNum+"页的数据如下:");
			while(resultSet.next()) {
				System.out.println("name:"+resultSet.getString(1)+",password"+resultSet.getString(2));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	
	public static void main(String[] args) throws SQLException {
		Test.showPageDatas(1, 4);
		Test.showPageDatas(2, 4);
		Test.showPageDatas(3, 4);
	}
	/**测试结果:
	第1页的数据如下:
	name:aaa,password111111
	name:bbb,password222222
	name:ccc,password333333
	name:ddd,password444444
	第2页的数据如下:
	name:eee,password555555
	name:fff,password666666
	name:ggg,password777777
	name:hhh,password888888
	name:iii,password999999
	第3页的数据如下:
	name:iii,password999999
	 */
}

首先编写一个getConnection()方法获取MySQL数据库的连接,分别编写得到分页数据和显示分页数据的两个方法,测试的结果显示我们只需要传入页码和页容量就可以查询到每一页对应的数据,并且当剩余记录不足页容量时也是会正常的显示最后的记录。

获得总页数

获得总页数可以使用totalPage(int,int):int方法,第一个参数是总的记录数,第二个参数是每页的容量,返回值是总页数

package hutool.test.page;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import cn.hutool.core.util.PageUtil;

public class Test {
	
	/*获得数据库连接*/
	public static Connection getConnection() {
		String driverClass="com.mysql.cj.jdbc.Driver";
		String jdbcUrl="jdbc:mysql://localhost:3306/zh_hibernate?serverTimezone=UTC";
		String user="root";
		String password="****";
		try {
			Class.forName(driverClass);
			return DriverManager.getConnection(jdbcUrl, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	
	/**
	 * 得到总页数
	 * @param totalCount 总记录数
	 * @param pageSize 每页的记录数
	 * @return
	 */
	public static int getTotalPage(int totalCount,int pageSize) {
		return PageUtil.totalPage(totalCount, pageSize);
	}
	
	public static void main(String[] args) throws SQLException {
		System.out.println(Test.getTotalPage(23, 5));
	}
	/**测试结果:
	5
	 */
}

方法很简单,也没有什么要解释的。

彩虹分页算法

彩虹分页算法应用于网页中需要经常显示【上一页】1 2 3 4 5 【下一页】这种页码的情况,一般都根据当前的页码动态的更新所显示出来的页码,因为每次所显示的页码的数量是固定的。

Hutool的PageUtil提供了两种彩虹分页算法,分别是

  • rainbow(int,int):int[] 第一个参数表示当前页码,第二个参数表示总页数,这种情况默认是一次显示所有的页码(这个方法个人觉得没有什么用)
  • rainbow(int,int,int):int[] 第一个参数表示当前页码,第二个参数表示总页数,第三个参数表示每一次最多显示的页数
package hutool.test.page;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import cn.hutool.core.util.PageUtil;

public class Test {
	
	/*获得数据库连接*/
	public static Connection getConnection() {
		String driverClass="com.mysql.cj.jdbc.Driver";
		String jdbcUrl="jdbc:mysql://localhost:3306/zh_hibernate?serverTimezone=UTC";
		String user="root";
		String password="****";
		try {
			Class.forName(driverClass);
			return DriverManager.getConnection(jdbcUrl, user, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	/**
	 * 测试分页彩虹算法
	 * @param curPage 当前页数
	 * @param totalPage 总页数
	 * @return 
	 */
	public static String rainbowPage(int curPage,int totalPage) {
		int rainbow[]=PageUtil.rainbow(curPage,totalPage);
		return Arrays.toString(rainbow);
	}
	
	/**
	 * 测试分页彩虹算法
	 * @param curPage 当前页数
	 * @param totalPage 总页数
	 * @param size 每次显示的页数量
	 * @return
	 */
	public static String rainbowPage(int curPage,int totalPage,int size) {
		int rainbow[]=PageUtil.rainbow(curPage,totalPage,size);
		return Arrays.toString(rainbow);
	}
	
	
	public static void main(String[] args) throws SQLException {
		System.out.println(Test.rainbowPage(4, 10));
		System.out.println(Test.rainbowPage(10, 20, 8));
	}
	/**测试结果:
	[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
	[7, 8, 9, 10, 11, 12, 13, 14]
	 */
}

      以上就是分页工具的所有内容,相对来说还是比较简单,分页更多的应用于真实的Web场合,和数据库查询关系密切,虽然一些流行的数据库框架已经提供了分页的技术(比如MyBatis就提供了分页工具,并且支持插件分页),但是这种简单的小工具很有可能在很多场合都会使用到。博主最近也在参加学校的科技创新项目,感觉Hutool这个工具可以适用于项目的很多场合,以后再继续和大家分享!

      希望大家都可以坚持自己的目标,共同进步!!!

猜你喜欢

转载自blog.csdn.net/tianc_pig/article/details/88628323