九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
回調(diào) Spring Hibernate DAO 持久層開發(fā),
DAO開發(fā)

注:
(1)以下兩者都需在Spring XML配置文件中,注冊Bean(實(shí)現(xiàn)類)來依賴注入SessionFactory.
(2.1)Spring 中進(jìn)行事務(wù)管理的通常方式是利用AOP(面向切片編程)的方式,為普通java類封裝事務(wù)控制,它是通過動態(tài)代理實(shí)現(xiàn)的,由于接口是
        延遲實(shí)例化的, spring在這段時(shí)間內(nèi)通過攔截器,加載事務(wù)切片。原理就是這樣,具體細(xì)節(jié)請參考jdk中有關(guān)動態(tài)代理的文檔。本文主要講解
        如何在spring中進(jìn)行事務(wù)控制。
(2.2)動態(tài)代理的一個(gè)重要特征是,它是針對接口的,所以我們的DAO要通過動態(tài)代理來讓spring接管事務(wù),就必須在DAO前面抽象出一個(gè)接口.  當(dāng)然
       如果沒有這樣的接口,那么spring會使用CGLIB來解決問題,但這不是spring推薦的方式.

(一)直接使用Hibernate API (不推薦使用)
public class DaoImp implate Dao{
         private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          public void setSessionFactory(SessionFactory sessionFactory){
                    this.sessionFactory=sessionFactory;
          }

