Java相關(guān)課程系列筆記之十四Hibernate學(xué)習(xí)筆記_第1頁(yè)
Java相關(guān)課程系列筆記之十四Hibernate學(xué)習(xí)筆記_第2頁(yè)
Java相關(guān)課程系列筆記之十四Hibernate學(xué)習(xí)筆記_第3頁(yè)
已閱讀5頁(yè),還剩100頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、-WORD格式-專業(yè)資料-可編輯-Hibernate學(xué)習(xí)筆記Java相關(guān)課程系列筆記之十四-WORD 格式 - 專業(yè)資料 - 可編輯 -筆記內(nèi)容說(shuō)明100%);Hibernate (梁建全老師主講,占筆記內(nèi)容目錄一、Hibernate 的概述 11.1 Hibernated匡架的作用 11.2 Hibernate訪問數(shù)據(jù)庫(kù)的優(yōu)點(diǎn) 11.3 JDBC訪問數(shù)據(jù)庫(kù)的缺點(diǎn)1,1.4 Hibernate的設(shè)計(jì)思想2二、Hibernate的基本使用 32.1 Hibernate的主要結(jié)構(gòu) 3.2.2 Hibernate主要的 API3.2.3 Hiber nate使用步驟 4.2.4 HQL 語(yǔ)句(簡(jiǎn)要介

2、紹) 1.5三、數(shù)據(jù)映射類型 1.63.1 映射類型的作用 1.63.2 type映射類型的兩種寫法 16.四、Hibernate主鍵生成方式 18.4.1 五種生成方式 1.8五、Hiber nate 基本特性20.5.1 對(duì)象持久性 2.05.2處于持久狀態(tài)的對(duì)象具有的特點(diǎn) 2.0.5.3三種狀態(tài)下的對(duì)象的轉(zhuǎn)換 2.1.5.4批量操作:注意及時(shí)清除緩存 2.1.5.5案例:三種狀態(tài)下的對(duì)象使用 2.1.5.6一級(jí)緩存機(jī)制(默認(rèn)開啟) 2.3.5.7一級(jí)緩存的好處 2.35.8管理一級(jí)緩存的方法 2.45.9延遲加載機(jī)制 2.65.10具有延遲加載機(jī)制的操作 2.6.5.11常犯的錯(cuò)誤 2.

3、65.12延遲加載的原理 2.75.13 Sessio的get和load方法的區(qū)別 285 . 1 4延遲加載的好處 2.85 . 1 5案例:測(cè)試延遲加載 2.95.16案例:重構(gòu)NetCTOSS資費(fèi)管理模塊 305.17 Java Web 程序中如何用延 遲加 載操 作(OpenSessionInView) 3.5六、關(guān)聯(lián)映射 4.16.1 一對(duì)多關(guān)系 one-to-many4.16.2多對(duì)一關(guān)系 many-to-one4.36 . 3多對(duì)多關(guān)聯(lián)映射 many-to-many4.5.6.4關(guān)聯(lián)操作(查詢join fetch/級(jí)聯(lián)cascade 496.5繼承關(guān)系映射 5.7七、Hiber

4、nate 查詢方法63.7.1 HQL 查詢 6.37.2 HQL 和口 SQL 的相同點(diǎn) 6.3.7.3 HQL 和口 SQL 的不同點(diǎn) 6.3.7.4 HQL典型案例 64.7.5 Criteria查詢71.7.6 Native SQL原生 SQL 查詢7.3.八、Hibernate 高級(jí)特性75.8.1二級(jí)緩存 7.58.2二級(jí)緩存開啟方法及測(cè)試 7.5.8.3二級(jí)緩存管理方法 7.78.4 二級(jí)緩存的使用環(huán)境 7.88.5 查詢緩存 7.88.6查詢緩存開啟方法及測(cè)試 7.8.8.7 查詢緩存的使用環(huán)境 7.9九、Hibernate 鎖機(jī)制 8.09.1 悲觀鎖 8.09.2 悲觀鎖的

5、實(shí)現(xiàn)原理 8.09.3 悲觀鎖使用步驟及測(cè)試 8.09.4 樂觀鎖 8.39.5 樂觀鎖的實(shí)現(xiàn)原理 8.39.6 樂觀鎖使用步驟及測(cè)試 8.3十、 其他注意事項(xiàng) 8.510.1源碼服務(wù)器管理工具 8.5 10.2 利用 MyEclipse 根據(jù)數(shù)據(jù)表自動(dòng)生成實(shí)體類、hbm.xml8.5.10.3根據(jù)實(shí)體類和 hbm.xml 生成數(shù)據(jù)表 8.810.4 Hibernate中分頁(yè)查詢使用join fatch的缺點(diǎn).8810.5 Hibernate的子查詢映身寸 89.一、 Hibernate 的概述1.1 Hibernate 框架的作用Hibernate 框架是一個(gè)數(shù)據(jù)訪問框架(也叫持久層框 架,

6、可將實(shí)體對(duì)象變成持久對(duì)象,詳見第 5 章)。通過(guò) Hibernate 框架可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作,為業(yè) 務(wù)層構(gòu)建一個(gè)持久層。可以使用它替代以前的 JDBC 訪問數(shù)據(jù)。1.2 Hibernate 訪問數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)1)簡(jiǎn)單,可以簡(jiǎn)化數(shù)據(jù)庫(kù)操作代碼。2)Hibernate可以自動(dòng)生成 SQL,可以將 ResultSet 中的記錄和實(shí)體類自動(dòng)的映射(轉(zhuǎn)化) 。3)Hibernate不和數(shù)據(jù)庫(kù)關(guān)聯(lián),是一種通用的數(shù)據(jù)庫(kù) 框架(支持 30 多種數(shù)據(jù)庫(kù)),可以方便數(shù)據(jù)庫(kù)移植。 任何數(shù)據(jù)庫(kù)都可以執(zhí)行它的 API。因?yàn)镠ibernate的API 中是不涉及SQL語(yǔ)句的,它會(huì)根據(jù)Hibernate的配置文 件

