hibernat基礎(chǔ)教程_第1頁(yè)
hibernat基礎(chǔ)教程_第2頁(yè)
hibernat基礎(chǔ)教程_第3頁(yè)
hibernat基礎(chǔ)教程_第4頁(yè)
hibernat基礎(chǔ)教程_第5頁(yè)
已閱讀5頁(yè),還剩170頁(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、Hibernate-對(duì)象對(duì)象/關(guān)系映射關(guān)系映射第三講 Hibernate框架q要求要求:熟悉Java、SQL、JDBC,掌握面向?qū)ο蟮拈_發(fā)方法。q課程目標(biāo):課程目標(biāo):理解O/R Mapping原理,掌握Hibernate開發(fā)的相關(guān)知識(shí),并能使用Hibernate進(jìn)行實(shí)際項(xiàng)目開發(fā)。一、要求與目標(biāo)一、要求與目標(biāo)模型不匹配(阻抗不匹配)Java面向?qū)ο笳Z(yǔ)言,對(duì)象模型,其主要概念有:繼承、關(guān)聯(lián)、多態(tài)等;數(shù)據(jù)庫(kù)是關(guān)系模型,其主要概念有:表、主鍵、外鍵等。解決辦法1、使用JDBC手工轉(zhuǎn)換。2、使用ORM(Object Relation Mapping對(duì)象關(guān)系映射)框架來(lái)解決,主流的ORM框架有Hibern

2、ate、TopLink、OJB。二、引入二、引入三、 O/R Mapping介紹ORM的全稱是Object/Relation Mapping,即對(duì)象/關(guān)系映射。ORM也可理解是一種規(guī)范,具體的ORM框架可作為應(yīng)用程序和數(shù)據(jù)庫(kù)的橋梁。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言與關(guān)系數(shù)據(jù)庫(kù)發(fā)展不同步時(shí),需要一種中間解決方案,ORM框架就是這樣的解決方案。ORM并不是一種具體的產(chǎn)品,而是一類框架的總稱,它概述了這類框架的基本特征:完成面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言到關(guān)系數(shù)據(jù)庫(kù)的映射。基于ORM框架完成映射后,既可利用面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言的簡(jiǎn)單易用性,又可利用關(guān)系數(shù)據(jù)庫(kù)的技術(shù)優(yōu)勢(shì)。目前ORM的產(chǎn)品非常多,比如Apache組織下的O

3、JB,Oracle的TopLink,JDO,JPA等等。對(duì)象-關(guān)系映射是一門非常實(shí)用的工程技術(shù),它實(shí)現(xiàn)了Java應(yīng)用中的對(duì)象到關(guān)系數(shù)據(jù)庫(kù)中的表的自動(dòng)的(和透明的)持久化,使用元數(shù)據(jù)(meta data)描述對(duì)象與數(shù)據(jù)庫(kù)間的映射。O/R Mapping的優(yōu)點(diǎn)的優(yōu)點(diǎn)提高生產(chǎn)效率可維護(hù)性更好性能廠商獨(dú)立性四、四、O/R Mapping的優(yōu)點(diǎn)的優(yōu)點(diǎn)五、目前流行的五、目前流行的ORM持久層可選方案持久層可選方案優(yōu)點(diǎn)優(yōu)點(diǎn)缺點(diǎn)缺點(diǎn)SQL/JDBC成熟,流行,使用DAO模式代碼煩雜,可讀性差,維護(hù)困難,移植困難Entity BeanCMP(EJB1.1之后),未來(lái)的EJB3錯(cuò)誤的設(shè)計(jì)。不可移植,依賴性強(qiáng),不可

4、序列化,不支持多態(tài)的關(guān)聯(lián)查詢JDO簡(jiǎn)單、透明、標(biāo)準(zhǔn)不夠成熟Apache OJB性能、穩(wěn)定性,屬于Apache 基金組織文檔資源太少,支持標(biāo)準(zhǔn)太多成了負(fù)擔(dān)iBATIS可以控制更多的數(shù)據(jù)庫(kù)操作細(xì)節(jié)。實(shí)用于遺留系統(tǒng)的改造和對(duì)既有數(shù)據(jù)庫(kù)的復(fù)用。持久層封裝不夠徹底,只是一個(gè)DBHelper。Hibernate成熟、流行、功能強(qiáng)大。并逐漸發(fā)展成Java 持久層事實(shí)上的標(biāo)準(zhǔn)。不夠透明六、為什么要選擇Hibernate Hibernate能在眾多的ORM框架中脫穎而出,因?yàn)镠ibernate與其他ORM框架對(duì)比具有如下優(yōu)勢(shì):1、開源和免費(fèi)的License,方便需要時(shí)研究源代碼、改寫源代碼、進(jìn)行功能定制。2、輕

