在項目開發中,使用了SSH框架組成時,多處都會用到Session。在對Session的使用維護上,有如下幾種看法:
1.getCurrentSession();
獲得當前會話中的session,該session有容器自我維護管理,Spring可以代理事務。
2.this.getSession();
從當前的執行中獲得或建立一個hibernate的session對象,需要自己手動關閉,以釋放串連資源。
3.openSession();
調用函數自行建立一個資料庫的串連,並將其開啟,在使用Spring操作非查詢語句的請況下,Spring的事務對該session對象不起到交易管理的作用,所以該session對象應當由程式員自己關閉,釋放串連資源。
以上三種操作session的方式,我們都離不開這樣的操作主線:
開啟Session,開始一個事務,處理異常,提交一個事務,最後關閉一個Session。
如果我們自己只專註於業務,不想去作這些重複而繁瑣的操作,那這樣的一套操作對我們來講太繁瑣了!
相信任何一個程式員,都不想重複敲著那一遍又一遍雷同的代碼!
在Spring的架構中,HibernateTemplate封裝了Hibernate的代碼,提供了相當多有用的協助工具功能。Spring的HibernateTemplate可以幫我們完成這樣的工作,使用聲明式的配置來實現這樣的功能。既然使用了SSH整合,那就要充分利用好Spring的這個功能吧,當然如果你還擔心spring到底有沒有關閉session的話,不妨看看這個文章:【那個看起來有點2但不2的程式員做的一件事:驗證HibernateTemplate有沒有關閉session:http://songzj.iteye.com/blog/766148】
但是如果我們非得使用session來完成業務而又不想去管事務上的事,那就意味著我們放棄了上面所說的一切好處!
Spring,她依然可以幫我們完成這種有點BT的需求。
HibernateTemplate提供HibernateCallback,就是為了滿足這種使用了HibernateTemplate的情況下,仍然需要直接存取Session的需求而來的。它提供了在HibernateTemplate裡面直接存取Session的能力,程式員不必人為的管理session對象(這個就是使用HibernateCallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。
首先,應該確保我們的DAO已經繼承了HibernateDaoSupport。
於是,如果我們可以參考如下形式書寫:
@SuppressWarnings("unchecked")public Page queryData(final String countSql, final String resultSql,final int startIndex, final int pageSize, final long total) {Page result = (Page) getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException {long totalCount = 0;if (total < 0) {List countlist = session.createSQLQuery(countSql).list();totalCount += Long.parseLong(countlist.get(0).toString());} else {totalCount = total;}if (totalCount < 1) {return new Page();}// 實際查詢返回分頁對象Query query = session.createSQLQuery(resultSql).addScalar("carLsh", Hibernate.INTEGER).addScalar("carPic", Hibernate.STRING).addScalar("carInfo", Hibernate.STRING).addScalar("carColor", Hibernate.STRING).addScalar("carType", Hibernate.STRING).setResultTransformer(Transformers.aliasToBean(CarInfo.class));if (pageSize > 0) {if (startIndex < 0) {query.setFirstResult(0);} else if (startIndex >= totalCount) {return new Page();} else {query.setFirstResult(startIndex);}if (startIndex + pageSize > totalCount) {query.setMaxResults((int) totalCount- startIndex);} else {query.setMaxResults(pageSize);}}return new Page(startIndex, totalCount, pageSize, query.list());}});return result;}