7、,自動(dòng)生成相應(yīng)數(shù)據(jù)庫(kù)的 SQL 語(yǔ)句。1.3 JDBC 訪問數(shù)據(jù)庫(kù)的缺點(diǎn)1)需要編寫大量的復(fù)雜的 SQL 語(yǔ)句、表字段多時(shí) SQL 也繁瑣、設(shè)置各個(gè)問號(hào)值。2)需要編寫實(shí)體對(duì)象和記錄之間的代碼, 較為繁瑣。3)數(shù)據(jù)庫(kù)移植時(shí)需要修改大量的 SQL 語(yǔ)句。1.4 Hibernate 的設(shè)計(jì)思想Hibernate是基于 ORM (Object Relation Mapping 思 想設(shè)計(jì)的,稱為對(duì)象關(guān)系映射。負(fù)責(zé) Java對(duì)象和數(shù)據(jù) 庫(kù)表數(shù)據(jù)之間的映射。Hibernate是一款主流的ORM工具,還有其他很多 ORM 工具,女口: MyBatis(以前叫 iBatis)、臚A。Hibernate 功能

8、比MyBatis強(qiáng)大些,屬于全自動(dòng)類型, MyBatis屬 于半自動(dòng)。但全自動(dòng)會(huì)有些不可控因素,因此有些公 司會(huì)用 MyBatis。ORM工具在完成Java對(duì)象和數(shù)據(jù)庫(kù)之間的映射后:1) 在查詢時(shí),直接利用工具取出“對(duì)象”(不論是 查詢一條記錄還是多條記錄, 取出的都是一個(gè)個(gè)對(duì)象, 我們不用再去轉(zhuǎn)化實(shí)體了) 。2)在增刪改操作時(shí),直接利用工具將“對(duì)象”更新 到數(shù)據(jù)庫(kù)表中(我們不用再去把對(duì)象轉(zhuǎn)成數(shù)據(jù)了) 。3)中間的 SQL+JDBC 細(xì)節(jié),都被封裝在了工具底 層,不需要程序員參與。注意事項(xiàng):Java程序想訪問數(shù)據(jù)庫(kù),只能通過(guò) JDBC的方 式,而Hibernate框架也就是基于 ORM思想對(duì)

9、JDBC的封裝。Hibernate是以“對(duì)象”為單位進(jìn)行數(shù)據(jù)庫(kù)的操 作。二、 Hibernate 的基本使用2.1 Hibernate 的主要結(jié)構(gòu)1) hibernate.cfg.xml(僅 1 個(gè)):Hibernate 的主配置 文件,主要定義數(shù)據(jù)連接參數(shù)和框架設(shè)置參數(shù)。注意事項(xiàng):就是個(gè) xml 文件,只是名字比較奇 葩!2) Entity 實(shí)體類( n 個(gè),一個(gè)表一個(gè)):主要用于封 裝數(shù)據(jù)庫(kù)數(shù)據(jù)。3) hbm.xml 映射文件( n 個(gè)):主要描述實(shí)體類和數(shù) 據(jù)表之間的映射信息。描述表與類,字段與屬性的對(duì) 應(yīng)關(guān)系。注意事項(xiàng): hbm.xml 是個(gè)后綴,如:命名可寫Cost.hbm.xm。2