5、量級(jí)封裝,避免引入過(guò)多復(fù)雜的問(wèn)題,調(diào)試容易,可減輕程序員負(fù)擔(dān)。3、具有可擴(kuò)展性,API開放。功能不夠用時(shí),可自己編碼進(jìn)行擴(kuò)展。4、開發(fā)者活躍,產(chǎn)品有穩(wěn)定的發(fā)展保障。Hibernate的工作方式 靈巧的設(shè)計(jì),出色的性能表現(xiàn)七、 Hibernate概述 Hibernate是一個(gè)免費(fèi)的開源Java包,是目前最流行的ORM框架,它是一個(gè)面向Java環(huán)境的對(duì)象/關(guān)系數(shù)據(jù)庫(kù)映射工具。也是一個(gè)輕量級(jí)的O/R Mapping框架,它問(wèn)世的時(shí)間并不長(zhǎng),但已經(jīng)成為目前最流行的持久層解決方案。 它使得程序與數(shù)據(jù)庫(kù)的交互變得十分容易,更加符合面向?qū)ο蟮脑O(shè)計(jì)思想,像數(shù)據(jù)庫(kù)中包含普通Java對(duì)象一樣,而不必考慮如何把它們

6、從數(shù)據(jù)庫(kù)表中取出。使開發(fā)者可以專注于應(yīng)用程序的對(duì)象和功能,而不必關(guān)心如何保存它們或查找這些對(duì)象。甚至在對(duì)SQL語(yǔ)句完全不了解的情況下,使用hibernate仍然可以開發(fā)出優(yōu)秀的包含數(shù)據(jù)庫(kù)訪問(wèn)的應(yīng)用程序。八、八、 持久化層含義持久化層含義基于B/S的典型三層架構(gòu) 訪問(wèn)數(shù)據(jù)庫(kù)代碼(Dao)與業(yè)務(wù)邏輯(Service)混雜在一起帶來(lái)了很多問(wèn)題,這樣的程序設(shè)計(jì)嚴(yán)重限制了程序的可擴(kuò)展性和適應(yīng)性,所以有必要要把涉及數(shù)據(jù)庫(kù)操作的代碼分離出來(lái)與業(yè)務(wù)邏輯分離。就形成了所謂“持久化層”的概念。 持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對(duì)象)保存到可永久保存的存儲(chǔ)設(shè)備中(如磁盤)。持久化的主要應(yīng)用是將

7、內(nèi)存中的數(shù)據(jù)存儲(chǔ)在關(guān)系型的數(shù)據(jù)庫(kù)中,當(dāng)然也可以存儲(chǔ)在磁盤文件中、XML數(shù)據(jù)文件中等等。八、八、 持久化層含義持久化層含義九、九、ORM工具實(shí)現(xiàn)持久化示意圖工具實(shí)現(xiàn)持久化示意圖如何進(jìn)行對(duì)象關(guān)系數(shù)據(jù)庫(kù)的匹配如何進(jìn)行對(duì)象關(guān)系數(shù)據(jù)庫(kù)的匹配public class User private String name; private String password;private String address;create table t_user ( name varchar(255) not null , password varchar(255),.primary key (name) 如何進(jìn)行對(duì)象

8、如何進(jìn)行對(duì)象關(guān)系數(shù)據(jù)庫(kù)的匹配?關(guān)系數(shù)據(jù)庫(kù)的匹配?對(duì)象對(duì)象關(guān)系數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù)類表類的屬性(基本類型)表的列一對(duì)多,多對(duì)一外鍵多對(duì)多關(guān)聯(lián)表繼承單表繼承、具體表繼承、類表繼承十、十、Hibernate入門入門Hibernate概述概述 Hibernate是非常優(yōu)秀、成熟的O/R Mapping框架。它提供了強(qiáng)大的對(duì)象和關(guān)系數(shù)據(jù)庫(kù)映射以及查詢功能。Hibernate優(yōu)勢(shì)優(yōu)勢(shì)開源(LGPL)成熟流行自定義API提高開發(fā)者工作效率十一、下載Hibernatel下載地址,本教程使用3.2.5。l將下載目錄/hibernate3.jar和/lib下的hibern

9、ate運(yùn)行時(shí)必須的包加入classpath中:antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar十二、Hibernate工作原理1. 讀取并解析配置文件2. 讀取并解析映射信息,創(chuàng)建SessionFactory3. 打開Sesssion4. 創(chuàng)建事務(wù)Transation5. 持久化操作6. 提交事務(wù)7. 關(guān)閉Session8. 關(guān)閉SesstionFactory啟動(dòng)Hibernate 構(gòu)建Configuration實(shí)例,初始化該實(shí)例中的所有變量 Configurati

10、on cfg = new Configuration().configure(); 加載hibernate.cfg.xml文件至該實(shí)例內(nèi)存 通過(guò)hibernate.xfg.xml文件中的mapping節(jié)點(diǎn)配置,加載hbm.xml文件至該實(shí)例內(nèi)存利用上面創(chuàng)建的Configuration實(shí)例構(gòu)建一個(gè)SessionFactory實(shí)例 SessionFactory sf = cfg.buildSessionFactory(); 由上面得到的SessionFactory實(shí)例創(chuàng)建連接 Session s = sf.openSession(); 由上面得到的Session實(shí)例創(chuàng)建事務(wù)操作接口Transact

