hibernate简单应用
Hibernate?第二章
核心API?和CURD實現(xiàn)
?
核心API介紹
單表操作方法
查詢hql語句
?
1、認識hibernate?
核心思想ORM:實現(xiàn)數(shù)據(jù)庫中的文件一一映射為java中的實體類。
使用hibernate
1)引入hibernate
2)使用相關核心配置文件:
i.?數(shù)據(jù)庫配置文件:?*.hibernate.cfg.xml
ii.?映射文件:?*.hbm.xml(描述表和列,與實體類和屬性對應關系!)
?
注意:需要使用hibernate?指定主鍵的自動實現(xiàn)方法!學名:“主鍵生成策略”
(1)native?本地,hibernate?根據(jù)不同數(shù)據(jù)庫自動選擇主鍵的生成方式
(mysql,sqlserver?-->自增,oracle:序列)
(2)Identity:自增長!!使用mysql+sqlserver
(3)Sequence:適用于oracle
(4)Increment:hibernate代理生成自增主鍵
(5)Uuid:位子字符串!
(6)Assigned:表示有java單獨生成一個唯一主鍵
?
核心API
配置configuration:根啟動hibernate?,加載配置文件
SessionFactory:初始化數(shù)據(jù)源信息,一個數(shù)據(jù)源對應一個SessionFactory對象,該對象會自動分析表和實體的關系文件。大對象:創(chuàng)建和銷毀非常消耗內(nèi)存,建議一個?項目中只有1個。
Session:CURD核心對象
Transaction:事務對象(非查詢)
Query和?criteria:查詢對象
以上6類接口,criteria用的相對比較少,都存在于?org.hibernate包中。
?
【注意:SessionFactory對象是線程安全的大對象,可以被整個項目使用。Session1不能被多個方法共享。是縣城不安全的。】
?
3、session中CURD方法。
Save(對象)新增
Update(對象)修改,該對象必須包含id
Delete(對象)刪除,該對象必須包含id
SaveOrUpdate(對象)
?
Session里面可以保存數(shù)據(jù),這時候這里面的數(shù)據(jù)叫做?一級緩存數(shù)據(jù)
SaveOrUpdate(對象)??
對象中沒設置id屬性,直接增加
對象中設置了id屬性,直接修改
?
查詢:load/get?兩種方法的區(qū)別。Id找不到的時候,get會返回一個?null,
Load會出現(xiàn)Exception。
調(diào)用修改方法時,有一個?臟檢查。【大多數(shù)人念做,心臟的臟。表示,重要得點進行修改,不重要的點就不再修改。】
這其實是由于更新對象的方式不正確導致的。
比如:
表中數(shù)據(jù):
User_id???user_name?user_password
1????????lifei lifei
?
User?user?=?new?User();
user.setUser_id(1);
user.setUser_name("letben");
此時調(diào)用修改方法?必然密碼項會被置成null。
但是重點其實在于user_name是被改的屬性屬于核心屬性或者叫重點屬性。是一定要被修改的,但是這并不應該把密碼置空。所以這是不合理的。對于合理的方式應該是:先把用戶取出來,然后再修改。
【這個?東西老師那里今天演示也沒有實現(xiàn),所以?先不管這個我們先實現(xiàn)正確的修改方式。】
?
查詢:
使用HQL查詢語言!是一種面向對象的查詢語句
比如:查詢所有
Select?*?from?表名?where...
From?實體對象名??where...
使用query?對象,查詢語句必須按照面向對象的寫法。
From?類名?where?屬性=值。。。
動態(tài)修改?命令
Dynamic-update="true",在對應關系文件中的class?標簽內(nèi)添加【不過并未實現(xiàn)】
?
查詢完整語法:
From?類名?as?別名?where?別名.屬性=值...
Oeder?by?desc/asc
Group?by....
Having...
?
查詢固定列
Select?別名.屬性1,別名.屬性2?from
類名?as?別名?where?條件...
查詢方法
獲得列表?list();【常用】
Iterator();【應用較少】
區(qū)別:list直接從數(shù)據(jù)庫中查詢數(shù)據(jù),生成1條sql。而迭代器會先從數(shù)據(jù)庫中查詢出所有的主鍵列id,使用時,優(yōu)先從內(nèi)存(緩存)中查找數(shù)據(jù),只有當找不到數(shù)據(jù)時才回去數(shù)據(jù)庫中進行查詢。
具體使用哪一條語句,取決于數(shù)據(jù)量的大小,一般5m作為一個標識。5m以內(nèi)都是可以使用list()當數(shù)據(jù)量大于5m的時候建議使用iterator().但是一般情況下都適用list().因為我們一般在查詢的時候會使用分頁,所以?還是?查詢的數(shù)據(jù)量很小。一般都不會用到這個?iterator().5m是一個?很龐大的數(shù)字,可以算一下5m的漢字量應該有多大。一個漢字兩個字節(jié)。是兩個byte。1024byte=1kb。1024kb=1mb?。5m=5120kb=5120*1024byte/2=2621440個漢字。
?
Hibernate?注入變量值
?或?:別名
From?TblUser?u?where?u.uname=?
From?TblUser?u?where?u.uname=:別名
?
分頁查詢
setFirstResult(開始位置);
setMaxResults(每頁條數(shù));
開始位置=(當前頁-1)*?每頁條數(shù)
?
?
第二天
?
2016.1.4?hibernate?的復習鞏固
?
說實話這樣定義的話,就基本上就可以不管之前周哥講的東西了,只要跟緊華哥就行。
?
框架:
?
什么是框架?
把一部分能夠完成某種特定功能的代碼封裝到一部分類中,這些類之間有一定的關聯(lián)關系。把這些具有關聯(lián)關系的類稱作框架。
Hibernate:持久層框架,封裝的是jdbc的代碼,用來連接數(shù)據(jù)庫。
持久層?持久化?
持久化,就是?把原來只在內(nèi)存里面的東西寫到硬盤上,使之掉電不消失。這樣的過程稱作持久化。完成這樣功能的代碼稱作持久層。
有人引入了中間件。
中間件的范圍很廣。用于連接java代碼和數(shù)據(jù)庫的橋梁,屏蔽了數(shù)據(jù)庫的細節(jié)的hibernate就可以稱作是一個中間件。是凡具有這樣通用型功能的屏蔽了一定的細節(jié),使之更加簡化方便的java類們,就可以稱作中間件。中間件的存在也恰恰是因為可以讓操作更加平滑。才能夠光為人們使用。雖然中間件并不一定更加簡單。但是流行起來的中間件一定是可以簡化人們操作的。
?
Orm:編程思想
Object?relation?mapping?對象關系映射。
兩個方面:
一方面是指:抽象的類和數(shù)據(jù)表之間的對應關系
另一方面是:具體的類的對象和數(shù)據(jù)表中一條元組之間的對應關系。
?
?
搭建Hibernate的框架的環(huán)境:
1、映射關系,javabean類,映射文件,*.hbm.xml
2、創(chuàng)建一個hibernate的核心配置文件,(連接數(shù)據(jù)庫參數(shù),hibernate的屬性配置,加載映射文件)
3、創(chuàng)建數(shù)據(jù)庫會話(session),session這個對象上,擁有對數(shù)據(jù)庫操作的各種方法(鏈接,事務管理,提供在映射關系的基礎之上)。
4、加載hibernate配置信息的方式有三種:
1)Xml
2)硬編碼形式,就是生寫一套鏈接方式。
3)屬性文件
?
主鍵生成策略
Hibernate?中?操作的對象的狀態(tài)變化:新生態(tài)(瞬態(tài))、托管?、持久態(tài)、游離態(tài)(脫管)。
Hibernate?關系映射。一對一,一對多,多對一,多對對,繼承映射。
?
不能故步自封,要更多的理解其中的精妙,視圖自己寫一個真正的框架,我其實只是剛剛走了一步。比如dom4j還有??很多內(nèi)容都沒有完成。需要更加仔細的練習今天的內(nèi)容,才能知道日后框架需要的其他內(nèi)容。
Get和load的區(qū)別除了之前說過的在當查找結果,沒有找到對應對象時,load會報異常而get方法返回null以外。還有一點就是:load是延時加載,當這條結果被用到的時候,才會去加載,如果這個結果沒有用到,就不會加載,最明顯的點在于是否會生成對應的sql語句。執(zhí)行get語句時,會立刻生成sql語句,并且執(zhí)行然后輸出結果。在配置對應的hibernate時候,的class位置時,如果設置了這樣一個屬性:lazy="false"?那么get方法就等效與load方法,在是否延遲這個問題上。當繼續(xù)考慮到空值查詢時,依然延續(xù)之前的。查詢結果返回方式。
?
?
第三天:
復習:
1、hibernate?鏈接數(shù)據(jù)庫?jdbc?的通用持久化框架
2、Orm映射思想?的這樣一種封裝的概念。主要包括抽象層面的類和表的對應,以及該類的一個對象和具體的一條元組之間的對應關系。
3、Hibernate操作的是對象
4、Hibernate?包括什么:session?的會話:鏈接,事務管理,操作數(shù)據(jù)表的各種方法
5、Hibernate?環(huán)境的搭建:
Po類?和映射文件:?hibernate.cfg.xml??hibernateUtil???configuration
6、加載配置信息的方式1、xml??【這里需要注意一點,如果?這個?映射配置文件的名稱就是:hibernate.cfg.xml?的話,在程序的??configuration.configure([這里面就可以什么都不寫]);如果全局映射文件改名為:?hibernate23.cfg.xml?在程序的configuration.configure("hibernate23.cfg.xml");】?2、?硬編碼???3、屬性文件
7、對應對象的狀態(tài):?新生狀態(tài)(瞬態(tài))?托管?持久化?游離態(tài)(脫管)
舉例:當一個對象創(chuàng)建之后,還沒有調(diào)用具體dao層的方法時,該對象處于新生狀態(tài)也叫瞬態(tài),隨后調(diào)用dao層的添加方法,創(chuàng)建session對象,在執(zhí)行session.Save(對象)的方法時,處于托管狀態(tài),之后調(diào)用transaction.commit()此時對象處于持久化狀態(tài),當session.close()后,對象處于游離態(tài)。
8、get?和load?方法之間的區(qū)別?
get和load兩個方法都作為根據(jù)對象id查詢一個?元組的方法,區(qū)別表現(xiàn)在:(對于單表:)當利用get方法進行查詢時,會立即生成一條查詢語句,并進行查詢。無論該對象是否會被使用。當利用load方法進行查詢時,只有當查到的結果被使用時,才會生成查詢語句并進行查找,也就是說,load方法在獲得對象時,存在延遲加載的狀況。【如果,提前關閉了session,會報出?session?is?already?closed的異常。】但是這種方式會更加高效,因為他并不會占用更多的內(nèi)存資源,比起get方法?load中加載到的內(nèi)容會在內(nèi)存中留存時間更短。弊端在于一旦該對象不存在會報出異常。這是我們不希望看到的。【這種加載延遲可以通過在??*.hbm.xml的配置文件的class標簽中通過?設置?lazy="false",來取消。】當能夠查到結果時,是這樣,如果查詢不到結果時:get方法會返回null,load?會返回exception。
當對于多表進行查詢時,等我今天做完實驗,在補充到這里面。多表查詢時,get也會存在延遲。
實驗算是做完了,當比如我們查詢員工的時候,使用get方法和?load方法兩者是有區(qū)別的,get方法無論后面是否使用這個信息,都會生成sql語句,也就是?立即執(zhí)行,如果是使用load方法,如果后面使用這條信息,才會生成對應的sql語句,進行查詢,也就是存在延遲加載的情況。此時,會有另外一個情況【此時要去員工類里面關閉對應的toString()方法。否則看不到效果】hibernate出于安全性的考慮,即使利用get方法,去查詢員工信息,也不會得到對應的查詢部門的語句。【如果tostring()方法要求得到部門信息就怎么樣都會執(zhí)行,也就看不到效果了。】這就是get方法在多表聯(lián)查中的“犯懶”現(xiàn)象,這?是處于安全性的考慮。這種現(xiàn)象是可以遏制的。也是通過配置lazy,如果設置lazy=“false”也就是?查詢語句會立即執(zhí)行。在查詢到員工后,會立即對部門的信息進行查詢,在配置的時候通過員工查詢到部門打出lazy后給出的聯(lián)想是false?也就是多對一的時候是幫助得到那一個部門的,但是一對多的時候,打出lazy之后給出的聯(lián)想是true也就是?如果要查詢更多的數(shù)據(jù),也就是一對多的時候是不希望你查到結果的。但是都可以配置為false。只是在配置的時候hibernate希望你按照他的方式進行配置。
9、一對多?多對一??單向關聯(lián)映射?和雙向關聯(lián)映射。
10、級聯(lián)?:?級聯(lián)新增?和?級聯(lián)刪除?(級聯(lián)刪除還有一些問題)
11、一對一?多對多
12、符合主鍵映射,符合主鍵類的映射
13、對于普通屬性的?細粒度劃分
14、明天會講?繼承映射?和hql。
所以今天的重點主要在?這些類的映射配置文件上面。
?
然后po?是真實的對應一個?表的實體類。
vo?是只面對?展示或者?中間存儲的?視圖類。
兩者都是?javabean對象?區(qū)別在于?是否真實對應一個?表。
?
每個Hibernate?session的基本操作?-?包括?persist(),?merge(),?saveOrUpdate(),?delete(),?lock(),?refresh(),?evict(),?replicate()?-?都有對應的級聯(lián)風格(cascade?style)。?這些級聯(lián)風格(cascade?style)風格分別命名為?create,?merge,?save-update,?delete,?lock,?refresh,?evict,?replicate。?如果你希望一個操作被順著關聯(lián)關系級聯(lián)傳播,你必須在映射文件中指出這一點。
?
添加新的員工時,如果部門是新的,那就需要設置級聯(lián),如果部門是之前得到的,那就不需要級聯(lián)。
?
老師是班級的老師,班級是老師的班級,這種邏輯屬于多對多,如果單純這么生連,一條記錄都插不進去,所以多對多的關系必然有中間表的存在。
?
第四天:
查詢:
1、session會話對象中提供,直接查詢方法?get?load
2、表轉化查詢
3、HQL
4、Sql
?
好吧?今天主要看例子。昨天的還有內(nèi)容沒有完成,今天的內(nèi)容也有部分沒有完善。
?
轉載于:https://www.cnblogs.com/letben/p/5185894.html
總結
以上是生活随笔為你收集整理的hibernate简单应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode - Maximum S
- 下一篇: 类string的构造函数、拷贝构造函数和