10、.2 Hibernate 主要的 API1) Configuration:用于加載 hibernate.cfg.xml配置信 息。用于創(chuàng)建 Session Factory2) SessionFactor:y 存儲(chǔ)了 hbm.xml 中描述的信息, 內(nèi)置了一些預(yù)編譯的SQL,可以創(chuàng)建SessiorM象。3) Session負(fù)責(zé)對(duì)數(shù)據(jù)表執(zhí)行增刪改查操作。表示 Java 程序與數(shù) 據(jù)庫(kù)的 一 次 連接 會(huì)話 , 是對(duì)以 前 的 Conn ection對(duì)象的圭寸裝。和 JSP中的session不是一回 事,就是名字一樣而已。4) Query:負(fù)責(zé)對(duì)數(shù)據(jù)表執(zhí)行特殊查詢操作。5) Transaction負(fù)

11、責(zé)Hibernate操作的事務(wù)管理。默-WORD格式-專業(yè)資料-可編輯-認(rèn)情況下Hibernate事務(wù)關(guān)閉了自動(dòng)提交功能,需要顯 式的追加事務(wù)管理(如調(diào)用Transaction對(duì)象中的commit();提交事務(wù))!注意事項(xiàng):這些API都是在Hibernate包下的,導(dǎo)包別導(dǎo) 錯(cuò)!第一次訪問數(shù)據(jù)庫(kù)比較慢,比較耗資源,因?yàn)?加載的信息多。2.3 Hibernate使用步驟step1 :建立數(shù)據(jù)庫(kù)表。step2:建立Java工程(Web工程也可),引入Hibernate 開發(fā)包和數(shù)據(jù)庫(kù)驅(qū)動(dòng)包。必須引入的包:hibernate3.ja、 cglib.jar、 dom4j.jar、com mon s-c

12、ollecti on s.jar、com mon s-logg in g.ja-r 等step3:添加hibernate.cfg.xm配置文件,文件內(nèi)容如下: org.hibernate.dialect.OracleDialectv!-不知道數(shù) 據(jù)庫(kù)版本就寫 OracleDialect -v/propertyx!-可 在hiber nate3.jar中org.hibernate.dialec包下查看名字 -vproperty n ame=c onn ectio n.url jdbc:oracle:thi n:localhost:1521:dbcha ng vpropertyn ame=c on

13、n ectio n. usernamesystem vpropertyn ame=c onn ecti on .passwordcha ngv/propertyvproperty n ame=c onn ectio n.driver_class oracle.jdbc.driver.OracleDrivervproperty n ame=show_sqltruevproperty n ame=format_sqltruev/property v!-指定映射描述文件-vmapp ingresource=org/tare na/en tity/Cost.hbm.xml / v/sessi on-

