Hibernate中Session增刪改查操作代碼詳解
把三狀態(tài)轉(zhuǎn)換圖放在這,方便分析方法的作用:
1.Session的save()方法
Session是Hibernate所有接口中最重要的接口,提供了對(duì)數(shù)據(jù)保存,更新,查詢和刪除的方法。
Session的save()方法可以使臨時(shí)態(tài)或游離態(tài)轉(zhuǎn)換為持久態(tài)。例如,保存一個(gè)Customer對(duì)象:
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tr = session.beginTransaction(); //1.創(chuàng)建Customer對(duì)象 Customer c1 = new Customer(); c1.setId(new long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調(diào)用Session的save()方法,將Customer對(duì)象持久化 session.save(c1); tr.commit(); session.close();
Save()方法主要做了以下三件事:
(1)將new創(chuàng)建的臨時(shí)態(tài)的Customer對(duì)象放入緩存,使其持久化。
(2)同時(shí)根據(jù)對(duì)象關(guān)系映射文件中設(shè)置的OID生成器,即主鍵生成方式給該對(duì)象生成一個(gè)唯一的OID。
<!--設(shè)置主鍵--> <idname="id"column="ID"type="long"> <!--主鍵生成方式--> <generatorclass="increment"/> </id>
在這個(gè)地方有一個(gè)疑問(wèn),創(chuàng)建對(duì)象時(shí)setId()方法是否是為該對(duì)象持久化生成主鍵,其實(shí)不是,setId并沒(méi)有按照我們?cè)O(shè)定的那樣生成主鍵,而是靠對(duì)象關(guān)系映射文件配置的主鍵生成方式生成主鍵,可以多運(yùn)行幾次,主鍵自增長(zhǎng),從數(shù)據(jù)庫(kù)可以看到多條數(shù)據(jù),主鍵從1開(kāi)始,所以可以知道setId()
沒(méi)有設(shè)置主鍵,否則數(shù)據(jù)庫(kù)主鍵唯一性校驗(yàn)都過(guò)不去。
我們也可以手動(dòng)設(shè)置主鍵值,必須重載save()方法,使用重載方法save(c1,newLong(1)),每次手動(dòng)設(shè)置。
(3)計(jì)劃執(zhí)行insert語(yǔ)句。注意,insert語(yǔ)句并沒(méi)有立刻執(zhí)行,只有當(dāng)Session清理緩存時(shí),才會(huì)執(zhí)行insert語(yǔ)句。tr.commit()事務(wù)提交。
2.Session的update()方法
使游離態(tài)對(duì)象變成持久態(tài)對(duì)象。例如:
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session1 = sessionFactory.openSession(); Transaction tr1 = session1.beginTransaction(); //1.創(chuàng)建Customer對(duì)象 Customer c1 = new Customer(); c1.setId(new Long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調(diào)用Session的save()方法,將Customer對(duì)象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對(duì)象更新,發(fā)現(xiàn)改變,執(zhí)行update語(yǔ)句 Session session2 = sessionFactory.openSession(); Transaction tr2 = session2.beginTransaction(); c1.setAddress("測(cè)試update"); session2.update(c1); tr2.commit(); session2.close();
Session的update()注意做以下事:
(1)把游離態(tài)的Customer對(duì)象從新加入Session緩存中,使其變成持久化對(duì)象。
(2)執(zhí)行update語(yǔ)句。跟save()執(zhí)行insert語(yǔ)句一樣,并不是立刻執(zhí)行update語(yǔ)句,需要等緩存清空時(shí),把Customer對(duì)象組裝成update語(yǔ)句,
然后再執(zhí)行。
注意,即使Customer沒(méi)有改變,默認(rèn)情況下,緩存清除時(shí)也會(huì)組裝Update語(yǔ)句,如果需要設(shè)置成改變成才執(zhí)行update語(yǔ)句,需要設(shè)置對(duì)象關(guān)系映射文件。
3.Session的saveOrUpdate()方法
saveOrUpdate()方法包含save()和update()方法的功能,根據(jù)傳入?yún)?shù)狀態(tài),調(diào)用不同方法。傳入臨時(shí)態(tài)對(duì)象調(diào)用save()方法,如果傳入游離態(tài)對(duì)象調(diào)用
update()方法。傳入持久態(tài)對(duì)象返回。所以,每次我們只需傳入對(duì)象,saveOrUpdate()方法,自動(dòng)判斷傳入對(duì)象狀態(tài)的狀態(tài),動(dòng)態(tài)調(diào)用處理方法。
該方法如何判斷傳入對(duì)象的狀態(tài)?當(dāng)滿足以下任意一個(gè)條件時(shí),就是臨時(shí)態(tài):
(1)java對(duì)象的OID為null,說(shuō)明該對(duì)象沒(méi)有別實(shí)例化,即使被實(shí)例化,也是游離態(tài)被刪除后變成臨時(shí)態(tài)的對(duì)象,這種情況下的對(duì)象為臨時(shí)態(tài)。
(2)如果java對(duì)象具有版本控制(version),版本號(hào)為null的,也就是沒(méi)有該對(duì)象的版本號(hào)。
(3)自定義攔截器,調(diào)用isUnsaved()返回值為true。
4.Session的load()和get()方法
這兩個(gè)方法都是根據(jù)OID,從數(shù)據(jù)庫(kù)中加載一個(gè)持久化對(duì)象。持久化對(duì)象放在Session緩存中,可以根據(jù)不同的需要操作該持久化對(duì)象。
兩者區(qū)別:
當(dāng)數(shù)據(jù)庫(kù)中OID沒(méi)有對(duì)應(yīng)記錄時(shí),load()拋異常,get()返回null。
5.Session的delete()方法
delete()顧名思義刪除,用于從數(shù)據(jù)庫(kù)中刪除java對(duì)象對(duì)應(yīng)的記錄。
delete()如果傳入持久化對(duì)象,組裝delete語(yǔ)句,執(zhí)行刪除;如果傳入游離態(tài)對(duì)象,hibernate先把游離態(tài)關(guān)聯(lián)到session,變成持久態(tài),再生成delete語(yǔ)句,
執(zhí)行刪除。
都是只有當(dāng)session緩存清空時(shí),才執(zhí)行。
以上執(zhí)行都是一個(gè)對(duì)象,對(duì)應(yīng)一條記錄。
可以用session.delete("fromCustomerwhere....");后面加上條件刪除多條數(shù)據(jù)。
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session1 = sessionFactory.openSession(); Transaction tr1 = session1.beginTransaction(); //1.創(chuàng)建Customer對(duì)象 Customer c1 = new Customer(); c1.setId(new Long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調(diào)用Session的save()方法,將Customer對(duì)象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對(duì)象關(guān)聯(lián)到session,持久化后清除緩存,執(zhí)行delete語(yǔ)句;放入持久態(tài)的直接刪除; Session session2 = sessionFactory.openSession(); Transaction tr2 = session2.beginTransaction(); session2.delete(c1); tr2.commit(); session2.close();
執(zhí)行結(jié)果,控制臺(tái)輸出:
Hibernate: select max(ID) from CUSTOMERS
Hibernate: insert into CUSTOMERS (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: delete from CUSTOMERS where ID=?
總結(jié)
以上就是本文關(guān)于Hibernate中Session增刪改查操作代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
通過(guò)反射注解批量插入數(shù)據(jù)到DB的實(shí)現(xiàn)方法
今天小編就為大家分享一篇關(guān)于通過(guò)反射注解批量插入數(shù)據(jù)到DB的實(shí)現(xiàn)方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03java web開(kāi)發(fā)之實(shí)現(xiàn)購(gòu)物車(chē)功能
這篇文章主要為大家詳細(xì)介紹了java web開(kāi)發(fā)之實(shí)現(xiàn)購(gòu)物車(chē)功能的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Spring session實(shí)現(xiàn)共享單點(diǎn)登錄案例過(guò)程解析
這篇文章主要介紹了Spring session實(shí)現(xiàn)共享單點(diǎn)登錄案例過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Android?Studio中創(chuàng)建java工程的完整步驟
Android?Studio創(chuàng)建java工程是非常麻煩的,因?yàn)锳ndroid?Studio沒(méi)有提供直接創(chuàng)建java工程的方法,下面這篇文章主要給大家介紹了關(guān)于Android?Studio中創(chuàng)建java工程的完整步驟,需要的朋友可以參考下2024-01-01Java使用lambda表達(dá)式簡(jiǎn)化代碼的示例詳解
這篇文章主要給大家介紹了Java如何使用lambda表達(dá)式簡(jiǎn)化代碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-11-11詳解Java中Vector和ArrayList的區(qū)別
這篇文章主要為大家詳細(xì)介紹了Java中Vector和ArrayList的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Java中EasyExcel使用自定義Converter處理方法詳解
EasyExcel自定義Converter是指在使用EasyExcel進(jìn)行Excel讀寫(xiě)操作時(shí),可以自定義轉(zhuǎn)換器來(lái)處理一些不支持的數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于Java中EasyExcel使用自定義Converter處理的相關(guān)資料,需要的朋友可以參考下2024-08-08關(guān)于Java中的繼承和組合的一個(gè)錯(cuò)誤使用的例子
這篇文章主要介紹了關(guān)于Java中的繼承和組合的一個(gè)錯(cuò)誤使用的例子,需要的朋友可以參考下2016-08-08