带分页功能的SSH整合,DAO层经典封装
生活随笔
收集整理的這篇文章主要介紹了
带分页功能的SSH整合,DAO层经典封装
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
任何一個封裝講究的是,使用,多狀態。
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
然后講Service層: 只要繼承一個父類CURDS;CURDS類里面的方法和封裝好的DAO層hibernate帶分頁的分裝方法一致 隨便一個service層接口: 一般的方法自然都在CURDS有了。以下是寫一個特殊的方法 List<AuthApply> getApplie(): 所以一般來說,CURDS里面的方法夠用了。
AuthApplyD實現類: super(AuthApply.class);這個方法很重要,調用的是GenericHibernateDAO的方法,而將Bean類傳到DAO層。
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
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>{ } |
| public class AuthApplyDI extends GenericHibernateDAO<AuthApply> implements AuthApplyD{public AuthApplyDI() { super(AuthApply.class);//這super,就是調用父類的構造方法 }} View Code |
希望首頁能再次通過,我修改下。
總結:帶分頁功能的SSH整合,DAO層經典封裝 考慮前臺,一條線的傳到后臺,然后分工必須明確。 DAO層的封裝,可見java底層的魅力。 共同開發,共同努力。轉載于:https://www.cnblogs.com/Alandre/p/3366557.html
總結
以上是生活随笔為你收集整理的带分页功能的SSH整合,DAO层经典封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET通用基本权限系统
- 下一篇: 宾狗便携投影仪价格怎么样?