14、factoryv/hiber nate-c on figurati on屆性名dialect頂定眾揺專龍方言雖然各稱荽焉互豁抬SQL恬 準(zhǔn),但不同的額揭所實(shí)現(xiàn)的SQL語(yǔ)句賂有不同1所 :冒逛庫(kù)菟方言応垠JE所柔用城庫(kù)的不同設(shè)置不同 籠方言類.取如:org.hibernate.dialect.Oracle9Dialectf 針Orade ) org.hibernate.dialect.1,1 y SQLDiaied: WT MySQL) org.hibernate.dtalect.SQLSefv&rDialect (針 77 SQLServer Jco nnection.d nvess瓏琳瑋JD

15、BC返就黃connection url艇 JDBC荷庫(kù)的URLcon nm di on. u 占 mm 呂 mg區(qū)進(jìn)接數(shù)據(jù).芽的用戶名connection passrdShow_sc|可選鑫取.如黒設(shè)置為i true r則tibernate將U 日586W式箱岀執(zhí)行的SQL皓句r用亍瞬遍層 hibemateKji r 冥獸認(rèn)道為 false,rF ormat_sqi可選參數(shù).如頁(yè)設(shè)置尢true r貝hibernate蠱二 SQL語(yǔ)句對(duì)逛権m 按照舍理分行印縮斗疋式亙亍 SQL :訖,婦罠為false則不程淫梧式舅生認(rèn)週力 -false-注意事項(xiàng):應(yīng)該放在源文件的 src目錄下,默認(rèn) 為hibe

16、rnate.cfg.xm。文件內(nèi)容是 Hibernate工作時(shí) 必須用到的基礎(chǔ)信息。step4:編寫Entity實(shí)體類(也叫POJO類),例如:資 費(fèi)實(shí)體類Costprivate Integer id; /資費(fèi) IDprivate StrincfeeName; /資費(fèi)名稱private Integer baseDuration; /基本時(shí)長(zhǎng) private Float baseCost; /基本定費(fèi)private Float un itCos t; / 單位費(fèi)用privateString status; 0:開通;1 暫停;private String descr; /資費(fèi)信息說(shuō)明privat

17、eDate createTime; 創(chuàng)建日期private Date startTime; / 啟用日期privateStri ng costType; / 資費(fèi)類型getter/setter 方法注意事項(xiàng):POJO類表示普通類(Plain Ordinary Old Object),沒有格式的類,只有屬性和對(duì)應(yīng)的 getter/setter方法,而沒有任何業(yè)務(wù)邏輯方法的類。這種類最多再加入 equals() hashCode(、toString() 等重寫父類Object的方法。不承擔(dān)任何實(shí)現(xiàn)業(yè)務(wù) 邏輯的責(zé)任。step5:編寫hbm.xml映射(文件)描述信息:映射文 件用于指明POJO類和表

18、之間的映射關(guān)系(xx屬性對(duì) 應(yīng)xx字段),一個(gè)類對(duì)應(yīng)一個(gè)映射文件。例如:Cost.hbm.xml 內(nèi)容如下:!- -!- 表明此為主鍵列,且必須寫否則 xml報(bào)錯(cuò),主鍵映射-!- 或雙標(biāo)簽 -vparamname=sequenceCOST_SEQ_CHANG v/ge neratorvpropertyn ame= nametype=java.la ng.Stri ng vcolumn name=NAME /vpropertyn ame=baseDurati ontype=java.la ng.l nteger-WORD格式-專業(yè)資料-可編輯-vcolu mn name=BASE_DURATIO

19、N / v/propertyvpropertyn ame=baseCosttype=javaa ng.Float vpropertyn ame=startTimetype=java.sql.Datevcolumn name=STARTIME / ,主鍵歹U同理!-其他省略v/hibernate-mappi ng注意事項(xiàng):映射文件默認(rèn)與POJO類放在一起;命名規(guī)則 為:類名.hbm.xm。hbm.xml中已寫出的屬性與字段的映射要對(duì)應(yīng),若表中沒有某個(gè)字段,卻寫了映射關(guān)系,則報(bào)錯(cuò):找不到實(shí)體類。step6:利用 Hibernate API 實(shí)現(xiàn) DAO1)新建HibernateUtil類,用于圭寸

20、裝創(chuàng)建 Session的方 法。如下:每個(gè)用戶會(huì)對(duì)應(yīng)一個(gè)Session但是Sessi on Factor是共享的。public class Hiber nateUtil private static Session Factory sf;static不用每次都加載配置信息,所以放 static 塊中,否則每次都加載會(huì)耗費(fèi)資源Configuration conf=new Configuration();/ 加載 主配置 hibernate.cfg.xmlconf.con figure(/hiber nate.cfg.xml);sf=c on f.buildSessi on Factory。;/獲

21、 取Session Factorypublic static Session getSession()獲取 Session Sessi on sessi on =sf.ope nSessi on(); retur n sessi on; 2) 新建 CostDAO 接口public Cost fin dByld(i nt id);public voidsave(Cost cost);public void delete(i nt id); public void update(Cos cost);public List fin dAll();3) 新建CostDAOImpl類,用于實(shí)現(xiàn)Cost

22、DAO接口 public class CostDAOImpl impleme nts CostDAO private Sessi on sessi on;public CostDAOImpl () / 不想老寫獲得 session 的方法,就寫在構(gòu)造器中sessi on=Hiber nateUtil.getSessi on();/* get方法執(zhí)行查詢,按主鍵當(dāng)條件查詢,如何判 斷是主鍵,是根據(jù)寫的描述文件來(lái)定,get方法就是fin dByld,就是按主鍵去查,需指定:操作哪個(gè)類和 id(主鍵)條件值即可,其他條件查詢做不了*/public Cost fin dById(i nt id) /S

