淺談Hibernate

大家好,我是IT修真院成都分院第7期的JAVA學員龔劍飛,一枚正直純潔善良的java程序員。

今天給大家分享一下,一個比較好用的ORM框架————Hibernate。


1.背景介紹

先介紹下背景

Hibernate是什么?

Hibernate,翻譯過來是冬眠的意思,正好現在已經進入秋季,世間萬物開始準備冬眠了。其實對于對象來說就是持久化。

ORM,即Object-Relational Mapping,它的作用就是在關系型數據庫和對象之間做了一個映射。從對象(Object)映射到關系(Relation),再從關系映射到對象。這樣,我們在操作數據庫的時候,不需要再去和復雜SQL打交道,只要像操作對象一樣操作它就可以了(把關系數據庫的字段在內存中映射成對象的屬性)。

Hibernate的產生背景:

大多數應用程序都需要處理數據。Java應用程序運行時,往往把數據封裝為相互連接的對象網絡,但是當程序結束時,這些對象就會消失在一團邏輯中,所以需要有一些保存它們的方法。有時候,甚至在編寫應用程序之前,數據就已經存在了,所以需要有讀入它們和將其表示為對象的方法。手動編寫代碼來執(zhí)行這些任務不僅單調乏味、易于出錯,而且會占用整個應用程序的很大一部分開發(fā)工作量。

Gavin King開發(fā)hibernate的動機有兩個:發(fā)現CMP太爛;贏得對老板的爭執(zhí)。Gavin King當時沒有任何用SQL開發(fā)數據庫的經驗,Gavin King開發(fā)hibernate的第一件事是去街上買了本SQL基礎的書

2.知識剖析

執(zhí)行流程

Configuration接口:負責配置并啟動Hibernate

SessionFactory接口:負責初始化Hibernate

Session接口:負責持久化對象的CRUD操作

Transaction接口:負責事務

Query接口和Criteria接口:負責執(zhí)行各種數據庫查詢

3.常見問題

如何操作Hibernate?

4.解決方案

來給大家演示一下基本操作

5.編碼實戰(zhàn)

6.擴展思考

Mybatis同樣也是非常流行的ORM框架,主要著力點在于 POJO 與 SQL 之間的映射關系。然后通過映射配置文件,將SQL所需的參數,以及返回的結果字段映射到指定 POJO 。相對Hibernate“O/R”而言,Mybatis 是一種“Sql Mapping”的ORM實現。

Hibernate優(yōu)勢

Hibernate的DAO層開發(fā)比MyBatis簡單,Mybatis需要維護SQL和結果映射。

Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。

Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。

Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

Mybatis優(yōu)勢

MyBatis可以進行更為細致的SQL優(yōu)化,可以減少查詢字段。

MyBatis容易掌握,而Hibernate門檻較高。

7.參考文獻

CSDN博客

8.更多討論

問:hibernate和mybatis的主要區(qū)別是什么?

答:hibernate更重,一些簡單的語句不用自己寫。

MyBatis要輕量化一些,sqlmapper是必須自己寫的

問:講一下orm

對象關系映射,其實就是把JAVA代碼中的一個類,和數據庫中的一張表相對應

問:load()和get()的區(qū)別

load是延遲加載,get是立即加載。

問:hibernate的全自動體現在什么方面

體現在如果你只用簡單的語句,是不用自己寫的

問:說下Hibernate的緩存機制

evit(Object obj)將指定的持久化對象從一級緩存中清除,釋放對象所占用的內存資源,指定對象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài),從而成為游離對象。

clear()將一級緩存中的所有持久化對象清除,釋放其占用的內存資源。

contains(Object obj)判斷指定的對象是否存在于一級緩存中。

flush()刷新一級緩存區(qū)的內容,使之與數據庫數據保持同步。

try{/*開啟一個事務*/tx=session.beginTransaction();/*從數據庫中獲取id="402881e534fa5a440134fa5a45340002"的Customer對象*/Customer customer1= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");

System.out.println("customer.getUsername is"+customer1.getUsername());/*事務提交*/tx.commit();

System.out.println("-------------------------------------");/*開啟一個新事務*/tx=session.beginTransaction();/*從數據庫中獲取id="402881e534fa5a440134fa5a45340002"的Customer對象*/Customer customer2= (Customer)session.get(Customer.class, "402881e534fa5a440134fa5a45340002");

System.out.println("customer2.getUsername is"+customer2.getUsername());/*事務提交*/tx.commit();

System.out.println("-------------------------------------");/*比較兩個get()方法獲取的對象是否是同一個對象*/System.out.println("customer1 == customer2 result is "+(customer1==customer2));

}

customer1== customer2 result istrue

PPT



undefined_騰訊視頻

今天的分享就到這里啦,歡迎大家點贊、轉發(fā)、留言、拍磚~

技能樹.IT修真院“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節(jié)奏,學習的路上不再迷茫”。

這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導??靵砼c我一起學習吧~我的邀請碼:13869506,或者你可以直接點擊此鏈接:http://www.jnshu.com/login/1/13869506

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容