11、ion的一個(gè)實(shí)例tx Transaction tx = s.beginTransaction(); 通過(guò)Session接口提供的各種方法操作數(shù)據(jù)庫(kù)的訪問(wèn) 提交數(shù)據(jù)庫(kù)的操作結(jié)果 mit(); 關(guān)閉Session鏈接 s.close(); 十二、Hibernate工作原理開始啟動(dòng)hibernate構(gòu)建configuration實(shí)例,初始化該實(shí)例中的所有變量加載hibernate.cfg.xml文件至該實(shí)例(內(nèi)存)通過(guò)hibernate.cfg.xml文件中的mapping節(jié)點(diǎn)配置加載*.hbm.xml至該實(shí)例(內(nèi)存)利用configuration實(shí)例創(chuàng)建一個(gè)工廠類SessionFactory實(shí)例S

12、essionFactory類創(chuàng)建連接SessionFactory實(shí)例創(chuàng)建事務(wù)接口通過(guò)session接口提供的各種方法操縱數(shù)據(jù)庫(kù)提交數(shù)據(jù)庫(kù)事務(wù)關(guān)閉session十二、Hibernate工作原理十三、十三、Hibernate開發(fā)步驟開發(fā)步驟一、持久化類的設(shè)計(jì)一、持久化類的設(shè)計(jì)二、持久化類和關(guān)系數(shù)據(jù)庫(kù)二、持久化類和關(guān)系數(shù)據(jù)庫(kù)的映射的映射三、應(yīng)用的開發(fā)三、應(yīng)用的開發(fā)十四、持久化十四、持久化Java類必須遵循的原則類必須遵循的原則1、為類的持久化類字段申明訪問(wèn)方法(get/set)。Hibernate對(duì)JavaBeans風(fēng)格的屬性實(shí)行持久化。2、實(shí)現(xiàn)一個(gè)默認(rèn)的構(gòu)造方法(constructor)。這樣的話

13、Hibernate就可以使用Constructor.newInstance()來(lái)實(shí)例化它們。3、如果是集合類型的屬性,它的類型必須定義為集合的接口。例如:List、Set。4、提供一個(gè)標(biāo)識(shí)屬性(identifier property)。如果沒(méi)有該屬性,一些功能不起作用,比如:級(jí)聯(lián)更新(Cascaded updates)Session.saveOrUpdate()。一、建立數(shù)據(jù)庫(kù)和表數(shù)據(jù)庫(kù)名main表名和結(jié)構(gòu)如下:表名:stuInt id;varchar xm;varchar sex; Date sr;十五、Hibernate簡(jiǎn)單實(shí)例二、導(dǎo)入hibernate包 導(dǎo)入數(shù)據(jù)庫(kù)包十五、十五、Hibe

14、rnate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例十五、十五、Hibernate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例三、建立持久化類package ;import java.util.Date;public class Stu private Integer id;private String xm;private String sex;private Date sr;public Integer getId() return id;public void setId(Integer id) this.id = id;public String getXm() return xm;public void setXm(String xm)

15、 this.xm = xm;public String getSex() return sex;public void setSex(String sex) this.sex = sex;public Date getSr() return sr;public void setSr(Date sr) this.sr = sr;十五、十五、Hibernate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例四、建立持久化類映射文件*.hbm.xml如 Stu.hbm.xml 五、在SRC目錄下配置 hibernate.cfg.xml文件十五、十五、Hibernate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例org.hibernate.dialect.My

16、SQLDialectjdbc:mysql:/localhost:3306/testrootrootcom.mysql.jdbc.Driversunli jdbc:mysql:/localhost:3306/main?useUnicode=true&characterEncoding=gbk亂碼的解決六、建立操作類 StuDao.javapackage ;import java.util.List;import org.hibernate.Hibernate;import org.hibernate.Query;import org.hibernate.Session;impor

17、t org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;public class StuDAO public void add(Stu u) Configuration cfg=new Configuration(); cfg.configure(); SessionFactory sf=cfg.buildSessionFactory(); Session s=sf.openSession(); Transaction tx=s.beginTra

18、nsaction(); s.save(u); mit(); 十五、十五、Hibernate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例七、調(diào)用實(shí)例化類操作數(shù)據(jù)庫(kù) % SimpleDateFormat sd=new SimpleDateFormat(yyyy-mm-dd); StuDAO d=new StuDAO(); Stu s=new Stu(); s.setId(new Integer(1005); s.setSex(t); s.setSr(sd.parse(1981-01-01); s.setXm(sunli); d.add(s);十五、十五、Hibernate簡(jiǎn)單實(shí)例簡(jiǎn)單實(shí)例十六、十六、Hibernate核心接口

19、核心接口十六、十六、Hibernate核心接口核心接口1. Configuration接口Configuration負(fù)責(zé)管理Hibernate的配置信息。Hibernate運(yùn)行時(shí)需要一些底層實(shí)現(xiàn)的基本信息。運(yùn)行時(shí)需要一些底層實(shí)現(xiàn)的基本信息。這些信息包括:這些信息包括:數(shù)據(jù)庫(kù)URL、數(shù)據(jù)庫(kù)用戶名、數(shù)據(jù)庫(kù)用戶密碼、數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng)類、數(shù)據(jù)庫(kù)dialect。用于對(duì)特定數(shù)據(jù)庫(kù)提供支持,其中包含了。用于對(duì)特定數(shù)據(jù)庫(kù)提供支持,其中包含了針對(duì)特定數(shù)據(jù)庫(kù)特性的實(shí)現(xiàn),如針對(duì)特定數(shù)據(jù)庫(kù)特性的實(shí)現(xiàn),如Hibernate數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)類型到特定數(shù)據(jù)庫(kù)數(shù)據(jù)類型的映射等。類型到特定數(shù)據(jù)庫(kù)數(shù)據(jù)類型的映射等。n使用Hiber

