欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Hibernate的一些學習心得總結(jié)

 更新時間:2013年07月22日 11:03:28   作者:  
Hibernate是一個優(yōu)秀的Java 持久化層解決方案,是當今主流的對象—關(guān)系映射(ORM)工具

對于Hibernate剛剛學習了一周時間了,作為一名java初學者,也有點自己的感受想分享出來,如果這篇文章能有幸被大家看到,也僅供大家娛樂。如果有什么不足之處,歡迎大家多多指點,多多批評。僅供參考,不喜勿噴。

前段時間剛學習了用JDBC來進行java和數(shù)據(jù)庫的連接,來實現(xiàn)對數(shù)據(jù)的持久化操作和增刪改查,但是學習完的感受就是JDBC過于繁瑣,因為它無法直接面對對象,開發(fā)效率地,代碼又多,還重復(fù),完全不符合java面向?qū)ο蟮乃季S模式。Hibernate的誕生算是給java程序員很好地解決了這個問題,所以我們可以忘掉JDBC了,來看看Hibernate是如何實現(xiàn)java的持久化操作的。

Hibernate是一個優(yōu)秀的Java 持久化層解決方案,是當今主流的對象—關(guān)系映射(ORM)工具。它的優(yōu)勢有三點,第一:它是一個開發(fā)源代碼的對象關(guān)系映射框架;第二:對JDBC進行了非常輕量級的對象封裝, 簡化了JDBC 繁瑣的編碼;第三:將JavaBean對象和數(shù)據(jù)庫的表建立對應(yīng)關(guān)系。ORM是持久化層的一種解決方案,它是將java中的類對象及相關(guān)屬性和相關(guān)類與數(shù)據(jù)庫中的表及表的屬性和鍵做相關(guān)的一一映射,來實現(xiàn)java對象和數(shù)據(jù)庫的聯(lián)系。下面我就來具體說說自己是如何學習Hibernate的。

一:hibernate入門
對于搭建項目框架編寫hibernate配置文件、實體映射文件我就不多說了。首先我們要先用Configuration接口來新建會話工廠,再從SessionFactory(會話工廠)里獲得會話實例(一般情況下,整個應(yīng)用只有唯一的一個SessionFactory,它應(yīng)該在應(yīng)用初始化時被創(chuàng)建),然后獲取Session實例,用Session可以操作數(shù)據(jù)庫和類中的對象,用Transaction接口的commit()和roolback()方法來提交事務(wù)和回滾事物,用Query來對數(shù)據(jù)庫實現(xiàn)查詢(用SQL或HQL)。另外在對數(shù)據(jù)進行增刪改查操作時,Hibernate中的實體對象有三種對象:瞬時狀態(tài),持久狀態(tài),游離狀態(tài)。狀態(tài)不同,實現(xiàn)方法也不相同。大家可以自己慢慢體會。

二:關(guān)聯(lián)映射
既然Hibernate是關(guān)系映射工具,必然存在many-to-one,one-to-many,雙向一對多,many-to-many關(guān)聯(lián)。要實現(xiàn)這些操作,首先實體之間要有關(guān)聯(lián)關(guān)系,即通過一個對象持有另一個對象的實例。而在數(shù)據(jù)庫的表中,表的主外鍵也能實現(xiàn)表與表的關(guān)聯(lián)關(guān)系。然后我們就要把這些關(guān)聯(lián)關(guān)系在映射文件(hbm.xml)中體現(xiàn)出來。many-to-one是many的一端應(yīng)持有one的一端的對象(引用),one-to-many是one的一端應(yīng)持有many端的對象集合,雙向一對多就是同時配置了單向的一對多和單向的多對一,多對多關(guān)聯(lián)則是將多對多轉(zhuǎn)換成兩個一對多,而且為中間表建立實體類及映射文件,兩個端點和中間端分別建立雙向一對多關(guān)聯(lián)。

三:HQL實用技術(shù)
Hibernate支持兩種主要的查詢方式。HQL(Hibernate Query Languge,Hibernate 查詢語言)查詢是一種面向?qū)ο蟮牟樵冋Z言,其中沒有表和字段的概念,只有類、對象和屬性的概念,HQL 是應(yīng)用較為廣泛的方式。Criteria 查詢又稱為“對象查詢”,它用面向?qū)ο蟮姆绞綄?gòu)造查詢的過程做了封裝。

HQL相比與SQL更符合java面向?qū)ο笏季S,也更加簡單。HQL中沒有表和字段的概念,只有類、對象和屬性的概念。例如你要查詢名字中帶有“Spring”的一本書,SQL:select  * from books where book_name like ‘%Spring%'     HQL :from Book b where b.name like 'Spring%' SQL中用到的是數(shù)據(jù)庫中的表名books和字段book_name,而HQL中用到的是Book類名和Book的name屬性,而Book類和books表又是映射關(guān)系,所以相當于實現(xiàn)了數(shù)據(jù)庫的操作。是不是更加形象呢?

