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>