20、nate必須首先提供這些基礎(chǔ)信息以完成初始化工作,為后續(xù)操作做好準(zhǔn)備。n這些屬性在Hibernate配置文件hibernate.cfg.xml中加以設(shè)定,當(dāng)調(diào)用:Configuration config=new Configuration().configure();時(shí),Hibernate會(huì)自動(dòng)在目錄下搜索hibernate.cfg.xml文件,并將其讀取到內(nèi)存中作為后續(xù)操作的基礎(chǔ)配置。十六、十六、Hibernate核心接口核心接口2. SessionFactory接口SessionFactory負(fù)責(zé)創(chuàng)建負(fù)責(zé)創(chuàng)建Session實(shí)例,可以通過(guò)實(shí)例,可以通過(guò)Configuration實(shí)例構(gòu)建實(shí)例構(gòu)

21、建SessionFactory。Configuration實(shí)例實(shí)例config會(huì)根據(jù)當(dāng)前的數(shù)據(jù)庫(kù)配置信息,構(gòu)造會(huì)根據(jù)當(dāng)前的數(shù)據(jù)庫(kù)配置信息,構(gòu)造SessionFacory實(shí)例并返回。實(shí)例并返回。SessionFactory一旦構(gòu)造完畢,即一旦構(gòu)造完畢,即被賦予特定的配置信息。也就是說(shuō),之后被賦予特定的配置信息。也就是說(shuō),之后config的任何變更的任何變更將不會(huì)影響到已經(jīng)創(chuàng)建的將不會(huì)影響到已經(jīng)創(chuàng)建的SessionFactory實(shí)例實(shí)例sessionFactory。如果需要使用基于變更后的如果需要使用基于變更后的config實(shí)例的實(shí)例的SessionFactory,需,需要從要從config重新構(gòu)

22、建一個(gè)重新構(gòu)建一個(gè)SessionFactory實(shí)例。實(shí)例。nSessionFactory保存了對(duì)應(yīng)當(dāng)前數(shù)據(jù)庫(kù)配置的所有映射關(guān)系,同時(shí)也保存了對(duì)應(yīng)當(dāng)前數(shù)據(jù)庫(kù)配置的所有映射關(guān)系,同時(shí)也負(fù)責(zé)維護(hù)當(dāng)前的二級(jí)數(shù)據(jù)緩存和負(fù)責(zé)維護(hù)當(dāng)前的二級(jí)數(shù)據(jù)緩存和Statement Pool。由此可見(jiàn),。由此可見(jiàn),SessionFactory的創(chuàng)建過(guò)程非常復(fù)雜、代價(jià)高昂的創(chuàng)建過(guò)程非常復(fù)雜、代價(jià)高昂。這也意味著,在系。這也意味著,在系統(tǒng)設(shè)計(jì)中充分考慮到統(tǒng)設(shè)計(jì)中充分考慮到SessionFactory的的重用策略重用策略。由于。由于SessionFactory采用了線程安全的設(shè)計(jì),可由多個(gè)線程并發(fā)調(diào)用。采用了線程安全的設(shè)計(jì),可

23、由多個(gè)線程并發(fā)調(diào)用。Configuration config=new Configuration().configure();SessionFactory sessionFactory=config.buildSessionFactory();十六、十六、Hibernate核心接口核心接口3. Session接口Session是是Hibernate持久化操作的基礎(chǔ),提供了眾持久化操作的基礎(chǔ),提供了眾多持久化方法,如多持久化方法,如save、update、delete等。通等。通過(guò)這些方法,透明地完成對(duì)象的增加、刪除、過(guò)這些方法,透明地完成對(duì)象的增加、刪除、修改、查找等操作。修改、查找等操作。同

24、時(shí),值得注意的是,同時(shí),值得注意的是,Hibernate Session的設(shè)計(jì)是的設(shè)計(jì)是非線程安全的,即一個(gè)非線程安全的,即一個(gè)Session實(shí)例同時(shí)只可由實(shí)例同時(shí)只可由一個(gè)線程使用。一個(gè)線程使用。同一個(gè)同一個(gè)Session實(shí)例的多線程并實(shí)例的多線程并發(fā)調(diào)用發(fā)調(diào)用將導(dǎo)致難以預(yù)知的錯(cuò)誤。將導(dǎo)致難以預(yù)知的錯(cuò)誤。Session實(shí)例由實(shí)例由SessionFactory構(gòu)建:構(gòu)建:Configuration config=new Configuration().configure();SessionFactory sessionFactory=config.buldSessionFactory();Se