23、essi on sessi on=HibernateUtil.getSessi on ();id);Costcost=(Cost)sessi on .get(Cost.class,sessi on. close(); retur n cos t;/* save方法執(zhí)行增加操作,注意 1獲取事務(wù)并開 啟,增刪改要注意,查詢可以不管事務(wù),因?yàn)闆]對(duì)數(shù) 據(jù)庫(kù)進(jìn)行修改;注意 2:主鍵值根據(jù)hbm.xml中的定義生成,執(zhí)行后,會(huì)先獲取序列值,再 去做insert操作。即先:select COST_SEQ_CHANG.nextval from dual: 然后:insert into */public vo

24、id save(Cost cost) /Sessi on sessi on=HibernateUtil.getSessi on ();Tran sactio ntx=sessi on .begi nTran sactio n();/打開 事務(wù)sessi on. save(cost);mit();/ 提交事務(wù)session.close();釋放/* delete方法執(zhí)行刪除操作,由于Hibernate以“對(duì) 象”為單位進(jìn)行數(shù)據(jù)庫(kù)操作,所以這里要傳進(jìn)去一個(gè) 對(duì)象,雖然是個(gè)對(duì)象,但還是按主鍵做條件刪除,只 要把主鍵值設(shè)置上就行,其他非主鍵值不用管。也可 先通過(guò)id查再刪*/public void d

25、elete(i nt id) /Sessi on sessi on=HibernateUtil.getSessio n();Transaction tx=session.beginTransaction(); Cost cost=new Cost();cost.setId(id);sessi on. delete(cost);mit(); sessi on. close(); /* update方法執(zhí)行修改操作,*/public void update(Cost cost) /Sessi on sessi on=HibernateUtil.getSessio n(); Transaction

26、tx=session.beginTransaction(); session.update(cost);將cost對(duì)象更新到數(shù)據(jù)庫(kù)mit();sessi on. close();/* 特殊查詢,SQL 語(yǔ)句:String sql=select * fromCOST_CHANG;HQL 語(yǔ)句:String hql=from Cost; ( Hibernate Query Language是面向?qū)ο蟮牟樵冋Z(yǔ)句。from后寫映射的類名,它是Hibernate中特有的查詢 語(yǔ)句,根據(jù)映射的類去查詢。*/public List fin dAll() /Sessi on sessi on=Hibernat

27、eUtil.getSessi on ();String hql=from Cost;/HQL 語(yǔ)句Query query=sessi on. createQuery(hql);List list=query.list();/ 執(zhí)行查詢,返回 List集合sessi on. close(); return list;4) 新建TestCostDAO類,使用junit測(cè)試Testpublic void testFindByld() 當(dāng) get 方法沒有記錄 時(shí),返回nullCostDAO costDao = new CostDAOImpl();Cost cost = costDao.fi ndBy