           public boolean isValidUser(String username) { 
                try{
                     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list();
                     if (userList.size() > 0) {
                     return true; 
                 } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}
 
優(yōu)點(diǎn):與Spring框架完全分離
缺點(diǎn):(1)無法使用Spring框架封裝所提供的額外功能.如,直接使用Hibernate API 需用try...catch()處理HibernateException異常.
         (2)需在實(shí)現(xiàn)類中加入setSessionFactory(SessionFactory sessionFactory)屬性,接收依賴注入的SessionFactory.

(二)繼承 Spring 的 HibernateDaoSupport 使用 HibernateTemplate (不推薦使用getSession())
public class DaoImp extend HibernateDaoSupport implates Dao{
         //private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          //public void setSessionFactory(SessionFactory sessionFactory){
          //          this.sessionFactory=sessionFactory;
          //}


           public boolean isValidUser(String username) { 
              //  try{
              //     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list(); 

                     List userList = getHibernateTemplate().find(hql,username); 
                     if (userList.size() > 0) {
                     return true; 
               // } catch (HibernateException ex){
              //     throw converHibernaterAccessException(ex);
             //  }  
 
             }
 
           public boolean isValidUser(String username,String password) throw DataAccessException { 
                     Session session = getSession();                 //不推薦使用,用完后需手動關(guān)閉
                     String[] userlist=new String[2];
                     userlist[0]=username;
                     userlist[1]=password;
                 try{
                     List userList = session.find(hql,userlist);       //Hibernate語句; 
                     session.close();
                     if (userList.size() > 0) {
                     return true; 
                  } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}

特點(diǎn):對HibernateTemplate沒有提供的功能,可以直接調(diào)用HibernateDaoSuppor對象的getSession()方法(極其不推薦使用)得到Session對象實(shí)例用try{ Hibernate API }catch (HibernateException ex )操作.

(三)對 HibernateTemplate 沒有提供的功能, 還可以用HibernateCallback 回調(diào)的方法管理數(shù)據(jù)庫. (極其推薦)

 /**
  * 使用 hql 語句進(jìn)行操作
  * @param hql       HSQL 查詢語句
  * @param offset   開始取數(shù)據(jù)的下標(biāo)
  * @param length   讀取數(shù)據(jù)記錄數(shù)
  * @return List       結(jié)果集
  */
 public List getListForPage ( final String hql , final int offset , final int length ) {

     List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
           public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                     Query query = session.createQuery ( hql ) ;
                     query.setFirstResult ( offset ) ;
                     query.setMaxResults ( length ) ;
                     List list = query.list ( ) ;
                     return list ;
           }
    }) ;
    return list ;
 }


//---------------------------------------------------------------------------

final String queryString = "from Fourm";                 //必須定義final類型
   List l= getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                    Query query = session.createQuery ( queryString ) ;
                    query.setFirstResult ( 0 ) ;
                    query.setMaxResults ( 10 ) ;
                    List list = query.list ( ) ;
                    return list ;
          }

//------------------------------------------------------------



為什么不使用getSession(),而使用回調(diào)的詳細(xì)說明:

紫蝶∏飛揚(yáng)↗
聽個(gè)SPRING+HIBERNATE開發(fā)的問題.
SPRING想調(diào)用HIBERNATE的方法有兩種,一種是使用getSession();一種是:HibernateCallback回調(diào).
他們有什么不同?
海綿♂寶寶
前者沒有事務(wù)管控,Spring把Hibernate最原始的Session給你!但是它不被聲明式事務(wù)管理的服務(wù)!
紫蝶∏飛揚(yáng)↗
...聲明式事務(wù)不會對他進(jìn)行事務(wù)管理?
海綿♂寶寶
后者也是把Session返給你,但是通過閉包回調(diào)的形式給你使用,Spring會在給你之前做一下手腳,例如:添加聲明式事務(wù)管理中聲明的事務(wù)屬性!
海綿♂寶寶
因?yàn)槟銓懙姆椒ㄍㄟ^匿名函數(shù)閉包,然后由Spring去負(fù)責(zé)執(zhí)行閉包體內(nèi)的方法!
海綿♂寶寶
Java里的借口回調(diào)基本都是借用匿名內(nèi)部類實(shí)現(xiàn)的閉包!
海綿♂寶寶
你看一下Spring的HibernateDaoSupport的源代碼就知道運(yùn)行過程了!
海綿♂寶寶
直接使用getSession()還不享有Spring提供的模板支持,也就是說你得手動關(guān)閉連接,否則會一直掛在那兒,直到超時(shí)連接池才會回收這個(gè)連接!
海綿♂寶寶
這樣很容器連接池連接數(shù)量溢出!你懂了???
紫蝶∏飛揚(yáng)↗
嗯.
紫蝶∏飛揚(yáng)↗
new HibernateCallback(){
    public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
必須這樣的方式嗎?
海綿♂寶寶
建議補(bǔ)習(xí)一下編程中的閉包、回調(diào)的知識,再看看Spring的那段代碼就可以徹底理解了!
海綿♂寶寶
恩!
紫蝶∏飛揚(yáng)↗
哦.明白了.
海綿♂寶寶
如果你覺得getHibernateTemplate()提供的方法不足以滿足你的要求!你就得這么使用!
紫蝶∏飛揚(yáng)↗
明白.不夠用的情況下用回調(diào).
海綿♂寶寶
閉包JavaScript支持的比較好,因?yàn)樗且院瘮?shù)為單元的,Java過于強(qiáng)調(diào)面向?qū)ο螅灾荒苡媚涿麅?nèi)部類來有限的支持閉包!標(biāo)準(zhǔn)的回調(diào)都是方法回調(diào),也就是閉包到方法中,而不是類中!所以Java中的閉包和其他的語言有一些區(qū)別的,例如訪問外部變量必須是final的!
海綿♂寶寶
據(jù)說JDK1.7會加入對函數(shù)閉包調(diào)用的支持!
紫蝶∏飛揚(yáng)↗
...歷害.
紫蝶∏飛揚(yáng)↗
偶只知道這樣用,不知道為什么這樣用.
海綿♂寶寶
那可不行??!呵呵!我最一開始也不大明白,后來仔細(xì)研究了閉包、回調(diào)的知識就懂了!
其實(shí)這種用法在Swing編程里天天都用?。“岩粋€(gè)匿名的監(jiān)聽器實(shí)現(xiàn)類注冊到事件源,只不過那個(gè)時(shí)候沒有注意到這是閉包和回調(diào)罷了!
紫蝶∏飛揚(yáng)↗
看來有時(shí)間得好好看看了...

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常...
Spring3整合Hibernate3
mybatis和hibernate的對比總結(jié)
整合之道
struts2 hibernate spring配置管理(一)——配置文件 - Strut...
Spring整合Hibernate中對HibernateTemplate的思考
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服