Hibernate

Hibernate

Hibernate概述

Hibernate介紹

ORM概述

Hibernate和JDBC的區(qū)別

Hibernate體系結(jié)構(gòu)

Hibernate框架搭建

配置XML提示信息

Hibernate配置文件

Hibernate有兩個(gè)類(lèi)型的配置文件

  1.  *.hbm.xml            對(duì)象關(guān)系映射配置文件
  2.   hibernate.cfg.xml   hibernate默認(rèn)的配置文件

hibernate.cfg.xml配置文件中的信息

  1.hibernate運(yùn)行的底層信息:數(shù)據(jù)連接信息趟济,JDBC驅(qū)動(dòng)贞言,數(shù)據(jù)庫(kù)Dialect方言等
  2.hibernate映射文件

  注:Hibernate之所以能夠和不同的關(guān)系型數(shù)據(jù)庫(kù)打交道原因是因?yàn)樗梢耘渲貌煌?     的方言盗似,這就是Hibernate跨數(shù)據(jù)庫(kù)的原因

*.hbm.xml配置文件中的信息

  1.類(lèi)和表的對(duì)應(yīng)關(guān)系
  2.類(lèi)里面的屬性和表里面字段的對(duì)應(yīng)信息
  3.映射關(guān)系(o-t-o) (o-t-m) (m-t-o) (m-t-m)     o:one m:many t:to
  4.主鍵生成策略
  5.主鍵與表的主鍵映射關(guān)系

  注:
            1.如果屬性對(duì)應(yīng)的是表里面的主鍵,則使用id標(biāo)簽
            2.如果屬性名和列名一致驮捍,則可以省略列名的配置

如何使用Hibernate操作數(shù)據(jù)庫(kù)

Hibernate.cfg.xml可以改名

讀取配置文件
  Configuration configure = new Configuration().configure(); 
    默認(rèn)名稱(chēng)版  hibernate.cfg.xml

  Configuration configure = new Configuration().configure("xxx.xml");
    改名版       xxx.xml

Hibernate核心文件-五大核心(4個(gè)核心接口 1個(gè)核心類(lèi))

Hibernate運(yùn)行原理

1.首先通過(guò)configuration去加載hibernate.cfg.xml這個(gè)配置文件
2.根據(jù)配置文件信息去創(chuàng)建sessionFactory,它是線(xiàn)程安全的,是一個(gè)session工廠(chǎng)
3.再用sessionFactory創(chuàng)建session脚曾,它是線(xiàn)程不安全的东且,相當(dāng)于JDBC的Connection
  最后通過(guò)session進(jìn)行數(shù)據(jù)庫(kù)各種操作
4.在進(jìn)行增刪改操作的時(shí)候通過(guò)session打開(kāi)transaction進(jìn)行事務(wù)的控制

Configuration的描述

    Configuration類(lèi)從hibernate.cfg.xml加載Hibernate的配置信息。
    Configuration類(lèi)從hibernate.cfg.xml加載Hibernate的配置信息本讥。
    從而得到以下信息:
    1.Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫(kù)URL珊泳,用戶(hù)名,密碼
      JDBC驅(qū)動(dòng)類(lèi)拷沸,數(shù)據(jù)庫(kù)方言Dialect(方言)色查,數(shù)據(jù)庫(kù)連接池等。
    2.Hibernate映射文件(*.hbm.xml)

    Configuration:負(fù)責(zé)管理數(shù)據(jù)庫(kù)的配置信息
    從而得到以下相關(guān)信息:
    1.Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的URL撞芍、用戶(hù)名秧了、密碼、
      JDBC驅(qū)動(dòng)類(lèi)序无、數(shù)據(jù)庫(kù)Dialect(方言)验毡、數(shù)據(jù)庫(kù)連接池等衡创。
    2.Hibernate映射文件(*.hbm.xml)

    Configuration:負(fù)責(zé)管理數(shù)據(jù)庫(kù)的配置信息
    可用以下兩種方式讀入xml文件,配置hibernate
     1. 默認(rèn)加載src下的hibernate.cfg.xml文件
        Configuration cfg=new Configuration().configure();

     2. 從classpath中讀取hibernate配置文件
