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

it2022-05-09  36

任何一个封装讲究的是,使用,多状态。 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; } } View Code

 

其中涉及到的 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){//两个参数,一个是当前页数,一个是总页数 this.setTotalRecord(totalRecord);//调用set()方法来将参数赋值 this.setTotalPages(); this.setCurrentPage(currentPage); this.setShowPageNum(); this.setPageFirRecord(); this.setPrePage(); this.setNexePage(); } /** * 重载 * @param currentPage * @param totalRecord * @param showRecordNum */ 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 } public Integer getNexePage() { return nexePage; } public void setNexePage() { if(currentPage==totalPages){ //如果当前页码为总页码,即最后一页 this.nexePage = 0;//返回0 }else{ this.nexePage = currentPage+1;//当前页加1 } if(totalPages==0){//如果总页数为0,怎么返回0; this.nexePage = 0; } } public Integer getShowPageNum() {//返回当前页显示的记录数量 return showPageNum; } public void setShowPageNum() {//当前页显示的记录数量 if(currentPage*showRecordNum-totalRecord>0){//当前页数*每页显示的条数—总的记录条数>0 表示现在已经是最后一页了 this.showPageNum = totalRecord-(currentPage-1)*showRecordNum; }else{ this.showPageNum=showRecordNum; } } public Integer getShowRecordNum() {//返回每页的记录条数 return showRecordNum; } public void setShowRecordNum(Integer showRecordNum) { this.showRecordNum = showRecordNum; } public Integer getTotalPages() {//返回总的页数 return totalPages; } public void setTotalPages() {//计算总页数 if(totalRecord%showRecordNum==0){ this.totalPages = totalRecord/showRecordNum; }else{ this.totalPages = totalRecord/showRecordNum+1; } } public Integer getTotalRecord() {//返回总的记录条数 return totalRecord; } public void setTotalRecord(Integer totalRecord) { this.totalRecord = totalRecord; } public Integer getCurrentPage() {//返回当前的页数 return currentPage; } public void setCurrentPage(Integer currentPage) { if(currentPage==0||currentPage<0){ currentPage=1; } 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; } } View Code

 

 

然后讲Service层:      只要继承一个父类CURDS;CURDS类里面的方法和封装好的DAO层hibernate带分页的分装方法一致 随便一个 service层接口: 一般的方法自然都在 CURDS有了。以下是写一个特殊的方法    List<AuthApply> getApplie(): 所以一般来说,CURDS里面的方法够用了。 public interface AuthApplyS extends CURDS<AuthApply>{         /**  * 根据认证的类型与状态获取相应的认证申请  * */ public List<AuthApply> getApplie(String type, String status, Integer memberId); }

CURDS:    里面的方法是Service共用的方法

/**  * 根据条件集合大小,这里使用java 1.5引入的新特性:可变参数  * */ public int  getNums(Object ...args); /**  * 根据条件集合  * */ public List<T>  getList(PageUtil pageUtil, Object ...args); /**  * 保存对象  * */ public T  makePersitent(T entity);  /**  * 根本编号获得对象  * */     public T  findById(Integer id);   public interface CURDS<T> { /** * 根据条件集合大小,这里使用java 1.5引入的新特性:可变参数 * */ public int getNums(Object ...args); /** * 根据条件集合 * */ public List<T> getList(PageUtil pageUtil, Object ...args); /** * 保存对象 * */ public T makePersitent(T entity); /** * 根本编号获得对象 * */ public T findById(Integer id); } View Code

 service层实现:

    共用的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); } } View Code

 

下面看一下 DAO层的封装吧。

 经典的终于来了。前面注意分页的那些类: 首先 因为有一些是特殊的方法,所以我们也要定义 AuthApplyD接口:很简单吧。     AuthApply 是bean类       GenericDAO 这继承的父类就是我们的封装。 public interface AuthApplyD extends GenericDAO<AuthApply>{   }   AuthApplyD实现类:    super(AuthApply.class);这个方法很重要,调用的是GenericHibernateDAO的方法,而将Bean类传到DAO层。 public class AuthApplyDI extends GenericHibernateDAO<AuthApply> implements AuthApplyD{ public AuthApplyDI() { super(AuthApply.class);//这super,就是调用父类的构造方法 } } View Code GenericDAO接口封装: 这才是我想说的经典    /**  * 通过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);     /**  * 使用hql 语句进行分页查询操作  *   * @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); /** * 使用hql 语句进行分页查询操作 * * @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); } View Code

 

  GenericHibernateDAO实现类: public class GenericHibernateDAO<T> extends HibernateDaoSupport implements GenericDAO<T>{ private Class<T> persistentClass; public GenericHibernateDAO(Class<T> persistentClass){ this.persistentClass=persistentClass; } public Class<T> getPersistentClass(){ return persistentClass; } public T findById(Integer id) { return (T)getHibernateTemplate().get(getPersistentClass(), id); } @SuppressWarnings("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); } } View Code

 

希望首页能再次通过,我修改下。

总结:带分页功能的SSH整合,DAO层经典封装   考虑前台,一条线的传到后台,然后分工必须明确。   DAO层的封装,可见java底层的魅力。 共同开发,共同努力。

本文来自 泥沙砖瓦浆木匠 之笔。

秋日和煦不眼刺,燥气干爽流吾血。满屋墨气留纸上,暗里偷懒靠椅凳。忙时课上立马跑,闲是不知哪里去。纸上总归字太少,心中满是字母书。                                            

转载于:https://www.cnblogs.com/Alandre/p/3366639.html

相关资源:数据结构—成绩单生成器

最新回复(0)