欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Struts2.1.6+Spring2.5.6+Hibernate3.3.1全注解實(shí)例詳解(三)
在前兩章我為大家詳細分析了JAR包的選擇和必須的配置文件,那么這一章,我就對例子的層次結構進(jìn)行說(shuō)明,并實(shí)現除WEB層的功能代碼。
    第三部分:建立框架代碼
    工程結構

    

    大家可以看到,本例一共分為:dao、entity、service、web四層。另外在這些層次下,還以業(yè)務(wù)功能再進(jìn)行分包,這樣做是為了方便在以后的功能擴展中,能更好的管理和維護代碼。如果將所有類(lèi)都直接集中在這4個(gè)包下面,隨著(zhù)類(lèi)的增加,會(huì )越來(lái)越難以維護,而且查找起來(lái)也很費勁。
    HibernateDao
    在本例中,我是通過(guò)繼承Spring提供的HibernateDaoSupport來(lái)實(shí)現持久層的基類(lèi)。同時(shí)引入泛型參數,封裝了一些基本操作方法。

    

    這是HibernateDao的部分代碼,引入的這個(gè)泛型參數,其實(shí)就是實(shí)體類(lèi)(User、Role)。通過(guò)傳遞這個(gè)實(shí)體類(lèi),在構造方法中利用反射特性將它從JVM中取出來(lái)。
    

    這里的getClass()方法是獲得繼承HibernateDao的類(lèi)(UserDao、RoleDao
    getGenericSuperclass()方法就是通過(guò)這些繼承了HibernateDao的類(lèi),來(lái)得到父類(lèi)(父類(lèi)就是HibernateDao)的泛型。注意這個(gè)方法的返回值為Type,這是一個(gè)類(lèi)型接口。請參考API。
    因為在繼承HibernateDao 的時(shí)候,會(huì )給它加一個(gè)泛型參數。比如,User、Role實(shí)體類(lèi)。因此超類(lèi)是參數化類(lèi)型,所以返回的 Type 對象包含所使用的實(shí)際類(lèi)型參數。這里返回的Type對象是ParameterizedType接口的實(shí)現類(lèi)ParameterizedTypeImpl,所以要將返回類(lèi)型轉型為ParameterizedType。
    getActualTypeArguments()方法是ParameterizedType接口中的,它的作用就是獲得實(shí)際類(lèi)型參數 Type 對象的數組,因為我們這里只定義了一個(gè)泛型參數,數組里面也只有一個(gè)值,所以需要在數組下標處填0。然后最后一步轉型千萬(wàn)別忘記了,因為這個(gè)方法返回的可是一個(gè)Type數組喔。
    如果對于這部分的說(shuō)明還有點(diǎn)不理解的話(huà),請到時(shí)候有了代碼,設個(gè)斷點(diǎn)跟蹤一下,就會(huì )全部清楚了。關(guān)于java反射,它已經(jīng)超出本文的范圍。大象只對本例中用到的部分進(jìn)行講解。
    使用這種寫(xiě)法,是方便我們進(jìn)行類(lèi)型轉換與類(lèi)型檢查。另外還可以簡(jiǎn)化某些方法的寫(xiě)法。比如:createCriteria(Criterion... criterions)這個(gè)方法。參數是Criterion類(lèi)型的可變參數,它是用來(lái)設置查詢(xún)條件。如果要進(jìn)行對象化查詢(xún),那么最簡(jiǎn)單的寫(xiě)法就可以直接寫(xiě)成createCriteria()。另外還有重載的方法,可以根據傳入class類(lèi)型來(lái)創(chuàng )建自定義查詢(xún)。
    dao
    持久層的Dao類(lèi)是根據實(shí)體類(lèi)定義,一般是一個(gè)實(shí)體類(lèi)就會(huì )有一個(gè)對應的Dao類(lèi)。當然這要跟業(yè)務(wù)需求來(lái)設計,不是絕對的。另外你也可以為了簡(jiǎn)便而去掉dao層,將持久化操作與業(yè)務(wù)邏輯全部寫(xiě)在service層。

    

    這些定義的方法是供service層調用,在業(yè)務(wù)層,將不會(huì )看到一行與持久層有關(guān)的代碼,降低藕合性是這樣做的目的。@Repository注解的作用就是標注這個(gè)UserDao是一個(gè)持久層組件。還記得前一章講到的掃描器嗎?component-scan 它就是用來(lái)將標有@Repository,@Service這樣的注解類(lèi)掃描到Spring的容器里,并且同時(shí)對標有@Autowired注解的Bean啟用了自動(dòng)注入功能。這就是Spring2.5開(kāi)始提供的新特性。我們使用注解的方法,就可以告別那繁瑣的配置文件定義。
    entity
    關(guān)于實(shí)體的定義就是使用JPA注解,關(guān)于這部分,我以前寫(xiě)過(guò)一篇文章專(zhuān)門(mén)講這個(gè),如果有不清楚的朋友可以先參考一下。學(xué)習JPA——Hibernate Annotation使用實(shí)例
    本例中,我有兩點(diǎn)要講下。
    第一、管理主鍵的表generator_table去掉原來(lái)單獨定義的那個(gè)ID主鍵,把g_key設為主鍵,整個(gè)表將只有兩個(gè)字段,g_keyg_value。
    第二、在User實(shí)體中,我將角色IDrole_id)與角色實(shí)體(Role)做了一個(gè)多對一關(guān)聯(lián)。這一點(diǎn)是原來(lái)文章中沒(méi)有講過(guò)的。

    

    請一定注意role_iduser表的字段。我在本例中設定的是一個(gè)角色可以對應多個(gè)人員,所以這個(gè)role_id存的就是roleid的值。fetch = FetchType.LAZY指定采用延遲檢索,如果當你取得了User對象,但又不想取Role中的信息,這時(shí),User對象中的role屬性是代理狀態(tài)。Role對象中的值都是空的。只有當你使用role.idrole.name進(jìn)行取值的時(shí)候,hibernate才會(huì )去數據庫中查找對應的記錄,因此在一定程度上降低了資源消耗。不過(guò)這里有點(diǎn)要注意,采用延遲檢索的時(shí)候,需要加上前一篇講到的OpenSessionInViewFilter過(guò)濾器。否則會(huì )遇到session關(guān)閉的異常。
    service
    

    @Service表示這是業(yè)務(wù)層組件。在業(yè)務(wù)層需要對UserDao加上@Autowired注解,大象在這里將業(yè)務(wù)層的方法名與持久層的方法名定義為一樣的,是我的一種習慣,大家可以按自己的想法來(lái)做。
    測試
    既然有了這么多代碼,那就來(lái)測試一下吧,看看有沒(méi)有問(wèn)題。
    

    好吧,為了照顧那些堅定的JUnit擁護者,再寫(xiě)一個(gè)JUnit測試。本例使用junit-4.4.jar
    

    

    @BeforeClass注解的方法表示在類(lèi)實(shí)例化之前,也就是在類(lèi)的構造方法執行之前就會(huì )執行。而且使用這個(gè)注解的方法必須是static void
    @Test標明這是測試方法,方法名不用像以前那樣必須按照規則進(jìn)行命名,可以自由定義。
    上圖顯示大象使用JUnit方式測試也通過(guò)了(如果不會(huì )通過(guò)我寫(xiě)它干嘛?嘿嘿)。
    假如我將張三改成張四,再來(lái)看看測試結果。

    

    這個(gè)截圖可以很明顯的說(shuō)明所有東西。
    這一篇是給大家講怎么用代碼來(lái)實(shí)現除web層之外的全注解步驟。當然,我主要是講思路,其實(shí)思路比代碼重要得多。這一個(gè)系列的最后,我會(huì )放上所有源碼供大家下載?,F在這樣慢慢分析,是想給大家講道理。我們應該努力提升自己的境界與層次,而不要只把眼光放在代碼上面。下一章將會(huì )著(zhù)重介紹web層,以及struts2的注解插件struts2-convention。那么,我們下次繼續。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring MVC 3.0.5 Spring 3.0.5 MyBatis3.0.4全注解實(shí)例詳解
集成測試 spring3
使用Spring框架的好處(轉帖)
代碼分享:spring+struts2+hibernate+json+dtree+mysq...
基于SSH開(kāi)發(fā)架構的重新分層
SSH框架整合
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久