SSH分页查询操作实例

使用的框架是struts2+spring3+hibernate4,需要特别注意两点,其一是保证三层的松耦合,我看到有文章在Service层中向Dao传递HQL语句,其实是不对的;二是,新版hibernate在查询COUNT(*)返回记录数量时,类型改为了Long型,需要做特殊处理。

首先要做一个PageBean对象:

public class PageBean {
	//Result List
	@SuppressWarnings("rawtypes")
	private List list;

	//总行数
	private Long allRow;
	//总页数
	private Integer totalPage;
	//当前页
	private Integer currentPage;
	//每页条目数
	private Integer pageSize;

	//是否为第一页
	private Boolean firstPage;
	//是否为最后一页
	private Boolean lastPage;
	//是否有前一页
	private Boolean hasPreviousPage;
	//是否有后一页
	private Boolean hasNextPage;

	@SuppressWarnings("rawtypes")
	public List getList() {
		return list;
	}
	@SuppressWarnings("rawtypes")
	public void setList(List list) {
		this.list = list;
	}
	public Long getAllRow() {
		return allRow;
	}
	public void setAllRow(Long allRow) {
		this.allRow = allRow;
	}
	public Number getTotalPage() {
		return totalPage;
	}
	public Integer getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(Integer currentPage) {
		this.currentPage = currentPage;
	}
	public Integer getPageSize() {
		return pageSize;
	}
	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}
	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}
	public Boolean getFirstPage() {
		return firstPage;
	}
	public void setFirstPage(Boolean firstPage) {
		this.firstPage = firstPage;
	}
	public Boolean getLastPage() {
		return lastPage;
	}
	public void setLastPage(Boolean lastPage) {
		this.lastPage = lastPage;
	}
	public Boolean getHasPreviousPage() {
		return hasPreviousPage;
	}
	public void setHasPreviousPage(Boolean hasPreviousPage) {
		this.hasPreviousPage = hasPreviousPage;
	}
	public Boolean getHasNextPage() {
		return hasNextPage;
	}
	public void setHasNextPage(Boolean hasNextPage) {
		this.hasNextPage = hasNextPage;
	}

	/**
	 * 初始化结果页面信息
	 */
	public void init(){
        this.firstPage = isFirstPage();
        this.lastPage = isLastPage();
        this.hasPreviousPage = isHasPreviousPage();
        this.totalPage = countTotalPage(pageSize, allRow);
        this.hasNextPage = isHasNextPage();
    }

    private boolean isFirstPage() {
        return currentPage == 1;
    }
    private boolean isLastPage() {
        return currentPage == totalPage;
    }
    private boolean isHasPreviousPage() {
        return currentPage != 1;
    }
    private boolean isHasNextPage() {
        return currentPage != totalPage;
    }

    /**
     * 计算总页数
     * @param pageSize 每页记录数
     * @param allRow 总记录数
     * @return 总页数
     */
    private Integer countTotalPage(Integer pageSize,Long allRow){
    	Integer row = allRow.intValue();
        Integer totalPage = row.intValue() % pageSize == 0 ? row/pageSize : row/pageSize+1;
        return totalPage;
    }

    /**
     * 计算当前页起始记录
     * @param pageSize 每页记录数
     * @param currentPage 当前第几页
     * @return
     */
    public Integer countOffset(Integer pageSize,Integer currentPage){
    	Integer offset = pageSize*(currentPage-1);
        return offset;
    }

}

DAO层添加的两个接口实现如下:

	public List<User> getUsersByPage(Integer offSet, Integer length) {
		String hql = "FROM com.wang.rhys.model.User";
		@SuppressWarnings("unchecked")
		List<User> list = (ArrayList<User>)this.getObjects(hql, offSet, length);
		return list;
	}

	public Long getTotalUserNumber(Integer groupId) {
		String hql = "SELECT COUNT(*) FROM com.wang.rhys.model.User ";
		if(groupId!=0)
			hql+="WHERE group.group_id="+groupId;
		Long totalRows = (Long)this.getObject(hql);
		return totalRows;
	}

Service层的接口实现:

	public PageBean getUsersByPage(Integer currentPage, Integer pageSize) {
		PageBean pageBean = new PageBean();

		//Set Parameters
		Long totalRows = userDao.getTotalUserNumber(0);
		pageBean.setAllRow(totalRows);
		pageBean.setCurrentPage(currentPage);
		pageBean.setPageSize(pageSize);

		//Initialize PageBean
		pageBean.init();

		//Get the splitted userList
		List<User> userList = userDao.getUsersByPage(pageBean.countOffset(pageSize, currentPage),pageSize);
		pageBean.setList(userList);
		return pageBean;
	}

Struts Action实现:

	public String execute() throws Exception {

		//从session获取用户工号,如果不存在或处于非激活状态,返回登录页面
		String user_num = ActionContext.getContext().getSession().get("user_num").toString();
		if(!userService.isActive(user_num))
			return LOGIN;
		setPageBean(userService.getUsersByPage(currentPage, pageSize));
		return SUCCESS;
	}

页面调用:

<table border="1" width="700px">
  			<!-- table head -->
  			<tr>
  				<td style="width:100px">工号</td>
  				<td style="width:100px">姓名</td>
  				<td style="width:150px">组件</td>
  				<td style="width:50px">性别</td>
  				<td style="width:100px">职位</td>
  				<td style="width:200px">备注</td>
  			</tr>

  		<s:iterator value="#request.pageBean.list" status="st">
  			<s:if test="#st.odd==true">
  				<tr style="background-color: #cccccc">
  			</s:if>
  			<s:else>
  				<tr>
  			</s:else>
  					<td><s:property value="user_number"/></td>
  					<td><s:property value="user_chinese_name"/></td>
  					<td><s:property value="group.group_chinese_name"/></td>
  					<td><s:property value="sex"/></td>
  					<td></td>
  					<td>
  						<s:url id="modify_user" value="ShowModifyUserForm.action">
  							<s:param name="user_id" value="user_id">
  							</s:param>
  						</s:url>
  						<s:a href="%{modify_user}">修改</s:a>
  					</td>
  				</tr><p/>
  		</s:iterator>
  		<tr>
  			<td style="width:100px">
  				<s:if test="#request.pageBean.hasPreviousPage">
  					<s:url id="getUsers_first" value="GetUsers.action">
  						<s:param name="currentPage" value="1"></s:param>
  					</s:url>
  					<s:a href="%{getUsers_first}">首页</s:a>
  				</s:if>
  				<s:else>
  					首页
  				</s:else>
  				</td>
  			<td style="width:100px">
  				<s:if test="#request.pageBean.hasPreviousPage">
  					<s:url id="getUsers_previous" value="GetUsers.action">
  						<s:param name="currentPage" value="#request.pageBean.currentPage-1"></s:param>
  					</s:url>
  					<s:a href="%{getUsers_previous}">上页</s:a>
  				</s:if>
  				<s:else>
  					上页
  				</s:else>
  			</td>
  			<td style="width:150px">
  				<s:if test="#request.pageBean.hasNextPage">
  					<s:url id="getUsers_next" value="GetUsers.action">
  						<s:param name="currentPage" value="#request.pageBean.currentPage+1"></s:param>
  					</s:url>
  					<s:a href="%{getUsers_next}">下页</s:a>
  				</s:if>
  				<s:else>
  					下页
  				</s:else>
  			</td>
  			<td style="width:50px">
  				<s:if test="#request.pageBean.hasNextPage">
  					<s:url id="getUsers_last" value="GetUsers.action">
  						<s:param name="currentPage" value="#request.pageBean.totalPage"></s:param>
  					</s:url>
  					<s:a href="%{getUsers_last}">末页</s:a>
  				</s:if>
  				<s:else>
  					末页
  				</s:else>
  			</td>
  			<td style="width:100px">共<s:property value="pageBean.totalPage"/>页</td>
  			<td style="width:200px">共<s:property value="pageBean.allRow"/>条记录</td>
  		</tr>
  	</table>
时间: 2024-10-01 00:23:23

SSH分页查询操作实例的相关文章

OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当然,可以用代码生成器,不过配套的代码生成器暂时没有):又从网上找了一个封装了泛型方法的OracleHelper类,整合到一起,但貌似数据增删改查依然不方便:于是花了两天时间,在原有基础上对增删改查分页查询操作进行了面向对象的封装,并且对批量增删改操作进行事务封装,写事务代码更方便. 原理: 1.利用

让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关于ASP.NET MVC WebAPI 支持OData协议的文章,很受启发. 但是对于OData协议下对数据的分页查询,确实没有找到让我满意的东西,可能是个人就这脾气.不喜欢复杂. 对于在 WebAPI 支持OData协议,好处不多讲了,反正,我个人是非常乐意用它来做服务接口之类的. 这篇笔记的主题

数据库分页查询方法

在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用. 下面就分别给大家介绍.讲解一下三种数据库实现分页查询的方法. 一. MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有

Hibernate支持类中的分页查询的实现

Hibernate支持类的实现 package com.myHibernateDao; import java.sql.SQLException; import java.util.List; import javax.annotation.Resource; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate

详述 DB2 分页查询及 Java 实现

DB2 startNum:起始数 endNum:结尾数 SQL 语句? SELECT * FROM ( SELECT B.*, ROWNUMBER() OVER() AS TN FROM ( SELECT * FROM 表名 ) AS B ) AS A WHERE A.TN BETWEEN startNum AND endNum; 1 2 3 4 5 6 7 8 如上所示,此即为 DB2 的分页查询语句. Mapper <?xml version="1.0" encoding=&

Oracle、MySql、SQLServer数据分页查询

看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: SELECT DISTINCT TOP 500 rr.ID AS id ,rr.strName AS name ,rr.nType AS res_type ,rr.nRegID AS region_id ,rr.strChanName AS channel_name ,rr.nChanNum AS channel ,rr.nSortID AS so

Oracle基本语法&amp;&amp;函数&amp;&amp;子查询&amp;&amp;分页查询&amp;&amp;排序&amp;&amp;集合操作&amp;&amp;高级分组函数

一.  数据库 手工---文件管理---数据库 DB:Database 数据库. DBMS:管理数据库的软件.(oracle) 主流关系数据库: 1.      Oracle 2.      DB2 3.      SQL Server 基本没人使 4.      MySQL  基本没人用,免费 Linux 开源,可以发现漏洞补上 Windows服务器会有补丁,数据易泄漏 eclipse 日食 数据表(Table): 表的行(Row):记录 表的列(Column):字段 二.  关系型数据库 一

SQLserver分页查询实例

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2 第一种方案.最简单.普通的方法: SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TOP 45000 ID

ssh框架中的分页查询

ssh中的分页查询是比较常用的,接下来我用代码来介绍如何实现一个分页查询 首先建立一个Model用来储存查询分页的信息 package com.haiziwang.qrlogin.utils; import java.util.List; public class prospage<T> { private int page; // 当前页数 private int totalCount; // 总记录数 private int totalPage; // 总页数 private int er