Configuration config=new Configuration().configure("hibernate.cfg.xml”);

SessionFactory的描述

Session的描述

Query的描述

Transaction的描述

Session的常用方法

save()                   添加
update()                修改
saveOrUpdate()      添加或修改
createQuery()    --重點(diǎn) Query
delete()                  刪除
get()                  根據(jù)id查詢(xún)
load()                 根據(jù)id查詢(xún)

Query

  Query是Hibernate的查詢(xún)接口晶通,用于從數(shù)據(jù)庫(kù)存儲(chǔ)源查詢(xún)對(duì)象以及控制執(zhí)行查詢(xún)過(guò)程璃氢。Query包裝了一個(gè)HQL查詢(xún)語(yǔ)句。

Query接口常用方法

            1.setxxx():用于設(shè)置HQL語(yǔ)句中問(wèn)號(hào)或者變量的值
            2.list() 返回查詢(xún)接口录择,并把查詢(xún)接口轉(zhuǎn)換成list對(duì)象拔莱,
                也可以用query.uniqueResult(),得到單個(gè)對(duì)象
            3.executeUpdate(); 執(zhí)行更新和刪除語(yǔ)句隘竭。
            4.分頁(yè)查詢(xún)塘秦。
            5.uniqueResult() 返回一個(gè)查詢(xún)結(jié)果。   只能沒(méi)有或者一個(gè)

Hibernate HQL

  Hibernate Query Language查詢(xún)語(yǔ)句动看,和SQL語(yǔ)句幾乎一樣

  注意:
    HQL面向?qū)ο笞鹛蓿琒QL面向結(jié)構(gòu)
    HQL中用類(lèi)型名和屬性名,替代了原有的表名和字段名
    HQL語(yǔ)句中類(lèi)型名和屬性名大小寫(xiě)敏感
    HQL查詢(xún)所有字段值select *  則HQL語(yǔ)句中可以省略
    如果需要join..on表連接菱皆,需要建立關(guān)聯(lián)映射關(guān)系使用须误,不支持on子句。
    不要使用數(shù)據(jù)庫(kù)提供的字符串函數(shù)仇轻,日期函數(shù)京痢,數(shù)值函數(shù),特有函數(shù)
    分組函數(shù):max min avg count sum可用
    若只查詢(xún)實(shí)體類(lèi)中某幾個(gè)字段篷店,返回的結(jié)果是泛型為數(shù)組的集合

HQL查詢(xún) 關(guān)鍵字使用

  distinct
  構(gòu)造查詢(xún)
  聚合函數(shù)
  between and  一般和 ? 使用祭椰,是個(gè)占位符,下標(biāo)設(shè)值 | 命名參數(shù)設(shè)值
  group by   分組
  order by     可以根據(jù)多個(gè)字段進(jìn)行排序

Hibernate 三個(gè)狀態(tài)

  1.瞬時(shí) -> 持久
    使用session對(duì)象的save() 或saveOrUpdate()方法保存對(duì)象后疲陕,
    該對(duì)象的狀態(tài)就從游離轉(zhuǎn)為持久
    使用session對(duì)象的get() 或 load()方法獲取對(duì)象后方淤,該對(duì)象的狀態(tài)是持久狀態(tài)

  2.持久 -> 瞬時(shí)
    執(zhí)行session對(duì)象的delete()方法后,對(duì)象由原來(lái)的持久狀態(tài)轉(zhuǎn)為瞬時(shí)狀態(tài)蹄殃,
    此時(shí)該對(duì)象沒(méi)有和任何數(shù)據(jù)庫(kù)關(guān)聯(lián)携茂。

  3.持久 -> 游離
    執(zhí)行了session對(duì)象的evict(),close(),clear()方法,對(duì)象由原來(lái)的持久狀態(tài)變成游離狀態(tài)诅岩。

  4.游離 -> 持久
    重新獲取session對(duì)象讳苦,執(zhí)行session對(duì)象的update() 或 saveOrUpdate()方法
    由游離狀態(tài)轉(zhuǎn)換為持久狀態(tài),該對(duì)象再次與session關(guān)聯(lián)按厘。

  5.游離 -> 瞬時(shí)
    執(zhí)行session的delete()方法医吊,對(duì)象由游離狀態(tài)變?yōu)樗矔r(shí)狀態(tài)。
    對(duì)于不再被其他對(duì)象引用的游離狀態(tài)逮京,瞬時(shí)狀態(tài)對(duì)象會(huì)被java虛擬機(jī)按照垃圾回收處理卿堂。

Hibernate 可以自動(dòng)構(gòu)建根據(jù)實(shí)體數(shù)據(jù)表

      在Hibernate.cfg.xml 中添加

      <!-- hibernate 自動(dòng)生成表 -->
     <!-- update 自動(dòng)生成表,如果不存在會(huì)自動(dòng)創(chuàng)建,如果存在則不會(huì)創(chuàng)建 -->
     <property name="hibernate.hbm2ddl.auto">update</property>

