/**
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 上午11:01:40
*/
package com.gangyi.util;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import com.gangyi.crm.vo.PageVo;
/**
* 分页算法处理类
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 上午11:01:40
*/
@Scope("prototype")
public class PageUtil {
//每页行数
private int rows;
//分页查询起始序列
private int limit;
//首页A标签
private String fistPageHtml;
//上一页A标签
private String upPageHtml;
//下一页A标签
private String nextPageHtml;
//末页A标签
private String lastPageHtml;
//总记录数
private int recordCount;
//总页数
private int allPage;
//当前页
private int currPage;
// 分页带页码 ,最大页签显示数
private final int CUTPAGE_MAX_PAGE = 6;
// 分页带页码,多少页进行折叠
private final int CUTPAGE_LOOP_PAGE = 3;
private void setRows(int rows) {
this.rows = rows;
}
private void setLimit(int limit) {
this.limit = limit;
}
private void setFistPageHtml(String fistPageHtml) {
this.fistPageHtml = fistPageHtml;
}
private void setUpPageHtml(String upPageHtml) {
this.upPageHtml = upPageHtml;
}
private void setNextPageHtml(String nextPageHtml) {
this.nextPageHtml = nextPageHtml;
}
private void setLastPageHtml(String lastPageHtml) {
this.lastPageHtml = lastPageHtml;
}
private void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
private void setAllPage(int allPage) {
this.allPage = allPage;
}
private void setCurrPage(int currPage) {
this.currPage = currPage;
}
/**
* 获得每页行数
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:53:50
* @return
*/
public int getRows() {
return rows;
}
/**
* 获得其实页序列
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:54:01
* @return
*/
public int getLimit() {
return limit;
}
/**
* 获得首页a标签
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:57:21
* @return
*/
public String getFistPageHtml() {
return fistPageHtml;
}
/**
* 获得上一页a标签
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:57:32
* @return
*/
public String getUpPageHtml() {
return upPageHtml;
}
/**
* 获得下一页a标签
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:57:44
* @return
*/
public String getNextPageHtml() {
return nextPageHtml;
}
/**
* 获得末页a标签
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:57:55
* @return
*/
public String getLastPageHtml() {
return lastPageHtml;
}
/**
* 获得总数据记录数
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:58:15
* @return
*/
public int getRecordCount() {
return recordCount;
}
/**
* 获得总页数
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:58:25
* @return
*/
public int getAllPage() {
return allPage;
}
/**
* 获得当前页
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:59:00
* @return
*/
public int getCurrPage() {
return currPage;
}
/**
* 传入需要的页码,和每页显示的行数算出mysql中分页的开始偏移数据,方便输入到sql语句中查询
* 如getLimtAndLines(10,10)
* 返回map
* map.get("limit") 等于90
* map.ger("rows") 等于10
* 那么在sql语句中即是:select * from table limit 90,10
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 上午11:06:34
* @param page 当前页
* @param lines 每页行数
* @return
*/
public Boolean getLimtAndLines(int page,int lines){
try
{
if(page < 1){
page = 1;
}
if(lines < 1){
lines = 15;
}
this.setLimit((page - 1) * lines);
this.setRows(lines);
}
catch (Exception e)
{
return false;
}
return true;
}
/**
* 生成页面分页代码主方法
* 根据总条数,以及ACTION路径、当前页和每页显示行数,计算出上一页,下一页等数据,并生成HTML中的A标签或者数字供前台调用
* 返回值是true 或 false
* 当为false时 代表没有数据,也无需进行计算,页面直接判断是否为NULL显示与否即可
* 其余方法下取值如下
* PageUtil.getFistPageHtml() 获取首页标签
* PageUtil.getUpPageHtml() 获取上一页标签
* PageUtil.getNextPageHtml() 获取下一页标签
* PageUtil.getLastPageHtml() 获取末页标签
* PageUtil.getRecordCount() 获取总记录数
* PageUtil.getAllPage() 获取总页数
* PageUtil.getCurrPage() 获取当前页
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午02:56:14
* @param allCount 总记录数
* @param actionUrl ACTION路径
* @param lines 每页行数
* @param page 第几页
* @return
*/
public Boolean getPageHtml(int allCount,String actionUrl,int lines,int page){
try{
//判断是否有记录
if( allCount == 0){
return false;
}
//判断当前页数
if( page < 1){
page = 1;
}
//总记录数
int recordCount = allCount;
//总页数
int allPage = recordCount % lines == 0 ? recordCount / lines : recordCount / lines + 1;
//当前页
int currPage = page;
//首页
int firstPage = 1;
//末页
int lastPage = allPage;
//上一页
int upPage = currPage - 1;
//下一页
int nextPage = currPage + 1;
//设置分页VO对象
PageVo pageVo = new PageVo();
pageVo.setRecordCount(recordCount);
pageVo.setAllPage(allPage);
pageVo.setCurrPage(currPage);
pageVo.setFirstPage(firstPage);
pageVo.setLastPage(allPage);
pageVo.setUpPage(upPage > firstPage ? upPage : firstPage);
pageVo.setNextPage(nextPage < lastPage ? nextPage : lastPage);
//调用生成页面的方法
this.toHtmlFromPageMap(pageVo,actionUrl);
}catch (Exception e) {
return false;
}
return true;
}
/**
* 生成页面分页代码,供主方法调用
* 根据分页VO以及ACTION路径、生成HTML中的A标签或者数字供前台调用
* 其取值如下
* PageUtil.getFistPageHtml() 获取首页标签
* PageUtil.getUpPageHtml() 获取上一页标签
* PageUtil.getNextPageHtml() 获取下一页标签
* PageUtil.getLastPageHtml() 获取末页标签
* PageUtil.getRecordCount() 获取总记录数
* PageUtil.getAllPage() 获取总页数
* PageUtil.getCurrPage() 获取当前页
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午03:04:25
* @param pageVo 分页VO
* @param actionUrl ACTION路径
* @return
*/
private void toHtmlFromPageMap(PageVo pageVo,String actionUrl){
this.setFistPageHtml("<a href= <%=request.getContextPath()%>"+actionUrl+"?page="+pageVo.getFirstPage()+">首页</a>");
this.setUpPageHtml("<a href= <%=request.getContextPath()%>"+actionUrl+"?page="+pageVo.getUpPage()+">上一页</a>");
this.setNextPageHtml("<a href= <%=request.getContextPath()%>"+actionUrl+"?page="+pageVo.getNextPage()+">下一页</a>");
this.setLastPageHtml("<a href= <%=request.getContextPath()%>"+actionUrl+"?page="+pageVo.getLastPage()+">末页</a>");
//总记录数
this.setRecordCount(pageVo.getRecordCount());
//总页数
this.setAllPage(pageVo.getAllPage());
//当前页
this.setCurrPage(pageVo.getCurrPage());
}
/**
* 根据总页数获得当前页面page页码集合
* @author sunbai email:85846536@163.com
* @date 2012-1-14 && 下午04:16:51
* @param allpage 总页数
* @param currpage 当前页
* @return
*/
public List<String> getPageNumbersList(int allpage, int currpage) {
// pageye 存放页面,页码集合
List<String> pageye = new ArrayList<String>();
// 需要展示的标签页数小于展示页数常量
if (allpage <= CUTPAGE_MAX_PAGE)
for (int i = 1; i <= allpage; i++)
pageye.add(String.valueOf(i));
// 需要展示的标签页数大于展示页数常量
if (allpage > CUTPAGE_MAX_PAGE) {
// 当前页小于展示也数常量
if (currpage <= CUTPAGE_LOOP_PAGE)
for (int i = 1; i <= CUTPAGE_MAX_PAGE; i++)
pageye.add(String.valueOf(i));
// 当前页大于展示也数常量
if (currpage > CUTPAGE_LOOP_PAGE)
for (int i = currpage - CUTPAGE_LOOP_PAGE; i <= (currpage
+ CUTPAGE_LOOP_PAGE - 1 > allpage ? allpage : currpage
+ CUTPAGE_LOOP_PAGE - 1); i++)
pageye.add(String.valueOf(i));
}
return pageye;
}
}
分享到:
相关推荐
### 数据库分页查询语句 #### 概述 在处理大量数据时,为了提高用户体验并减轻服务器压力,我们通常采用分页的方式展示数据。不同的数据库管理系统(DBMS)提供了各自的方法来实现分页功能。本文将详细介绍Oracle...
MyBatis允许开发者创建自定义插件,这些插件可以在执行特定的SQL操作之前或之后进行拦截,例如:插入、更新、删除和查询等。通过实现Interceptor接口并重写intercept方法,我们可以在其中添加分页逻辑。 在"mybatis...
分页拦截器就是在执行SQL之前或之后,对SQL语句进行修改,添加必要的分页条件,从而实现分页查询。 下面我们将详细探讨MyBatis分页拦截器的实现原理: 1. **拦截器接口**:在MyBatis中,所有的拦截器都需要实现`...
分页插件主要通过动态代理的方式,对MyBatis的Executor执行器进行拦截,然后在执行SQL之前自动加上分页语句,执行之后再去除分页参数,从而实现对原始SQL的无感知分页。在数据库层面,插件会根据不同的数据库方言...
`AsQueryable()`方法将数据库集合转换为可查询对象,之后我们可以像处理任何其他LINQ查询一样使用`Skip()`和`Take()`。最后,`ToList()`方法执行查询并返回结果列表。 在实际应用中,我们还需要考虑总页数的计算。...
1. **数据库分页** - **SQL分页**: 在SQL查询中,可以使用`LIMIT`和`OFFSET`(在MySQL中)或`FETCH NEXT`和`OFFSET`(在SQL Server中)来实现分页。例如,获取第2页,每页5条数据的SQL可能如下: ```sql SELECT *...
在MyBatis框架中,拦截器扮演着动态代理的角色,允许我们在执行SQL之前或之后进行额外的操作,比如统计、日志记录或者在本例中的分页处理。下面我们将详细探讨MyBatis拦截器的工作原理以及如何实现分页功能。 首先...
通过在查询语句中添加`Skip()`和`Take()`方法,可以跳过前n条数据(n为当前页之前页数乘以每页记录数),然后获取m条数据(m为每页记录数),实现高效分页。 例如,假设我们有一个名为`Students`的表,我们可以这样...
总结来说,Oracle数据库中的分页代码实现主要涉及到SQL查询的编写,以及在Java后端如何处理这些查询。理解分页的基本原理和Oracle提供的函数,结合实际编程环境,可以有效地实现高效、灵活的分页功能。对于初学者而...
这一步可以在获取分页数据之前或之后完成,取决于数据库是否支持高效的统计方法。 4. **封装结果**:将查询到的数据和分页信息放入`Page`对象中,然后返回给前端。 ```java List<T> dataList = new ArrayList(); ...
- 触发器功能:在特定操作(如INSERT或UPDATE)之前或之后自动执行,如自动生成stuID列的值。 - 禁止操作:触发器可以防止对特定字段进行更新操作,例如禁止更新stuID列。 ### 2. 分页操作的实现 #### 2.1 使用...
在Oracle数据库中,实现分页查询是常见的需求之一。通过合理的分页查询可以提高数据检索的效率,优化用户体验。本文将详细介绍一个特定的Oracle分页查询语句:“`select * from (select a.*,rownum rn from (select ...
这个插件能够自动处理SQL语句,添加必要的分页条件,从而避免手动编写繁琐的分页代码。下面我们将详细探讨MyBatis分页插件的工作原理、如何配置以及它与Spring的整合。 首先,MyBatis分页插件的核心是PageHelper,...
在大数据量的数据库应用中,分页查询是必不可少的,因为它能够有效地处理和展示结果,避免一次性加载大量数据导致性能下降。本篇将详细介绍如何在Oracle中使用存储过程实现分页查询。 首先,我们需要了解分页的基本...
在Mybatis框架中,拦截器(Interceptor)是一个强大的工具,它可以让我们在Mybatis执行SQL之前或之后做一些额外的操作,比如日志记录、权限检查、事务管理等。在本主题中,我们将深入探讨如何利用Mybatis的拦截器...
MyBatis 拦截器是 MyBatis 框架中的一个重要组成部分,它允许开发者在执行 SQL 映射语句之前或之后插入自定义的行为。分页是 Web 应用程序中常见的需求,用于限制返回数据的数量,提高用户体验并减轻数据库负载。将...
在代码中使用PageHelper,通常是在查询之前调用`PageHelper.startPage(int pageNum, int pageSize)`方法,之后的MyBatis SQL查询将自动完成分页处理。例如,在Spring MVC中,可以在Controller层的方法中使用...
SpringMVC中的拦截器(Interceptor)扮演着关键角色,它可以在请求被控制器处理之前或之后执行自定义逻辑。例如,拦截器可以用来实现登录验证、记录日志、性能监控等功能。在"spring+springMVC+mybatis拦截器分页"的...
- 前向和后向链接优化:保存之前和之后页面的信息,以便快速导航。 - 分页缓存:对常用或热门页面进行缓存,减少数据库查询。 6. **用户体验**: - 显示页码范围:让用户知道他们正在查看的数据范围,以及是否...
拦截器是MyBatis动态代理机制的一部分,它允许我们在执行SQL语句之前或之后插入一些额外的操作。在分页插件的场景下,我们可以利用拦截器在执行查询前计算页码和每页大小,然后动态修改原始的SQL语句,使其包含分页...