麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Java > 正文

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

2019-11-26 16:01:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

對(duì)于Hibernate剛剛學(xué)習(xí)了一周時(shí)間了,作為一名java初學(xué)者,也有點(diǎn)自己的感受想分享出來(lái),如果這篇文章能有幸被大家看到,也僅供大家?jiàn)蕵?lè)。如果有什么不足之處,歡迎大家多多指點(diǎn),多多批評(píng)。僅供參考,不喜勿噴。

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

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

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

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

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

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

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

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

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

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

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 特级黄色影院 | 一本视频在线观看 | 国内精品久久久久久久影视红豆 | 久草影音| 丰满年轻岳中文字幕一区二区 | 97超级碰碰人国产在线观看 | 日韩午夜片 | 少妇一级淫片高潮流水电影 | 精品xxxx户外露出视频 | 久久久久久久久久久影视 | 看免费黄色大片 | 九九热国产视频 | 色淫网站免费视频 | 亚洲国产精品久久久 | 亚洲小视频网站 | 免费看搡女人无遮挡的视频 | 91精品国产91久久久久久 | 中文字幕在线永久视频 | 欧美18videos性处按摩 | 亚洲第一页中文字幕 | 蜜桃传媒视频麻豆第一区免费观看 | 免费看性xxx高清视频自由 | 久久国产免费 | 欧美激情精品久久久久 | 成人情欲视频在线看免费 | 久久久av亚洲男天堂 | 久久精品一区二区三 | 亚洲二区免费 | 毛片一级片 | 在线亚洲播放 | 日本在线不卡一区二区 | 在线成人一区二区 | 毛片视频网站 | 7777欧美| 日本黄色一级视频 | 国产亚洲精品成人a | 久久久大片 | 日本黄色免费片 | 国内精品伊人久久 | 黄色片免费看网站 | 色综合久久久久久久久久久 |