zl程序教程

您现在的位置是:首页 >  后端

当前栏目

SSH, 整合分页功能,连带DAO经典封装

ssh经典封装 功能 整合 分页 DAO
2023-09-14 08:57:54 时间
Action:     任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数。并根据这个参数进行查值。 然后在继承ServiceManage,ServiceManage类是用来 存放共用的东西:response,重要的是Service的get set 具体讲一下PageManage,    totalPages;//总页数    totalRecord;//总记录数    showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数    showPageNum;//当前页显示的记录数量
public class PageManage extends ServiceManage{

 * 分页的一些参数

 * @author sl

private static final long serialVersionUID = 1L;

// 以下三个参数是分页需返回

// protected int currentPage = 1; // 当前页数

protected int totalPages; // 总页数

protected int totalRecord; // 总记录数

protected int pageNum = 1; // 当前页数

//默认每页的数量

protected int numPerPage = 20; 

protected PageUtil pageUtil(int totalRecord_) {

return new PageUtil(pageNum, totalRecord_, numPerPage);

 //一些getset方法

public int getTotalPages() {

return totalPages;

public void setTotalPages(int totalPages) {

this.totalPages = totalPages;

public int getTotalRecord() {

return totalRecord;

public void setTotalRecord(int totalRecord) {

this.totalRecord = totalRecord;

public int getPageNum() {

return pageNum;

public void setPageNum(int pageNum) {

this.pageNum = pageNum;

public int getNumPerPage() {

return numPerPage;

public void setNumPerPage(int numPerPage) {

this.numPerPage = numPerPage;


其中涉及到的 PageUtil,这就分页的参数设置,和进行分页功能的一些逻辑判断,逻辑变动。

PageUtil:

PageUtil(Integer currentPage,Integer totalRecord,int showRecordNum)这个定义了一个page 以后调用就这个。 //分页用到的基本两个参数:1.总的记录条数  2.每页的记录条数 DEFAULT_CURRENT=1; //默认显示第一页 DEFAULT_PAGE_NUM=20;//默认显示20条记录 pageFirRecord=0;//当前页第一条记录 currentPage=1;//当前页数 totalPages;//总页数 totalRecord;//总记录数 showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数 showPageNum;//当前页显示的记录数量 prePage=1; nexePage=1;
public class PageUtil{

//分页用到的基本两个参数:1.总的记录条数 2.每页的记录条数

//public static final Integer DEFAULT_CURRENT=1; //默认显示第一页

public static final Integer DEFAULT_PAGE_NUM=20;//默认显示20条记录

protected Integer pageFirRecord=0;//当前页第一条记录

protected Integer currentPage=1;//当前页数

protected Integer totalPages;//总页数

protected Integer totalRecord;//总记录数

protected Integer showRecordNum=DEFAULT_PAGE_NUM;//每页显示记录数

protected Integer showPageNum;//当前页显示的记录数量

protected Integer prePage=1;

protected Integer nexePage=1;

public PageUtil(){

public PageUtil(Integer currentPage,Integer totalRecord){//两个参数,一个是当前页数,一个是总页数


public PageUtil(Integer currentPage,Integer totalRecord,int showRecordNum){ //showRecordNum:为当前页的总记录条数 this.setTotalRecord(totalRecord); this.setShowRecordNum(showRecordNum); this.setTotalPages(); this.setCurrentPage(currentPage); this.setShowPageNum(); this.setPageFirRecord(); this.setPrePage();//计算前一页页码 this.setNexePage();//计算下一页页码 public Integer getPrePage() { return prePage; public void setPrePage() {//设置前一页的页码 this.prePage = currentPage-1;//为当前页数减1
if(currentPage==totalPages){ //如果当前页码为总页码,即最后一页 this.nexePage = 0;//返回0 }else{ this.nexePage = currentPage+1;//当前页加1 if(totalPages==0){//如果总页数为0,怎么返回0; this.nexePage = 0;
public void setShowPageNum() {//当前页显示的记录数量 if(currentPage*showRecordNum-totalRecord 0){//当前页数*每页显示的条数—总的记录条数 0 表示现在已经是最后一页了 this.showPageNum = totalRecord-(currentPage-1)*showRecordNum; }else{ this.showPageNum=showRecordNum;
public void setShowRecordNum(Integer showRecordNum) { this.showRecordNum = showRecordNum;
if(currentPage totalPages totalPages!=0){ this.currentPage=totalPages;//当前页大于总页数时为总页数,并且保证不存在记录时不出错,即totalPages!=0 }else if(totalPages==0){ this.currentPage=1; }else{ this.currentPage = currentPage;
public void setPageFirRecord() {//第一条记录所在集合的标号,比实际排数少一 this.pageFirRecord = (getCurrentPage()-1)*showRecordNum;//第一条记录为当前页的前一页*每页显示的记录数 public Integer getPageFirRecord() {//返回第一条记录 return pageFirRecord;
    只要继承一个父类CURDS;CURDS类里面的方法和封装好的DAO层hibernate带分页的分装方法一致 随便一个service层接口: 一般的方法自然都在CURDS有了。以下是写一个特殊的方法   List AuthApply getApplie(): 所以一般来说,CURDS里面的方法够用了。
    共用的CURDS接口里面的方法里面如果要用就实现,不用不需要    DAOManage:只是DAO接口的注入
public class AuthApplySI extends DAOManage implements AuthApplyS{

public AuthApply findById(Integer id) {

return authApplyD.findById(id);

public List AuthApply getList(PageUtil pageUtil, Object... args) {

return authApplyD.findByPage(getHQL((String)args[0]), pageUtil.getPageFirRecord(), pageUtil.getShowRecordNum());

public int getNums(Object... args) {

return authApplyD.findByPage(getHQL((String)args[0]), 0, 0).size();

private String getHQL(String type){

StringBuffer hql = new StringBuffer("from AuthApply as auth where auth.authType = "+type+"");

hql.append(" and auth.status = "+AuthCon.SUBMIT_AUTH+"");

return hql.toString();

public AuthApply makePersitent(AuthApply entity) {

return authApplyD.makePersitent(entity);

public List AuthApply getApplie(String type, String status, Integer memberId) {

StringBuffer hql = new StringBuffer("from AuthApply as auth where auth.authType = "+type+" and auth.status = "+status+"");

if(memberId != null){

hql.append(" and auth.member.memberId = "+memberId);

return authApplyD.findByPage(hql.toString(), 0, 0).size() == 0? null: authApplyD.findByPage(hql.toString(), 0, 0);

}

 


AuthApplyD实现类: super(AuthApply.class);这个方法很重要,调用的是GenericHibernateDAO的方法,而将Bean类传到DAO层。
public class AuthApplyDI extends GenericHibernateDAO AuthApply implements

AuthApplyD{

public AuthApplyDI() {

super(AuthApply.class);//这super,就是调用父类的构造方法

}
GenericDAO接口封装: 这才是我想说的经典
 * @param hql 需要查询的hql语句  * @param value 如果hql有一个参数需要传入,value就是传入的参数  * @param offset 第一条记录索引  * @param pageSize 每页需要显示的记录数  * @return 当前页的所有记录 List T findByPage(final String hql , final Object value ,  final int offset, final int pageSize);  * 使用hql 语句进行分页查询操作  * @param hql 需要查询的hql语句  * @param values 如果hql有一个参数需要传入,value就是传入的参数  * @param offset 第一条记录索引  * @param pageSize 每页需要显示的记录数  * @return 当前页的所有记录 List T findByPage(final String hql, final Object[] values,  final int offset, final int pageSize);  * 使用sql 语句进行分页查询操作  * @param sql  * @param offset  * @param pageSize  * @return List T findByPageSQL(final String sql,   final int offset, final int pageSize);  * 根据语句查找总数  * @param hql hql语句  * @return 对应的数目 Integer getCount(String hql); void updateObj(final String hql,final Object[] values);  * 更新  * */ void updateEntity(T entity);  * 返回list集合  * */ @SuppressWarnings("unchecked") public List getListDataByHQL(String hql);  * hql查询单个字段  * */ public List Object findSingleDataByHQL(String hql);  * hql查询多个字段  * */ public List Object[] findSomeDataByHQL(String hql);  
/**

 * @param T 

public interface GenericDAO T {

 * 通过ID获得实体对象

 * @param id实体对象的标识符

 * @return 该主键值对应的实体对象

T findById(Integer id);

T findById(Long id);

 * 将实体对象持久化

 * @param entity 需要进行持久化操作的实体对象

 * @return 持久化的实体对象

T makePersitent(T entity); 

 * 将实体变为瞬态

 * @param entity需要转变为瞬态的实体对象

void makeTransient(T entity);

 * 将一系列的实体变为瞬态,使用本地sql

 * @param hql

void makeTransientByIds(String sql);

 * 使用hql语句进行分页操作

 * @param hql

 * @param offset第一条记录索引

 * @param pageSize每页需要显示的记录数

 * @return查询的记录

List T findByPage(final String hql,final int offset,final int pageSize);


* @param hql 需要查询的hql语句 * @param value 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql , final Object value , final int offset, final int pageSize); * 使用hql 语句进行分页查询操作 * @param hql 需要查询的hql语句 * @param values 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 List T findByPage(final String hql, final Object[] values, final int offset, final int pageSize);

public class GenericHibernateDAO T extends HibernateDaoSupport 

implements GenericDAO T {

private Class T persistentClass;

public GenericHibernateDAO(Class T persistentClass){

this.persistent "unchecked")

public List T findByPage(final String hql, 

 final int offset, final int pageSize){

if(hql == null){

return new ArrayList T 

List T list= getHibernateTemplate().executeFind(new HibernateCallback(){

public Object doInHibernate(final Session session)

throws HibernateException, SQLException{

Query query=session.createQuery(hql);

if(!(offset==0 pageSize==0)){

query.setFirstResult(offset).setMaxResults(pageSize);

List T result = query.list();

return result;

return list;

@SuppressWarnings("unchecked")

public List findByPageSQL(final String sql, 

 final int offset, final int pageSize){

List list= getHibernateTemplate().executeFind(new HibernateCallback(){

public Object doInHibernate(final Session session)

throws HibernateException, SQLException{

Query query=session.createSQLQuery(sql);

if(!(offset==0 pageSize==0)){

query.setFirstResult(offset).setMaxResults(pageSize);

List result = query.list();

return result;

return list;


@SuppressWarnings("unchecked") public List T findByPage(final String hql, final Object value, final int offset, final int pageSize) { List T list = getHibernateTemplate().executeFind(new HibernateCallback() public Object doInHibernate(Session session) throws HibernateException, SQLException Query query=session.createQuery(hql).setParameter(0, value); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List T result = query.list(); return result; return list; @SuppressWarnings("unchecked") public List T findByPage(final String hql, final Object[] values, final int offset, final int pageSize) { List T list = getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(hql); for (int i = 0 ; i values.length ; i++){ query.setParameter( i, values[i]); if(!(offset==0 pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); List T result = query.list(); return result; return list;
@SuppressWarnings("unchecked") public void updateObj(final String hql, final Object[] values) { getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(hql); for(int i=0;i values.length;i++){ query.setParameter( i, values[i]); query.executeUpdate(); return null; public Integer getCount(String hql) { Integer count; //iterate方法与list方法的区别是list取出全部,iterator取出主键,迭代的时候才取出数据 count = ((Long)getHibernateTemplate().iterate(hql).next()).intValue(); System.out.println("大小"+ count); return count; public T makePersitent(T entity) { getHibernateTemplate().saveOrUpdate(entity); return entity; public void makeTransient(T entity) { getHibernateTemplate().delete(entity); @SuppressWarnings("unchecked") public void makeTransientByIds(final String sql) { getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException{ Query query=session.createQuery(sql); query.executeUpdate(); return null; public T findById(Long id) { return (T) getHibernateTemplate().get(getPersistentClass(), id); public void updateEntity(T entity) { this.getHibernateTemplate().update(entity); @SuppressWarnings("unchecked") public List getListDataByHQL(String hql) { return getHibernateTemplate().find(hql); * hql查询单个字段 * */ @SuppressWarnings("unchecked") public List Object findSingleDataByHQL(String hql) { return getHibernateTemplate().find(hql); * hql查询多个字段 * */ @SuppressWarnings("unchecked") public List Object[] findSomeDataByHQL(String hql) { return getHibernateTemplate().find(hql); }


 希望首页能再次通过,我修改下。 总结:带分页功能的SSH整合,DAO层经典封装 考虑前台,一条线的传到后台,然后分工必须明确。 DAO层的封装,可见java底层的魅力。 共同开发,共同努力。
ssh整合问题总结--使用HibernateTemplate实现数据分页展示 在进行大量的数据展示时,必须要使用分页查询,第一次使用在SSH框架整合中使用分页查询,遇到了一些问题,下面以我练习的项目为例详细介绍,如何在Spring+hibernate(+action)的环境下完成数据的分页查询.
二哥聊RPA 公号「二哥聊RPA」。关注我,一起洞察 RPA ◎ RPA创业者 ◎ 现明堂红木商业顾问,为十月结晶、可啦啦、鑫蜂维等多家企业提供 RPA 咨询服务 ◎ 希望帮助大家在 RPA 上做一些力所能及的事情