28、Id(1);st.getBaseDurati on();System.out.pri ntln (cost.getBaseCost();System.out.pri ntl n(cost.getU nitCost();System.out.pri ntln (cost.getDescr();Testpublic void testSave()/id 主鍵列由 Hibernate 管 理,這里不用設(shè)置Cost cost=new Cost(); cost.setName(2013計(jì)時(shí));cost.setU nitCost(0.8f); cost.setDescr(計(jì)時(shí),0.8元/小時(shí)。);cost

29、.setStatus(0); cost.setCreaTime( new Date(System.curre ntTimeMillis();CostDAO costDao = new CostDAOImpl();costDao.save(cost); Testpublic void testUpdate()開通某個(gè)資費(fèi),把狀態(tài) 由0變?yōu)?CostDAO costDAO=new CostDAOImpl();/*注意事項(xiàng):更新部分字段,不能和實(shí)現(xiàn)類中 的刪除那樣,做一個(gè)對(duì)象出來(lái)!否則沒設(shè)置的字段將 被改為空! 即不能:Cost cost=new Cost() cost.setld(90);cost

30、.setStatus(1);cost.setStartTime( neDate(System.currentTimeMillis(); */Cost cost=costDAO.findByld(90); 只能先通過(guò) id找到帶有所有值的對(duì)象cost.setStatus(1);/然后再對(duì)部分字段進(jìn)行更 新,才能避免把其他字段更新為空cost.setStartTime( newDate(System.curre ntTimeMillis(); costDAO.update(cost);Test public void testDelete()CostDAO costDAO=new CostDAOI

31、mpl(); costDAO.delete(90); Testpublic void testF in dAll()CostDAO costDAO=new CostDAOImpl(); List list=costDAO.fi ndAll();for(Cost c:list) System.out.println(c.getName());2.4 HQL語(yǔ)句(簡(jiǎn)要介紹)簡(jiǎn)要介紹見2.3節(jié)中step6中的3)特殊查詢(本 頁(yè)最上)。詳細(xì)介紹見第七章。-WORD 格式 - 專業(yè)資料 - 可編輯 -三、數(shù)據(jù)映射類型hbm.xml 在描述字段和屬性映射時(shí),采用 type 屬性 來(lái)指定映射類型。3.1

32、映射類型的作用主要負(fù)責(zé)實(shí)現(xiàn)屬性和字段值之間的相互轉(zhuǎn)化。3.2 type 映射類型的兩種寫法1)指 定 Java 類 型 , 例 如 : java.lang.String、javaang.lnteger,不能寫成 String 2)指定Hibernate類型,例如: 整數(shù): byte、short、integer、long; 浮點(diǎn)數(shù): float、double;字符串: string; 日期和時(shí)間:date (只處理年月日),time (只處理時(shí)分秒),timestamp (處理年月曰時(shí)分秒); 布爾值: true/falsechar(1() 數(shù)據(jù)庫(kù)存Y/N ,顯示時(shí)自動(dòng)轉(zhuǎn)為 true/false

33、)、 true/falsechar(1() 數(shù)據(jù)庫(kù)存 T/F ,顯示時(shí) 自動(dòng)轉(zhuǎn)為 true/false)、true/falsev-boolean-bit (數(shù)據(jù)庫(kù)存1/0,顯示時(shí)自動(dòng)轉(zhuǎn) 為 true/false); 其他:blob (以字節(jié)為單位存儲(chǔ)大數(shù)據(jù))、clob (以字符為單位存儲(chǔ)大數(shù)據(jù)) 、big_decima、l big_integer;注意事項(xiàng):Hibernate類型都是小寫!建議使用Hibernate 類型。-WORD格式-專業(yè)資料-可編輯-3) 所以 2.3 節(jié)中 step5的 Cost.hbm.xml 內(nèi)的 type 也 可這樣寫:vpropertyn ame= name t

34、ype=stri ngvproperty name=baseCost type=floatvproperty name=startTime type=date注意事項(xiàng):java.util.Date有年月日時(shí)分秒毫秒,但如果用 date映射,則只把年月 日存進(jìn)數(shù)據(jù)庫(kù); java.sql.Date只有年月 日。java.sql.Timestamp有 年月日時(shí)分秒毫秒。若在頁(yè)面顯示按特定格式顯示則用Struts2標(biāo)簽:HibernateBJSi 類塑對(duì)應(yīng)BJavaS據(jù)類型對(duì)應(yīng)的転準(zhǔn)SQL字段類型integerirt 或 java lang IntegerINTEGERlongFong 或 lava.

35、iang LengBIG1NTshortshort Etejava lang. ShortSMALLINTfloatfloat 或但va lang FloatFLOATdoubledouble 或 ava lang.DaiibteDOUBLEbig decimaijiava math BigDecimaiNUMERICcharacterjava lang StringCHAR(1)stringjava.lang StringVARCHARbytebytelang ByteT1NYINTbooleanboolean 或java lartg Booleansrryesnobooleanlang B

36、ooleanCHAFyi) ( T or NJ )trw_fa1seboolean alt java lang BooleanCHAR(1) ( T or F )datejava.util.Date 矚的上占ql.Dd怕DATE四、Hibernate主鍵生成方式Hibernate負(fù)責(zé)管理主鍵值。它提供了多種主鍵生成 方式。4.1五種生成方式1) sequenee可以按指定序列生成主鍵值。只適用 于Oracle數(shù)據(jù)庫(kù)。不擔(dān)心并發(fā)量!例如:vgenerator class=sequence vparam name=sequence序 歹U 名字 v/paramx/ge nerator注意事項(xiàng):創(chuàng)建