25、ssion session=sessionFactory.openSession();十六、十六、Hibernate核心接口核心接口4. Transaction接口Transaction是是Hibernate中進(jìn)行事務(wù)操作的接口中進(jìn)行事務(wù)操作的接口,Transaction 接口是對(duì)實(shí)際事務(wù)實(shí)現(xiàn)的一個(gè)抽象,接口是對(duì)實(shí)際事務(wù)實(shí)現(xiàn)的一個(gè)抽象,這些實(shí)現(xiàn)包括這些實(shí)現(xiàn)包括JDBC的事務(wù)、的事務(wù)、JTA 中的中的UserTransaction,甚至可以是,甚至可以是CORBA 事務(wù)。事務(wù)。之所以這樣設(shè)計(jì)是可以讓開發(fā)者能夠使用一個(gè)之所以這樣設(shè)計(jì)是可以讓開發(fā)者能夠使用一個(gè)統(tǒng)一的操作界面,使得自己的項(xiàng)目可以在不同

26、統(tǒng)一的操作界面,使得自己的項(xiàng)目可以在不同的環(huán)境和容器之間方便地移值。事務(wù)對(duì)象通過(guò)的環(huán)境和容器之間方便地移值。事務(wù)對(duì)象通過(guò)Session創(chuàng)建。例如以下語(yǔ)句:創(chuàng)建。例如以下語(yǔ)句:Transaction ts=session.beginTransaction();mit();十六、十六、Hibernate核心接口核心接口5. Query接口例如以下語(yǔ)句:例如以下語(yǔ)句:在后面設(shè)置其值:在后面設(shè)置其值:上面的方法是通過(guò)上面的方法是通過(guò)“?”來(lái)設(shè)置參數(shù),還可以用來(lái)設(shè)置參數(shù),還可以用“:”后跟變量的方法來(lái)設(shè)置后跟變量的方法來(lái)設(shè)置參數(shù),如上例可以改為:參數(shù),如上例可以改為:或者:或者:Query還有一個(gè)還有一

27、個(gè)list()方法,用于取得一個(gè)方法,用于取得一個(gè)List集合的示例,此示例中包括可能集合的示例,此示例中包括可能是一個(gè)是一個(gè)Object集合,也可能是集合,也可能是Object數(shù)組集合。例如:數(shù)組集合。例如:Query query=session.createQuery(“from Kcb where kch=100”);Query query=session.createQuery(from Kcb where kch=?);query.setString(0, 要設(shè)置的值);Query query=session.createQuery(from Kcb where kch=:kchVa

28、lue);query.setString(kchValue,要設(shè)置的課程號(hào)值);query.setParameter(0, 要設(shè)置的值);Query query=session.createQuery(from Kcb where kch=198);List list=query.list();十七、Configuration配置 概述:概述:Configuration 類負(fù)責(zé)管理Hibernate 的配置信息。它包括如下內(nèi)容:Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的URL、用戶名、密碼、JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫(kù)Dialect,數(shù)據(jù)庫(kù)連接池等。Hibernate映射文件(*.cfg.xml)。

29、Hibernate配置的兩種方法:配置的兩種方法:屬性文件(perties)。調(diào)用代碼:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)。調(diào)用代碼:Configuration cfg = new Configuration().configure();Configuration接口配置文件hibernate.cfg.xml 常用參數(shù)數(shù)據(jù)庫(kù)連接的配置數(shù)據(jù)庫(kù)連接的配置hibernate.dialect org.hibernate.dialect.MySQLDialecthibernate.c

30、onnection.driver_class com.mysql.jdbc.Driverhibernate.connection.url jdbc:mysql:/localhost/hibernatehibernate.connection.username roothibernate.connection.password roothibernate.show_sql truehibernate.jdbc.fetch_size 50設(shè)定設(shè)定JDBC的的Statement讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù)讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù) hibernate.jdbc.batc

31、h_size 25是設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小,有點(diǎn)相當(dāng)于設(shè)置Buffer緩沖區(qū)大小的意思。Batch Size越大,批量操作的向數(shù)據(jù)庫(kù)發(fā)送sql的次數(shù)越少,速度就越快。我做的一個(gè)測(cè)試結(jié)果是當(dāng)Batch Size=0的時(shí)候,使用Hibernate對(duì)Oracle數(shù)據(jù)庫(kù)刪除1萬(wàn)條記錄需要25秒,Batch Size = 50的時(shí)候,刪除僅僅需要5秒!hibernate.cfg.xmltrueorg.hibernate.dialect.MySQLDialectcom.mysql.jdbc.Driverjdbc:mysql:/localhost/hibernatero

32、otroot 十八、十八、SessionFactory概述:概述:應(yīng)用程序從SessionFactory(會(huì)話工廠)里獲得Session(會(huì)話)實(shí)例。它在多個(gè)應(yīng)用線程間進(jìn)行共享。通常情況下,整個(gè)應(yīng)用只有唯一的一個(gè)會(huì)話工廠例如在應(yīng)用初始化時(shí)被創(chuàng)建。然而,如果你使用Hibernate訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),你需要對(duì)每一個(gè)數(shù)據(jù)庫(kù)使用一個(gè)會(huì)話工廠。 會(huì)話工廠緩存了生成的SQL語(yǔ)句和Hibernate在運(yùn)行時(shí)使用的映射元數(shù)據(jù)。調(diào)用代碼:調(diào)用代碼:SessionFactory sessionFactory = cfg.buildSessionFactory();十九、十九、Session(會(huì)話會(huì)話)概述:概述:S

