版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第一講:hibernate是什么?1、 它是一個(gè)框架2、 是一個(gè)orm框架(其它的apache ojb,ibatis,toplink)a) orm(object relation mapping)對(duì)象關(guān)系映射框架b) o object->業(yè)務(wù)層c) r relation->關(guān)系數(shù)據(jù)庫(kù)d) m mapping->對(duì)象關(guān)系映射文件3、 處于我們項(xiàng)目的持久層位置4、 對(duì)jdbc的輕量級(jí)封裝 hibernate的原理:1、 相當(dāng)于是一個(gè)翻譯,業(yè)務(wù)邏輯層->持久層->數(shù)據(jù)庫(kù),所以業(yè)務(wù)邏輯層就不用關(guān)心用的是什么數(shù)據(jù)庫(kù),而直接和持久層打交道,持久層將從業(yè)務(wù)邏輯層得到的語(yǔ)句(并進(jìn)
2、行一系列優(yōu)化)翻譯成數(shù)據(jù)庫(kù)的語(yǔ)句,實(shí)現(xiàn)一些功能。這樣當(dāng)數(shù)據(jù)庫(kù)變更時(shí),我們就不用改動(dòng)業(yè)務(wù)邏輯的一些sql語(yǔ)句。2、 每一層的耦合性減小,業(yè)務(wù)層和數(shù)據(jù)庫(kù)層沒(méi)有關(guān)系,可以達(dá)到輕松改變3、 hibernate可以用在j2se中4、 struts是web框架為什么有hibernate:以前我們換數(shù)據(jù)庫(kù)需要重寫sql語(yǔ)句,和一些其它的語(yǔ)句,麻煩,第二講:1、 開發(fā)時(shí)一般先開發(fā)db,在用工具生成mapping和domain2、 domain對(duì)象的名稱 首字母要大寫3、 pojo (plain ordinary java object) 簡(jiǎn)單的java對(duì)象和一張表對(duì)應(yīng)(應(yīng)該有一個(gè)鍵屬 性,有g(shù)et,set方法
3、,有一個(gè)無(wú)參的構(gòu)造函數(shù))4、 對(duì)象關(guān)系映射文件:作用是用于指定domain對(duì)象和表的映射關(guān)系,取名:domain對(duì)象。hbm.xml。一般我們放在和domain對(duì)象同一個(gè)文件夾下(一個(gè)包下)5、 創(chuàng)建一個(gè)sequence i. create sequence emp_seq start with 1 increment by 1 minvalue 1 nomaxvalue nocyclenocache 6、 <hibernate-mapping> <class name="employee" table="employee" >
4、<id name="id" column="id" type="java.lang.integer"> <!- 該元素用于指定主健值生成策略hilo native increment sequence uuid -> <generator class="sequence"> <!- 指定是哪一個(gè)sequence -> <paramname="sequence"> emp_seq </param> </generator
5、> </id> <!- 定義的屬性 -> <property name="name" type="java.lang.string"> <column name="name" not-null="false"></column> </property> <property name="email" type="java.lang.string"> <column name=&quo
6、t;email" not-null="false"></column> </property> <property name="hiredate" type="java.util.date"> <column name="hiredate" not-null="false"></column> </property> </class></hibernate-mapping>7、 創(chuàng)建h
7、ibernate.cfg.xml并且配置<hibernate-configuration><session-factory><property name="connection.driver_class">oracle.jdbc.driver.oracledriver</property><property name="connection.username">scott</property><property name="connection.password&qu
8、ot;>tiger</property> <property name="connection.utl">jdbc:oracle:thin:localhost:1521:orcl</property><!- 明確告訴hibernate連接的是哪類數(shù)據(jù)庫(kù) -><property name="dialect">org.hibernate.dialect.oracledialect</property><!- 用于加載映射文件 -><mapping resource
9、="com/yxl/domain/employee.hbm.xml"/></session-factory></hibernate-configuration>8、 運(yùn)用hibernatea) 創(chuàng)建cfg對(duì)象,用于讀取hibernate.cfg.xml的內(nèi)容i. configuration cfg = new configuration.configure();b) 創(chuàng)建sessionfactory這是一個(gè)會(huì)話工廠,是一個(gè)重量級(jí)的對(duì)象i. sessionfactory sf = configuration.buildsessionfactory
10、();c) 創(chuàng)建session 相當(dāng)于jdbci. session session = sf.opensession();d) 創(chuàng)建transactioni. transaction transaction = session.();第四講:一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)sessionfactory,它是單例的pojo應(yīng)該序列化,目的是唯一標(biāo)識(shí)該對(duì)象,同時(shí)可以在網(wǎng)絡(luò)上傳輸hibernate 把對(duì)象分成三個(gè)狀態(tài):瞬時(shí)態(tài),持久態(tài),第五講:<property name="show_sql">true</property>這是打印sql語(yǔ)句<property na
11、me="hbm2ddl.auto">create</property> 這是自動(dòng)創(chuàng)建表的配置(如果有表則刪除后重新創(chuàng)建一個(gè)表),也可以有update 這是更新表(如果以前的表沒(méi)有改變結(jié)構(gòu),則更新值,如果沒(méi)有表則創(chuàng)建)mysql中沒(méi)有sequence 用increment代替第六講:編程格式:try .tmit(); catch(exception e) e.printstacktrace();if(transaction!=null) transation.rollback(); finallyif(session!=null&&sessi
12、on.isopen() session.close();如果要自己定義主鍵號(hào),則hbm.xml中的generator的策略用assigned第七講:當(dāng)configuration.configure(confignume) 這里的confignume有包名的話要 寫"com/yxl/config/hibernate.cfg.xml"1、 configuration 類 a:讀取hibernate.cfg.xml b:管理對(duì)象關(guān)系映射文件 c:加載hibernamte的驅(qū)動(dòng),url,用戶 d:管理hibernate配置信息 注意事項(xiàng):當(dāng)配置時(shí)cfg.xml有包,則得把包名寫在c
13、onfigure方法里 2、.hbm.xml是一個(gè)表和對(duì)象的映射文件,一般和對(duì)象放在一個(gè)包下 第八講:1、 sessionfactory :會(huì)話工廠:是一個(gè)interface作用:a:可以緩存sql語(yǔ)句和數(shù)據(jù)(稱為session緩存) b:是一個(gè)重量級(jí)的類,比較吃內(nèi)存,所以一個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)一個(gè)sessionfac c:重點(diǎn): 用sessionfactory得到session的兩個(gè)方法:1. opensession():是獲取一個(gè)新的session();2. getcurrentsession() 獲取和當(dāng)前線程綁定的session,就是在同一個(gè)線程獲得的session是同一個(gè)。這樣可以得于事務(wù)的
14、控制,在用這個(gè)之前必須要在cfg.xml里配置current-session_context_class-> thread/jta 兩者的區(qū)別:thread 是本地事務(wù),只操作一個(gè)數(shù)據(jù)庫(kù) jta是全局事務(wù),操作兩者及以上的數(shù)據(jù)庫(kù),從工行轉(zhuǎn)錢農(nóng)行3. 通過(guò)getcurrentsession()獲取的session在事務(wù)提交后會(huì)自動(dòng)關(guān)閉,而opensession()必須手動(dòng)關(guān)閉4. getcurrentsession()必須是事務(wù)提交,不然報(bào)錯(cuò),而opensession()沒(méi)有事務(wù)不報(bào)錯(cuò),但不會(huì)提交5. 深入討論:a) 在sessionfactory啟動(dòng)的時(shí)候,hibernate會(huì)根據(jù)配置創(chuàng)
15、建相應(yīng)的currentsessioncontext,在getcurrentsession()被調(diào)用的時(shí)候,實(shí)際被執(zhí)行的方法是 currentsessioncontext.currentsession().在currentsession()執(zhí)行時(shí),如果當(dāng)前sessionfactory的sesson為空,currentsession會(huì)調(diào)用sessionfactory的 opensession.b) 線程局部模式:就是線程的一個(gè)變量相關(guān)聯(lián)threadlocal里面的兩個(gè)方法get().set();private static threadlocal<session> threadloca
16、l = new threadlocal<session>();public static session getcurrentsession() session session = threadlocal.get();if(session = null) session = sessionfactory.opensession();threadlocal.set(session);return session;這是getcurrentsession()方法的機(jī)制 d:一個(gè)請(qǐng)求只要不結(jié)束就看作一個(gè)線程,如果有幾個(gè)service想合成一 個(gè)transaction則用currentses
17、sion,如果是在一個(gè)service里的一個(gè) transaction則用opensession()也行 e:位置在j2ee中服務(wù)器如何確定你的session有沒(méi)有關(guān)閉: window netstat -an 3306/1521 linux netstat -anp top 2、 session a) session 一個(gè)實(shí)例代表與數(shù)據(jù)庫(kù)的一次操作b) session實(shí)例通過(guò)sessionfactory獲取,用完需要關(guān)閉c) session是線程不同步(不安全),因此要保證在同一線程中使用,可以用getcurrentsession();d) session可以看做是持久化管理器,它是與持久化操作
18、相關(guān)的接口e) get()/load()(面試經(jīng)常出現(xiàn)):i. get()當(dāng)數(shù)據(jù)不存在時(shí),返回值為空,load()不返回值ii. 如果有數(shù)據(jù),則get()時(shí)馬上就向db發(fā)出查詢請(qǐng)求;load返回的是代理對(duì)象,如果沒(méi)有使用查詢結(jié)果,那么就不會(huì)向db發(fā)出查詢請(qǐng)求,當(dāng)使用時(shí)才會(huì)去發(fā)出查詢請(qǐng)求。這個(gè)現(xiàn)象我們稱為懶加載(lazy)。通過(guò)修改配置文件 ,我們可以取消懶加載如果確定有對(duì)象就用load,如果不確定就用get查詢順序:get:先到session級(jí)緩存(一級(jí)緩存)->二級(jí)緩存(文 件和內(nèi)存之間)->馬上到db里查找, load:先到session級(jí)緩存(一級(jí)緩存)->二級(jí)緩存(文
19、 件和內(nèi)存之間)->返回代理對(duì)象,如果要用到查找的 對(duì)象, 就直接到db里查找,找出來(lái)后在把這個(gè)結(jié)果存 到二級(jí)緩存(需要配置才能用)hibernate緩存分幾級(jí)分二級(jí)有什么好處:通過(guò)這個(gè)緩存可以有效地減少訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù)query接口:完成查詢功能/得到query引用 ,這里的employee不是表名,而是domain的類名和屬性(可以是表的屬性,也可以是類的屬性query query = session.createquery("from employee where id=2");/通過(guò) list得到一個(gè)list對(duì)象list<employee> lis
20、t = query.list();第十四講:hibernate 一般要求主鍵穩(wěn)定,不會(huì)被修改.一般重新創(chuàng)建一個(gè)1.。取出全部屬性list<student> students = session.createquery("from student").list();通過(guò)查詢出來(lái)的對(duì)象,對(duì)其在找它的關(guān)系對(duì)象,session不能關(guān)閉如果查詢結(jié)果只有一條的,就用,object = session.createquery("from student where sid='09'") .uniqueresult();它查到一條就立即返回,
21、而list的話就不會(huì)取出部分屬性:list<object> lists = session.createquery("select sname,sage from student").list();如果select sage from student 這樣子語(yǔ)句,那么返回的是list<object> lists = session.createquery("select sage from student").list();如果被映射為對(duì)象后,用對(duì)象。屬性查找11號(hào)課程的最高成績(jī)select max(grade),min(grad
22、e) from course where course.id=11當(dāng)有g(shù)roup by 時(shí),查出的部分,不能帶其它非組函數(shù)的屬性實(shí)現(xiàn)分頁(yè),setfirstresult()設(shè)置第一數(shù)從哪開始 setmaxresults()設(shè)置一共顯示幾個(gè)數(shù)-=pagesize第十九講:session.createquery("from student where sage >:a1").setinteger("a1",2).list();session.createquery("from student where sage >?").se
23、tinteger(0,2).list();第二十講:1、 one-to-one :身份證-人2、 one-to-many:部門-員工3、 many-to-one:員工-部門4、 many-to-many:學(xué)生-老師(一般編程時(shí)會(huì)避免這樣的方式,我們會(huì)設(shè)置一個(gè)中間表即:兩個(gè)one-to-may or many-to-one,這樣程序好控制,不會(huì)出現(xiàn)冗余第二十講:cfg.xml中 <property value="hbm2ddl.auto">create</property>是自動(dòng)創(chuàng)建表,每次都會(huì)創(chuàng)建update如果數(shù)據(jù)庫(kù)中沒(méi)的表, 則創(chuàng)建,如果有表,則
24、看有沒(méi)有變化,如果有變化則更新,只更新數(shù)據(jù),不更新表的結(jié)構(gòu)create-drop 在sessionfactory存在時(shí)有表,sessionfactory顯示關(guān)閉時(shí)就關(guān)閉了validate;相當(dāng)于每次插入數(shù)據(jù)都會(huì)驗(yàn)證數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)和hbm文件的結(jié)構(gòu)一致在開發(fā)中一般配update,在發(fā)布后最好就不用配置了。domain對(duì)象細(xì)節(jié):1、 需要一個(gè)的構(gòu)造函數(shù)()2、 應(yīng)當(dāng)有一個(gè)無(wú)意義的id3、 給每個(gè)屬性提供get.set方法4、 每一個(gè)屬性都必須配置到對(duì)應(yīng)的配置文件(如果配置少了一個(gè),數(shù)據(jù)庫(kù)里對(duì)應(yīng)的就會(huì)少一個(gè),如果多一個(gè),就會(huì)報(bào)錯(cuò));5、 可以不用配第二十一講:對(duì)象狀態(tài):當(dāng)在瞬時(shí)太和脫管態(tài)時(shí)用use
25、r.set.()不會(huì)反映到數(shù)據(jù)庫(kù),而當(dāng)在持久層時(shí),user.set()屬性時(shí),對(duì)應(yīng)的數(shù)據(jù)庫(kù)的也會(huì)改變。上面有一些錯(cuò)誤,在持久狀態(tài)下,數(shù)據(jù)庫(kù)里還沒(méi)有數(shù)據(jù),要在commit()后,才會(huì)發(fā)insert into 語(yǔ)句,數(shù)據(jù)庫(kù)里才有數(shù)據(jù),這之前只是一直保存在session中。如果在持久態(tài)時(shí)session.delete(user),這時(shí)user從持久態(tài)變到瞬時(shí)態(tài)。第二十二講:多對(duì)一:<many-to-one name="department" column="dep_id" />name字段為那個(gè)屬性段,column為映射的表的外鍵字段。只要一張表有外
26、鍵,就要映射為一個(gè)對(duì)象,如果兩張表沒(méi)有關(guān)系第二十三講:當(dāng)對(duì)象a里有對(duì)象b,對(duì)象a到數(shù)據(jù)庫(kù)里load/get得到了對(duì)象,但只是得到的a的一般屬性,并沒(méi)有得到b,因?yàn)樗J(rèn)為你可能不用這個(gè)b,所以只能是當(dāng)用到b的時(shí)候在到數(shù)據(jù)庫(kù)里去取,這里用到了懶加載機(jī)制。所以要想查到b時(shí),就不能關(guān)掉session。懶加載的解決方案:1、 hibernaet.initialize(顯示初始化對(duì)象)student = (student)session.get(student.class, 2); hibernate.initialize(student.getdepartment();2、 在對(duì)象映射文件中加入lazy
27、 = "false"在有可能被返回代理對(duì)象的映射文件class屬性里設(shè)置lazy="false"3、 通過(guò)過(guò)濾器,opensessionview一對(duì)多:<set name="students"><key column="dep_id"></key><one-to-many class="student"/></set>一對(duì)多 與 多對(duì)一 :當(dāng)一對(duì)多時(shí),這個(gè)“多”的表里必定有一個(gè)外鍵,也就是它的類里有“一”的類,不過(guò)要拿到這個(gè)“一”的類里
28、的屬性,不能關(guān)掉session,因?yàn)樗菓屑虞d的。當(dāng)多對(duì)一時(shí),這個(gè)“一”的表里必定有一個(gè)主鍵(對(duì)應(yīng)“多”的外鍵),也就是它的類里有“多”的類的一個(gè)set集合,不過(guò)要拿到這個(gè)“多”的集合,也不能關(guān)掉session,因?yàn)樗彩菓屑虞d的。當(dāng)一對(duì)多添加數(shù)據(jù)時(shí):1、 先把“多”的幾個(gè)對(duì)象添加進(jìn)去,在添加“一”2、 直接在set映射文件里添加屬性:cascade="save-update"當(dāng)“一對(duì)多”與“多對(duì)一”添加數(shù)據(jù),只需要設(shè)置“一對(duì)多”與”多對(duì)一”添加的其中一種就行,設(shè)置兩個(gè)也沒(méi)有錯(cuò)。第二十四講:基于主鍵的一對(duì)一關(guān)系:a表里的主鍵對(duì)應(yīng)b表里的一個(gè)外鍵(這個(gè)外鍵也是b表的主鍵)。基
29、于外鍵的一對(duì)一:特殊的多對(duì)一關(guān)系。<many-to-one name="person" column="personid" unique="true">第二十五講:多對(duì)多:在實(shí)際應(yīng)用時(shí)應(yīng)該轉(zhuǎn)換成幾個(gè)多對(duì)一第二十六講:級(jí)聯(lián)操作:比如:當(dāng)我們把一個(gè)部門刪除的時(shí)候,里面的員工也自動(dòng)刪除<set name="set" cascade="delete"> <key column="cid"></key> <one-to-many c
30、lass="stucourse" /> </set>所有相關(guān)聯(lián)的都會(huì)被刪除,比如,student-stucourse-course,當(dāng)刪除course中的一個(gè)就會(huì)刪除到stucourse(只要有對(duì)應(yīng)的course)中的數(shù)據(jù),在刪除對(duì)應(yīng)的student中的數(shù)據(jù),不管這個(gè)學(xué)生有沒(méi)有選對(duì)應(yīng)的course,都要?jiǎng)h除,在又刪除student所對(duì)應(yīng)的一些課程,(所以只要是有關(guān)系的都刪除)當(dāng)cascade="save-update"時(shí),保存時(shí),就要用一對(duì)多的保存方式才有效,用多對(duì)一的保存方式,不能保存成功第二十八講:這個(gè)是user層接口的好處:第三十四講:懶加載:程序推遲訪問(wèn)數(shù)據(jù)庫(kù),當(dāng)要用到時(shí)才去訪問(wèn)數(shù)據(jù)庫(kù)第三十五講:為什么需要緩存:什么 操作會(huì)從一級(jí)緩存取數(shù)據(jù)get/load/list但是它會(huì)向一級(jí)緩存放數(shù)據(jù) 3) 、一級(jí)緩存不用配置就可以使用,但要注意清除,用session.evict(obj), session.clear(),前者只清除一個(gè)對(duì)象,后者清除所有session4) session緩存,當(dāng)session關(guān)閉時(shí)就自動(dòng)關(guān)閉模擬一級(jí)緩存:public class mycache /模擬緩存s
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024訂購(gòu)酒的購(gòu)銷合同范本范文
- 專題6 課內(nèi)閱讀 (一)(知識(shí)盤點(diǎn)+試題)-2022-2023學(xué)年五年級(jí)語(yǔ)文下冊(cè)期末復(fù)習(xí)
- 城區(qū)生活垃圾焚燒發(fā)電工程PPP項(xiàng)目招投標(biāo)書范本
- 2024路沿石購(gòu)銷合同
- 2024商鋪?zhàn)赓U標(biāo)準(zhǔn)合同范本
- 2024電子產(chǎn)品購(gòu)銷合同格式模板
- 2024物業(yè)保潔勞務(wù)合同
- 2024股權(quán)轉(zhuǎn)讓委托合同標(biāo)準(zhǔn)范本
- 規(guī)劃課題申報(bào)范例:《習(xí)近平新時(shí)代中國(guó)特色社會(huì)主義思想學(xué)生讀本》教學(xué)研究(附可修改技術(shù)路線圖)
- 茶水贈(zèng)送合同(2篇)
- 電梯使用現(xiàn)場(chǎng)類隱患專項(xiàng)排查清單
- 一例下肢靜脈潰瘍患者的個(gè)案護(hù)理論文
- 危巖穩(wěn)定性計(jì)算表格-滑移式-傾倒式-墜落式-完整版
- 直播運(yùn)營(yíng)團(tuán)隊(duì)組織架構(gòu)及崗位職責(zé)解析
- 肝膽外科運(yùn)用PDCA循環(huán)縮短三四類手術(shù)患者術(shù)后留置導(dǎo)尿的時(shí)間
- JCT640-2010 頂進(jìn)施工法用鋼筋混凝土排水管
- 注塑車間平面規(guī)劃圖OK
- 鎮(zhèn)衛(wèi)生院績(jī)效考核方案
- 9.2+積極投身創(chuàng)新實(shí)踐(高效教案)-【中職專用】中職思想政治《哲學(xué)與人生》(高教版2023基礎(chǔ)模塊)
- 【高中語(yǔ)文】《邏輯的力量》課件+統(tǒng)編版++選擇性必修上冊(cè)
評(píng)論
0/150
提交評(píng)論