37、序列時(shí)如果不指定參數(shù),默認(rèn)從 1開始,步進(jìn)是1。2) identity:按數(shù)據(jù)庫(kù)自動(dòng)增長(zhǎng)機(jī)制生成主鍵值。一 般適用于MySql、SQLServer數(shù)據(jù)庫(kù)。例如:3) native: Hibernate會(huì)根據(jù)方言類型不同,選擇不同的主鍵生成方式。如果是OracleDialect則會(huì)選擇sequenee 如果是 MySQLDialect 則會(huì)選擇 identity。例如: 注意事項(xiàng):如果是MySql數(shù)據(jù)庫(kù),vparam name=sequenee:序列名字 是不起作用 的,但也不會(huì)出錯(cuò);如果是Oracle數(shù)據(jù)庫(kù),vparam name=sequence序列名字 就會(huì)起作 用,所以一般我們會(huì)加上這句

38、話,這樣通用性更 強(qiáng)。4)assigned Hibernate會(huì)放棄主鍵生成,采用此方 法,需要在程序中指定主鍵值。例如:vgenerator class=assignedv/generator5)in creme nt: Hibernate 先執(zhí)行 select max(id) 語(yǔ)句 獲取當(dāng)前主鍵的最大值,執(zhí)行加 1操作,然后再調(diào)用 insert語(yǔ)句插入。Oracle和MySQL都可用。但不適合并 發(fā)量很大的情況!例如:vge nerator class= in creme ntv/ge nerator6) uuid/hilo : uuid:按UUID 算法生成一個(gè)主鍵值 (字符串類型);h

39、ilo :按高低位算法生成一個(gè)主鍵值 (數(shù)值類型)。例如:vgenerator class=hilo注意事項(xiàng):主鍵一般都是自動(dòng)生成的。我們一般不使用業(yè) 務(wù)數(shù)據(jù)作為主鍵,因?yàn)闃I(yè)務(wù)邏輯的改變有可能 會(huì)改變主鍵值。主鍵生成方式是枚舉類型,只能從一個(gè)有限的 范圍內(nèi)選擇,不能自定義。其中,seque nee是 使用序列生成主鍵(Oracle數(shù)據(jù)庫(kù)經(jīng)常使用)。五、Hibernate基本特性5.1對(duì)象持久性在Hibernate使用過(guò)程中,實(shí)體對(duì)象可以具有以下三 種狀態(tài):1) 臨時(shí)狀態(tài):采用new關(guān)鍵字創(chuàng)建的對(duì)象,該對(duì)象 未與Session發(fā)生關(guān)聯(lián)(未調(diào)用Session的API)。也叫臨時(shí)對(duì)象。臨時(shí)狀態(tài)的對(duì)象

40、會(huì)被 Java的垃圾回收機(jī)制回收。2)持久狀態(tài):實(shí)體對(duì)象與 Sessio n發(fā)生關(guān)聯(lián)(調(diào)用 了 Session的 get、load、save update等 API)。也叫持 久對(duì)象。3)游離狀態(tài):原來(lái)是持久狀態(tài),后來(lái)脫離了 Session 的管理。如:Session被關(guān)閉,對(duì)象將從持久狀態(tài)變?yōu)橛坞x狀態(tài),同時(shí)垃圾回收機(jī)制可以回收掉,不再占用 緩存空間了。5.2處于持久狀態(tài)的對(duì)象具有的特點(diǎn)1)對(duì)象生命期持久,垃圾回收機(jī)制不能回收。2) 對(duì)象的數(shù)據(jù)可以與數(shù)據(jù)庫(kù)同步(即對(duì)象中的數(shù)據(jù) 發(fā)生改變,則數(shù)據(jù)庫(kù)中的數(shù)據(jù)自動(dòng)同步)。由Session 對(duì)象負(fù)責(zé)管理和同步。3)對(duì)象在Session的一級(jí)緩存中存放(

41、或者說(shuō)在 Session存中的對(duì)象都是持久對(duì)象)。注意事項(xiàng):Sessio n.close有兩個(gè)作用:關(guān)閉連 接、釋放資源使對(duì)象變?yōu)橛坞x狀態(tài),當(dāng)對(duì)象的引用不存在時(shí),對(duì)象才被回收。沒被回收時(shí),對(duì) 象中的數(shù)據(jù)還在!5.3三種狀態(tài)下的對(duì)象的轉(zhuǎn)換Transientgeto : IcsdQ findQ iterate Q ftc.javeQsaveOrUpdateOPersistentevictT closeQ * clearfl * deleteQi updateQ saveOrUpdateQ lockQgarbagegarbageDetached* affects all instances in a