Criteria 查詢用的比較少,從Session中獲取Criteria實例,設(shè)定限制方法(用到Restrictions常用的查詢條件)。相當于把HQL語句轉(zhuǎn)化成一個個方法來實現(xiàn)查詢??醋约合埠冒桑凑沂怯X得HQL更實用一些吧。

四:HQL中的延遲加載和Hibernate高速緩存
HQL和Criteria查詢過程中都會延遲加載,有人覺得這是Hibernate的一個缺陷,我覺得這更像是Hibernate的高明之處。在得到一個Session實例后,用Book為例,你用Session的get()方法得到一本Book,Book是主對象,而Book又有一個Type關(guān)聯(lián)對象,但是得到的Book對象不會加載Type關(guān)聯(lián)對象,只有在你需要用到Type關(guān)聯(lián)對象時才會強制加載Type關(guān)聯(lián)對象,具體來說就是關(guān)聯(lián)對象和關(guān)聯(lián)集合的默認加載計劃是:延遲加載,即加載主對象時它們不會被立即加載,而是直到使用這些對象和集合時才發(fā)送SQL語句、獲取數(shù)據(jù)、初始化對象和集合,而主對象的屬性默認是被立即加載的。當然這種方式也是可以強制改變的,在用Criteria查詢時,你可以在實體類的映射文件中來添加 lazy = “false”  來強制加載。不過不建議這種方式,因為會造成不必要的資源浪費,效率也極低。如果需要,我們可以在編寫代碼時強制加載效果會更好一些。

總之,這種延遲加載策略會簡化SQL語句,提高查詢效率。根據(jù)不同的用戶需要,也可以改變加載策略。

Hibernate緩存有一級緩存和二級緩存,對于一級緩存,其生命周期跟Session的生命周期一樣,所以也可以將Hibernate一級緩存稱為Session緩存。Hibernate一級緩存是一個強制的高速緩存。通過get()方法(load()方法也類似),我們可以得到一級緩存數(shù)據(jù),再次查詢就不需要get()方法了,直接查詢數(shù)據(jù)對象就行。需要注意的是get()方法是通過id來加載的,而list()方法也會將查詢結(jié)果放置在一級緩存中,但是它不會去一級緩存中查找獲取數(shù)據(jù),原因是list()方法不是通過id加載的,還有iterate方法,例如: Iterator<Seeker> iter = session.createQuery(“from **").iterate();  該語句只把ID的值放到迭代器中,當遍歷的時候,會根據(jù)ID的值再去數(shù)據(jù)庫中查。并且該語句會產(chǎn)生N+1次查詢。

至于二級緩存是由SessionFactory負責管理,所以也常將二級緩存稱為SessionFactory緩存。主要適用于不太重要的數(shù)據(jù),所以也沒深入的了解。

一周的Hibernate課程學習就到此為止了,Hibernate的相關(guān)知識還很多,以后要多在實戰(zhàn)項目中運用才能更好地體會。

相關(guān)文章

  • Jedis操作Redis數(shù)據(jù)庫的方法

    Jedis操作Redis數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細介紹了Jedis操作Redis數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    Spring?Boot?整合RocketMq實現(xiàn)消息過濾功能

    這篇文章主要介紹了Spring?Boot?整合RocketMq實現(xiàn)消息過濾,本文講解了RocketMQ實現(xiàn)消息過濾,針對不同的業(yè)務(wù)場景選擇合適的方案即可,需要的朋友可以參考下
    2022-06-06
  • 解析JavaSe的抽象類和接口

    解析JavaSe的抽象類和接口

    這篇文章主要為大家詳細介紹了JavaSe的抽象類和接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • javaweb實現(xiàn)文件上傳示例代碼

    javaweb實現(xiàn)文件上傳示例代碼

    這篇文章主要為大家詳細介紹了javaweb實現(xiàn)文件上傳的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    java.sql.SQLException:?connection?holder?is?null錯誤解決辦法

    這篇文章主要給大家介紹了關(guān)于java.sql.SQLException:?connection?holder?is?null錯誤的解決辦法,這個錯誤通常是由于連接對象為空或未正確初始化導致的,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Maven中resources標簽的用法詳解

    Maven中resources標簽的用法詳解

    本文主要介紹了Maven中resources標簽的用法詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java實現(xiàn)注冊郵箱激活賬戶實例代碼

    Java實現(xiàn)注冊郵箱激活賬戶實例代碼

    本篇文章主要介紹了Java實現(xiàn)郵箱激活賬戶實例代碼,這里整理了詳細的代碼,具有一定的參考價值,有需要的小伙伴可以參考下。
    2017-07-07
  • MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler

    MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler

    這篇文章主要為大家介紹了MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • JAVA防止重復(fù)提交Web表單的方法

    JAVA防止重復(fù)提交Web表單的方法

    這篇文章主要介紹了JAVA防止重復(fù)提交Web表單的方法,涉及Java針對表單的相關(guān)處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • DoytoQuery 聚合查詢方案示例詳解

    DoytoQuery 聚合查詢方案示例詳解

    這篇文章主要為大家介紹了DoytoQuery 聚合查詢方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論