33、ession不是線程安全的,它代表與數(shù)據(jù)庫(kù)之間的一次操作,它的概念介于Connection和Transaction之間。 Session也稱為持久化管理器,因?yàn)樗桥c持久化有關(guān)的操作接口。 Session通過(guò)SessionFactory打開,在所有的工作完成后,需要關(guān)閉。它與Web層的HttpSession沒(méi)有任何關(guān)系。調(diào)用代碼調(diào)用代碼Session session = sessionFactory.openSession();保存用戶:session.save(Person);查詢用戶:load(Class theClass, Serializable id ) get(Class theC

34、lass, Serializable id )修改用戶:session.update(Person);保存或修改用戶:session.saveOrUpdate(Person);刪除用戶:session.delete(Person);刪除所有用戶:session.delete(“from Person ”);二十、二十、Transaction(事務(wù)事務(wù))概述:概述: 它將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來(lái)這可能是一個(gè)JDBC事務(wù),一個(gè)JTA用戶事務(wù)或者甚至是一個(gè)公共對(duì)象請(qǐng)求代理結(jié)構(gòu)(CORBA)允許應(yīng)用通過(guò)一組一致的API控制事務(wù)邊界。這有助于保持Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器

35、中的可移植性。調(diào)用代碼:調(diào)用代碼: Transaction tx = session.beginTransaction();注:注:使用Hibernate進(jìn)行操作時(shí)(增、刪、改)必須顯示的調(diào)用Transaction(默認(rèn):autoCommit=false)。項(xiàng)目步驟1、建立web項(xiàng)目2、導(dǎo)入數(shù)據(jù)庫(kù)包和hibernate包3、編寫持久化類4、編寫持久化類的映射文件5、編寫 hibernate.cfg.xml數(shù)據(jù)庫(kù)配置文件6、編寫操作類接口7、編寫工具類8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口9、頁(yè)面中調(diào)用實(shí)現(xiàn)類二十一、綜合舉例6、編寫操作類接口StuDAO.javapackage ;import java.

36、util.List;public interface StuDAO public void saveUser(Stu user);public Stu findUserByName(String name);public Stu findUserById(Integer id);public void updateUser(Stu user);public void remove(Stu user);public List findall();二十一、綜合舉例7、編寫工具類 HibernateUitl.javapackage ;import org.hibernate.Session;impo

37、rt org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public final class HibernateUitl private static SessionFactory sessionFactory;private HibernateUitl() static /static語(yǔ)句塊類加載時(shí)僅被執(zhí)行一次Configuration cfg = new Configuration();cfg.configure();sessionFactory = cfg.buildSessionFactory();p

38、ublic static SessionFactory getSessionFactory() return sessionFactory;public static Session getSession() return sessionFactory.openSession();二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapackage ;import java.util.List;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.Session;impor