Hibernate主鍵生成策略

    generator:主鍵生成策略
                    
    native:(數(shù)據(jù)庫(kù)本地生成策略草描,適用于多個(gè)數(shù)據(jù)庫(kù))  天然的
    sequence:序列(用于Oracle)
    increment:(適用于所有數(shù)據(jù)庫(kù)) 先查出最大的id览绿,再在此基礎(chǔ)上加1,有可能出現(xiàn)并發(fā)的問(wèn)題
    uuid:生成 一個(gè)32位穗慕,不會(huì)重復(fù)的主鍵饿敲,可以實(shí)現(xiàn)真正的跨數(shù)據(jù)庫(kù),(通常來(lái)說(shuō)應(yīng)該是String數(shù)據(jù)類(lèi)型)逛绵,適用于所有數(shù)據(jù)庫(kù)
    foreign:通常在一對(duì)一關(guān)聯(lián)的時(shí)候使用怀各,基于外鍵的主鍵生成策略           
    自動(dòng)增長(zhǎng): identity   適用于mysql db2 sql server   一般采用long short int類(lèi)型

Hibernate注解映射

    @Entity
    @Table
    @Id
    @GeneratedValue
    @Column

Hibernate關(guān)聯(lián)映射

  多對(duì)一關(guān)系映射
  
                設(shè)計(jì)表

  一對(duì)多關(guān)系映射
                
             設(shè)計(jì)表
                     商品:  g_goods
                                 gid 
                                 gname
                                 price
                                 gdate
                                 tid
                        
                       類(lèi)型:  g_type
                                  tid
                                  tname

     注解形式:
                 @OneToMany
                 @JoinColumn(name="tid")
                 @Fetch(FetchMode.JOIN)

     映射配置文件方式:
             <!-- 一對(duì)多  可用set或list 看是設(shè)置什么集合存儲(chǔ)就用什么-->
               <set name="goodsSet">
                  <key column="tid"></key>
                  <one-to-many class="com.tlxy.entity.Goods"></one-to-many>
                </set>


 多對(duì)多關(guān)系映射
          
              設(shè)計(jì)表:
                          課程:course
                                 cid
                                 cname   

                          學(xué)生:student
                                 sid
                                 sname

                        中間表:cou_stu
                                cid
                                sid

   注解配置:
        /*
         *  @ManyToMany 注解標(biāo)識(shí)Student是多對(duì)多的一端
         *  @JoinTable 描述多對(duì)多關(guān)系的數(shù)據(jù)表關(guān)系
         *  name屬性:指定中間表名稱(chēng)
         *  joinColumns 屬性:定義中間表和Student表的外鍵關(guān)系
         *  inverseJoinColumns屬性:他是另一張表的外鍵。
         */

        @ManyToMany
        @JoinTable(name="cou_stu",
        joinColumns=@JoinColumn(name="sid"),
        inverseJoinColumns=@JoinColumn(name="cid"))       

  XML配置:
          <set name="couSet" table="cou_stu">
            <!-- cou_stu 外鍵 -->
            <key column="sid"></key>
            <!-- 多對(duì)多關(guān)系 
                cid 外鍵
            -->
            <many-to-many class="com.tlxy.entity.Course" column="cid"></many-to-many>
          </set>    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末术浪,一起剝皮案震驚了整個(gè)濱河市瓢对,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胰苏,老刑警劉巖硕蛹,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硕并,居然都是意外死亡法焰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)倔毙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)埃仪,“玉大人,你說(shuō)我怎么就攤上這事陕赃」笫裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵凯正,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我豌蟋,道長(zhǎng)廊散,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任梧疲,我火速辦了婚禮允睹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幌氮。我一直安慰自己缭受,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布该互。 她就那樣靜靜地躺著米者,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔓搞,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天胰丁,我揣著相機(jī)與錄音,去河邊找鬼喂分。 笑死锦庸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒲祈。 我是一名探鬼主播甘萧,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梆掸!你這毒婦竟也來(lái)了扬卷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沥潭,失蹤者是張志新(化名)和其女友劉穎邀泉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钝鸽,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汇恤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拔恰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因谎。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颜懊,靈堂內(nèi)的尸體忽然破棺而出财岔,到底是詐尸還是另有隱情,我是刑警寧澤河爹,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布匠璧,位于F島的核電站,受9級(jí)特大地震影響咸这,放射性物質(zhì)發(fā)生泄漏夷恍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一媳维、第九天 我趴在偏房一處隱蔽的房頂上張望酿雪。 院中可真熱鬧,春花似錦侄刽、人聲如沸指黎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醋安。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茬故,已是汗流浹背盖灸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磺芭,地道東北人赁炎。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钾腺,于是被迫代替她去往敵國(guó)和親徙垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容