任何一個封裝講究的是,使用,多狀態。
Action:
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){//兩個參數,一個是當前頁數,一個是總頁數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; }}
?
然后講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); }
?
?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); }}
下面看一下 DAO層的封裝吧。
?經典的終于來了。前面注意分頁的那些類:
首先 因為有一些是特殊的方法,所以我們也要定義
AuthApplyD接口:很簡單吧。
????AuthApply 是bean類??
????GenericDAO?這繼承的父類就是我們的封裝。
public interface AuthApplyD extends GenericDAO<AuthApply>{ } |
AuthApplyD實現類:
super(AuthApply.class);這個方法很重要,調用的是GenericHibernateDAO的方法,而將Bean類傳到DAO層。
GenericDAO接口封裝:
![]() ![]() public class AuthApplyDI extends GenericHibernateDAO<AuthApply> implements AuthApplyD{public AuthApplyDI() { super(AuthApply.class);//這super,就是調用父類的構造方法 }} |
這才是我想說的經典
/**
* 通過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); }
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); } }
希望首頁能再次通過,我修改下。
總結:帶分頁功能的SSH整合,DAO層經典封裝
考慮前臺,一條線的傳到后臺,然后分工必須明確。
DAO層的封裝,可見java底層的魅力。
共同開發,共同努力。