39、t org.hibernate.Transaction;import org.hibernate.criterion.Restrictions;二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic class StuDAOimpl implements StuDAO public Stu findUserById(Integer id) Session s = null;try s = HibernateUitl.getSession();Stu user =(Stu)s.get(Stu.class, id);return user; finally if (

40、s != null)s.close();二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic Stu findUserByName(String name) Session s = null;try s = HibernateUitl.getSession();Criteria c = s.createCriteria(Stu.class);c.add(Restrictions.eq(xm, name);Stu user =(Stu) c.uniqueResult();return user; finally if (s != null)s.close();二

41、十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic Stu findUserByName1(String name) Session s = null;try s = HibernateUitl.getSession();String hql = from Stu as u where u.xm=:n;Query q = s.createQuery(hql);q.setString(n, name);Stu user = (Stu) q.uniqueResult();return user; finally if (s != null)s.close();二十

42、一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic void remove(Stu user) Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransaction();s.delete(user);mit(); finally if (s != null)s.close();二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic void saveUser(Stu user) Session s = nu

43、ll;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransaction();s.save(user);mit(); finally if (s != null)s.close();二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic void updateUser(Stu user) Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();tx = s.beginTransa

44、ction();s.update(user);mit(); finally if (s != null)s.close();二十一、綜合舉例8、編寫實(shí)現(xiàn)類實(shí)現(xiàn)操作類接口StuDAOimpl.javapublic List findall()Session s = null;Transaction tx = null;try s = HibernateUitl.getSession();String queryString = from Stu;Query query = s.createQuery(queryString);return query.list(); finally if (s

45、!= null)s.close();二十一、綜合舉例9、頁(yè)面中調(diào)用實(shí)現(xiàn)類 insert.jsp二十一、綜合舉例9、頁(yè)面中調(diào)用實(shí)現(xiàn)類 findall.jsp% StuDAOimpl d=new StuDAOimpl(); List l=null; l=d.findall(); for(int i=0;il.size();i+) Stu s=(Stu)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(); %二十一、綜合舉例9、頁(yè)面中調(diào)用

46、實(shí)現(xiàn)類 findbyid.htm 請(qǐng)輸入你要查找學(xué)生的學(xué)號(hào) 二十一、綜合舉例9、頁(yè)面中調(diào)用實(shí)現(xiàn)類 findbyid.jsp 二十一、綜合舉例9、頁(yè)面中修改記錄update1.jsp(步驟一)% StuDAOimpl d=new StuDAOimpl(); List l=null; l=d.findall(); for(int i=0;il.size();i+) Stu s=(Stu)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(修

47、改修改);out.print(); %二十一、綜合舉例9、頁(yè)面中修改記錄update2.jsp(步驟二)二十一、綜合舉例 學(xué)號(hào):input type=text name=userid value= readonly/ 姓名:input type=text name=username value=/ 性別:input type=text name=usersex value=/ 學(xué)號(hào):input type=text name=usersr value=/ 9、頁(yè)面中修改記錄update3.jsp(步驟三) 二十一、綜合舉例二十二、緩存 緩存的作用主要用來(lái)提高性能,可以簡(jiǎn)單的理解成一個(gè)Map;使用

48、緩存涉及到三個(gè)操作:把數(shù)據(jù)放入緩存、從緩存中獲取數(shù)據(jù)、刪除緩存中的無(wú)效數(shù)據(jù)。 一級(jí)緩存,Session級(jí)共享save,update,saveOrUpdate,load,get,list,iterate,lock這些方法都會(huì)將對(duì)象放在一級(jí)緩存中,一級(jí)緩存不能控制緩存的數(shù)量,所以要注意大批量操作數(shù)據(jù)時(shí)可能造成內(nèi)存溢出;可以用evict,clear方法清除緩存中的內(nèi)容。 二級(jí)緩存,SessionFactory級(jí)共享 實(shí)現(xiàn)為可插拔,可以通過(guò)實(shí)現(xiàn)CacheProvider和Cache接口來(lái)加入Hibernate不支持的緩存實(shí)現(xiàn)。二十二、緩存二十二、緩存 使用EhCache配置二級(jí)緩存 1、加入ehcac

49、he-1.2.3.jar(已在hibernate包中)到當(dāng)前項(xiàng)目的lib下。 2、在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類。 3、拷貝Hibernate安裝目錄的etc下ehcache.xml文件到src目錄中。true *指定二級(jí)緩存產(chǎn)品的提供商; org.hibernate.cache.ehcacheprovider 二十三、二十三、Hibernate中對(duì)象的狀態(tài)中對(duì)象的狀態(tài)瞬時(shí)對(duì)象瞬時(shí)對(duì)象(Transient Objects)(臨時(shí)狀態(tài)臨時(shí)狀態(tài)):使用new 操作符初始化的對(duì)象不是立刻就持久的。它們的狀態(tài)是瞬時(shí)的,也就是說(shuō)它們沒(méi)有任何跟數(shù)據(jù)庫(kù)表相關(guān)聯(lián)的

50、行為,只要應(yīng)用不再引用這些對(duì)象(不再被任何其它對(duì)象所引用),它們的狀態(tài)將會(huì)丟失,并由垃圾回收機(jī)制回收。 持久對(duì)象持久對(duì)象(Persist Objects):持久實(shí)例是任何具有數(shù)據(jù)庫(kù)標(biāo)識(shí)的實(shí)例。它由持久化管理器Session統(tǒng)一管理,持久實(shí)例是在事務(wù)中進(jìn)行操作的它們的狀態(tài)在事務(wù)結(jié)束時(shí)會(huì)和數(shù)據(jù)庫(kù)進(jìn)行同步。當(dāng)事務(wù)提交時(shí),通過(guò)執(zhí)行SQL的INSERT、UPDATE和DELETE語(yǔ)句把內(nèi)存中的狀態(tài)同步到數(shù)據(jù)庫(kù)中。離線對(duì)象離線對(duì)象(Detached Objects) (脫管狀態(tài)脫管狀態(tài)):Session關(guān)閉之后,持久化對(duì)象就變?yōu)殡x線對(duì)象。離線表示這個(gè)對(duì)象不能再與數(shù)據(jù)庫(kù)保持同步,它們不再受Hibernate

51、管理。實(shí)例的狀態(tài)一個(gè)持久化類的實(shí)例可能處于三種不同狀態(tài)中的某一種。這三種狀態(tài)的定義則與所謂的持久化上下文(persistence context)有關(guān)。Hibernate的Session對(duì)象就是這個(gè)所謂的持久化上下文:臨時(shí)狀態(tài): 不曾進(jìn)行持久化,未與任何Session相關(guān)聯(lián)持久化狀態(tài): 僅與一個(gè)Session相關(guān)聯(lián)游離狀態(tài): 已經(jīng)進(jìn)行過(guò)持久化,但當(dāng)前未與任何Session相關(guān)聯(lián)二十四、二十四、Hibernate查詢查詢概述:概述:數(shù)據(jù)查詢與檢索是Hibernate中的一個(gè)亮點(diǎn)。相對(duì)其他ORM實(shí)現(xiàn)而言,Hibernate提供了靈活多樣的查詢機(jī)制。面向?qū)ο蟮牟樵冋Z(yǔ)言,與SQL不同,HQL中的對(duì)象名

52、是區(qū)分大小寫的(除了JAVA類和屬性其他部分不區(qū)分大小寫);HQL中查的是對(duì)象而不是和表,并且支持多態(tài);HQL主要通過(guò)Query來(lái)操作,Query的創(chuàng)建方式:Query q = session.createQuery(hql);nfrom Personnfrom User user where =:namenfrom User user where =:name and user.birthday :birthday Criteria是一種比HQL更面向?qū)ο蟮牟樵兎绞剑籆riteria的創(chuàng)建方式:Criteria crit = session.createC