42、 Session5.4批量操作:注意及時(shí)清除緩存Tran sacti on tx = sessi on .begi nTran sacti on(); for(i nt i=0;i100000;i+) Foo foo = new Foo();session.save(foo);/設(shè)置 foo 屬性 if(i%50=0)夠50個(gè)對(duì)象,與數(shù)據(jù)庫(kù)同步下,并清除緩存sessi on .flush(); 同步 sessi on. clear();/清 除緩存 mit();5.5案例:三種狀態(tài)下的對(duì)象使用當(dāng)持久對(duì)象數(shù)據(jù)改變后,調(diào)用sessio n.flush方法,會(huì)與數(shù)據(jù)庫(kù)同步更新。commit()方法,

43、內(nèi)部也調(diào)用了 flush(方法,因此使用 commit()方法可以省略flush()方法的調(diào)用。Testpublic void test1()/Foo 實(shí)體有 id、name salary hireDate marry等屬性Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 1);/fo唄有持 久性foo.setName(cha ng); foo.setSalary(6000);/*提

44、交事務(wù),若后面不寫flush,只寫提交commit, 則也能執(zhí)行更新操作。因?yàn)?commit在內(nèi)部會(huì)先調(diào)用 flush,再提交事務(wù),所以此時(shí)flush可不寫*/mit();/*觸發(fā)同步動(dòng)作,同步和提交是兩回事。數(shù)據(jù)有變 化才同步(更新),沒變化不會(huì)更新*/session.flush(); session.close();/關(guān)閉 session釋放 資源 Testpublic void test2()Foo foo=new Foo();foo.setName(tigger); foo.setSalary(8000);foo.setMarry(true); foo.setHireDate (new

45、Date(System.curre ntTimeMillis();Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();sessio n.save(foo);/以上都是臨時(shí)狀態(tài),此時(shí)由臨 時(shí)狀態(tài)轉(zhuǎn)為持久狀態(tài)foo.setSalary(IOOOO);/修改foo持久對(duì)象的數(shù)據(jù), 也是更新操作,可不寫update方法mit(); 同步、提交session.close();Testpublic void test3()Sessi onsessi on=Hibernat

46、eUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 2);/fo唄有持 久性sessio n.clear();/下面的則不會(huì)與數(shù)據(jù)庫(kù)同步了 foo.setName(常);foo.setSalary(8800);mit();/session.flush(); 數(shù)據(jù)有變化才同步update,沒變化不會(huì) updatesessi on. close();5.6 一級(jí)緩存機(jī)制(默認(rèn)開啟)一級(jí)緩存被稱為 Session級(jí)別的緩存:每個(gè) Sessi

47、on 都有自己獨(dú)立的緩存區(qū),該緩存區(qū)隨著Sessior創(chuàng)建而開辟(由 SessionFactor創(chuàng)建),隨著 Session .close而釋 放。該緩存區(qū)可以存儲(chǔ)當(dāng)前Sessio咲聯(lián)的持久對(duì)象。只 有在緩存區(qū)中,Session才管該對(duì)象。5.7 一級(jí)緩存的好處Hibernate在查詢時(shí),先去緩存當(dāng)中查找,如果緩存中沒有,才去數(shù)據(jù)庫(kù)查詢。如果利用Session對(duì)同一個(gè)對(duì)象查詢多次,第一次去數(shù)據(jù)庫(kù)查,后續(xù)的會(huì)從緩存 查詢,從而減少了與數(shù)據(jù)庫(kù)的交互次數(shù)。5.8管理一級(jí)緩存的方法1) session.evict方法:將對(duì)象清除。2) session.clear方法:清除所有對(duì)象。3) session

48、.close方法:清除所有對(duì)象,并關(guān)閉與數(shù) 據(jù)庫(kù)的連接。注意事項(xiàng):不同的session的緩存區(qū)不能交叉訪 問。4) 案例:測(cè)試一級(jí)緩存Testpublic void test1()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第 一次查 詢System.out.println(foo1.getName();/能出現(xiàn) SQL 查詢語(yǔ)句Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 續(xù)查詢System.out.println(fo

49、o2.getSalary();不能出現(xiàn) SQL 查詢語(yǔ)句sessi on. close();Testpublic void test2()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第一次查 詢System.out.println(foo1.getName();/能出現(xiàn) SQL 查詢語(yǔ)句session.evict(foo1);/ 或 session.clear(foo1);Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 續(xù)查詢 System.out.println(foo2.getSalary();能出現(xiàn) SQ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論