53、riteria(DomainClass.class);簡(jiǎn)單屬性條件如:criteria.add(Restrictions.eq(propertyName, value),criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName)HQL是Hibernate Query Language的縮寫,HQL的語(yǔ)法很像SQL的語(yǔ)法,但HQL是一種面向?qū)ο蟮牟樵冋Z(yǔ)言。因此,SQL的操作對(duì)象是數(shù)據(jù)表和列等數(shù)據(jù)對(duì)象,而HQL的操作對(duì)象是類、實(shí)例、屬性等。24.1.1 HQL基礎(chǔ)HQL 查詢依賴于Query類,每個(gè)Query 實(shí)例對(duì)應(yīng)一

54、個(gè)查詢對(duì)象。使用HQL 查詢可按如下步驟進(jìn)行:(1)獲取HibernateSession對(duì)象;(2)編寫HQL語(yǔ)句;(3)以HQL語(yǔ)句作為參數(shù),調(diào)用Session的createQuery方法創(chuàng)建查詢對(duì)象;(4)如果HQL語(yǔ)句包含參數(shù),調(diào)用Query 的setXxx方法為參數(shù)賦值;(5)調(diào)用Query對(duì)象的list等方法遍歷查詢結(jié)果。用from子句指定數(shù)據(jù)表from子句是最簡(jiǎn)單的HQL語(yǔ)句,也是最基本的HQL語(yǔ)句。from關(guān)鍵字后緊跟持久化類的類名。例如:from Person表明從Person 持久化類中選出全部的實(shí)例。大部分時(shí)候,推薦為該P(yáng)erson的每個(gè)實(shí)例起別名。例如: HQL: fro

55、m Person as p SQL : Select * from Person as p24.1.2 HQL查詢Query接口Query(查詢)接口允許你在數(shù)據(jù)庫(kù)上執(zhí)行查詢并控制查詢?nèi)绾螆?zhí)行。查詢語(yǔ)句使用HQL或者本地?cái)?shù)據(jù)庫(kù)的SQL方言編寫。調(diào)用代碼:調(diào)用代碼:Query query = session.createQuery(“from Person”); 查詢用戶名為“ff”的用戶:Query query = session.createQuery(from Person as person where = :ff);query.setParameter(“ff,

56、person.getName(); Person p = (Person) query.list().get(0);1.3.1 Query用兩個(gè)方法進(jìn)行查詢結(jié)果遍歷(1)Iterate() (2)list()1.3.2 Iterate與list的區(qū)別1、返回的類型不一樣,list()返回List, iterate()返回Iterator。2、 獲取數(shù)據(jù)的方式不一樣,list()會(huì)直接查數(shù)據(jù)庫(kù), iterate()會(huì)先到數(shù)據(jù)庫(kù)中把id都取出來(lái),然后真正要遍歷某個(gè)對(duì)象的時(shí)候先到緩存中找,如果找不到,以id為條件再發(fā)一條sql到數(shù)據(jù)庫(kù),這樣如果緩存中沒(méi)有數(shù)據(jù),則查詢數(shù)據(jù)庫(kù)的次數(shù)為n+1。3、iter

57、ate會(huì)查詢級(jí)緩存,list只會(huì)查詢一級(jí)緩存。4、list()中返回的List中每個(gè)對(duì)象都是原本的對(duì)象, iterate()中返回的對(duì)象是代理對(duì)象24.1.3 Query查詢結(jié)果遍歷查詢結(jié)果遍歷Session session = sessionFactory.openSession();Query query = session.createQuery(from User);Iterator users = query.iterate(); while(users.hasNext() User s = (User)itr.next(); out.print(s.getId(); out.pri

58、nt(s.getXm(); out.print(s.getSex(); out.print(s.getSr(); out.print(); Iterate方式List方式 Session session = sessionFactory.openSession(); Query query = session.createQuery(from User);List l = query.list();for(int i=0;iusers.size();i+) User s=(User)(l.get(i); out.print(s.getId(); out.print(s.getXm(); out

59、.print(s.getSex(); out.print(s.getSr(); out.print(); 24.1.4 用Query接口簡(jiǎn)單分頁(yè) 如果需要指定結(jié)果集的范圍(希望返回的最大行數(shù)/或開始的行數(shù)),應(yīng)該使用Query接口提供的方法:Query q = sess.createQuery(from Person person);q.setFirstResult(1);q.setMaxResults(10);List persons = q.list();24.1.5 用where子句添加查詢條件where子句用于篩選選中的結(jié)果,縮小選擇的范圍。如果沒(méi)有為持久化實(shí)例命名別名,可以直接使用屬

60、性名引用屬性。如下面的HQL查詢語(yǔ)句:from Person where name like tom%from Person where name like _tom 如果為持久化實(shí)例命名了別名,則應(yīng)該使用完整的屬性名。from Person as p where like tom%復(fù)合屬性表達(dá)式加強(qiáng)了where子句的功能,例如如下HQL查詢語(yǔ)句:from Person p where p.address.country like us%模糊查詢:模糊查詢:查詢用戶名以“李”開頭的所有用戶。Query query = session.createQuery(from Person as

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論