




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
重慶正大軟件學(xué)院軟件系《MVC框架程序設(shè)計(jì)》電子教案重慶正大軟件學(xué)院軟件系《MVC框架程序設(shè)計(jì)》課程組重慶正大軟件職業(yè)技術(shù)學(xué)院教案(項(xiàng)目類)授課對象系別軟件系本次課學(xué)時(shí)4學(xué)時(shí)年級班次大二章節(jié)題目第3章hibernate一對多目的要求(含技能要求)了解hibernate一對多概念、作用掌握hibernate一對多查詢基本配置本節(jié)重點(diǎn)掌握hibernate一對多查詢基本配置本節(jié)難點(diǎn)了解hibernate一對多概念、作用教學(xué)方法項(xiàng)目教學(xué)法教學(xué)用具機(jī)房、屏幕廣播問題引入通過用戶注冊案例中出生地的數(shù)據(jù)來源,從而引出本次課程。難點(diǎn)與重點(diǎn)講解方法引導(dǎo)、分析、講解、實(shí)作演示本次課小結(jié)課程小結(jié)教后禮記討論、思考題、作業(yè)(含實(shí)訓(xùn)作業(yè))完成本次課的課堂任務(wù)填寫實(shí)驗(yàn)報(bào)告任務(wù)介紹(5分鐘)改造注冊功能,假定注冊信息中的“省份”下拉選項(xiàng)的內(nèi)容(比如重慶、北京、天津等等)不是在編碼中寫死的,而是來源于數(shù)據(jù)庫中省份表的內(nèi)容(如表3.2-1a所示),相應(yīng)地,原注冊的用戶表中省份字段修改如表3.2-1b所示。這樣,在進(jìn)行注冊信息查詢時(shí),就會(huì)涉及到兩張表(省份表與用戶表一對多關(guān)系)的查詢,本任務(wù)要求在查詢頁面中輸入省份名這個(gè)條件查詢出屬于該省份的所有注冊用戶,如圖3.2-1c所示。表3.2-1a省份表province字段編號英文字段名中文描述字段類型備注id流水號int自增、pk、notnullname省份名varchar(50)notnullnote描述varchar(255)表3.2-1b修改后的用戶表user字段編號英文字段名中文描述字段類型備注id流水號int自增、pk、notnullname會(huì)員登錄名varchar(50)notnulluserName真實(shí)姓名varchar(50)password用戶密碼varchar(20)notnullsex性別varchar(2)notnullprovince省份intfk、notnull、=province.idage年齡intbirth生日datemobile手機(jī)varchar(20)email電子郵箱varchar(50)hobbies愛好varchar(255)圖3.2-1c注冊用戶查詢結(jié)果任務(wù)解析(50-60分鐘)創(chuàng)建省份表、修改用戶表結(jié)構(gòu)創(chuàng)建省份實(shí)體類Province及對應(yīng)的映射文件Province.hbm.xml修改用戶實(shí)體類User及對應(yīng)的映射文件User.hbm.xml修改hibernate.cfg.xml配置文件,添加省份實(shí)體類的映射文件配置dao層:新建類QueryDao.,添加條件查詢的相關(guān)代碼service層:新建類QueryService,添加業(yè)務(wù)處理代碼action層:新建類QueryAction,調(diào)用業(yè)務(wù)處理類進(jìn)行查詢view(視圖)層:新建查詢頁面query.jsp修改struts.xml配置文件,添加查詢的action的配置調(diào)試運(yùn)行詳細(xì)步驟創(chuàng)建省份表、修改用戶表結(jié)構(gòu)參見工作任務(wù)描述中的表3.2-1a和表3.2-1b進(jìn)行表結(jié)構(gòu)的改寫。創(chuàng)建省份實(shí)體類Province及對應(yīng)的映射文件Province.hbm.xml在工程的com.zdsoft.domain包下創(chuàng)建興創(chuàng)建省份實(shí)體類Province及對應(yīng)的映射文件Province.hbm.xml,Province類的關(guān)鍵代碼如下:publicclassProvince{ intid;//省份流水號 Stringname;//省份名稱 Stringnote;//描述 privateSet<User>users=newHashSet(0);//同一個(gè)省份的多個(gè)用戶 //以下省略每個(gè)成員變量的get/set方法}Province.hbm.xml映射文件關(guān)鍵代碼如下:<hibernate-mappingpackage="com.zdsoft.domain"> <classname="Province"> <idname="id"column="id"> <generatorclass="native"/> </id> <propertyname="name"/> <propertyname="note"/> <setname="users"cascade="save-update"lazy="false"> <keycolumn="province"/> <one-to-manyclass="User"/> </set> </class></hibernate-mapping>修改用戶實(shí)體類User及對應(yīng)的映射文件User.hbm.xml修改com.zdsoft.domain包下的User.類,將成員變量province(省份)去掉,同時(shí)去掉get/set方法。同樣地,將對應(yīng)的映射文件User.hbm.xml中關(guān)于省份的配置去掉。注:province表(省份)與user表(用戶)是一對多的關(guān)系,user是“多”方,province是“一”方,一對多關(guān)系在“一”方進(jìn)行配置,“多”方無需配置,故User實(shí)體類及對應(yīng)的映射文件中可以去掉省份的相關(guān)配置。修改hibernate.cfg.xml配置文件,添加省份實(shí)體類的映射文件配置在<session-factory>節(jié)點(diǎn)中添加一行代碼:<mappingresource="com/zdsoft/domain/User.hbm.xml"/>dao層:新建類QueryDao.,添加條件查詢的相關(guān)代碼在com.zdsoft.dao包下新建類QueryDao,在類中創(chuàng)建成員變量sessionFactory和成員方法query,關(guān)鍵代碼如下:publicclassQueryDao{ //使用hibernate框架創(chuàng)建sessionFactory對象 SessionFactorysessionFactory=newConfiguration().configure().buildSessionFactory(); publicList<Province>query(Stringprovince){ List<Province>ret=null; //編寫查詢的hibernate框架特有的sql語句 Stringhql="fromProvincewhere1=1"; if(null!=province&&!"".equals(province)){ hql=hql+"andname='"+province+"'"; }else{ returnnull;//若沒有輸入省份,查詢結(jié)果是無意義的,直接返回null。 } Sessionsession=sessionFactory.openSession(); try{ Queryquery=session.createQuery(hql); ret=query.list(); }catch(HibernateExceptione){ e.printStackTrace(); ret=null; }finally{ if(session!=null){ session.close(); } } returnret; }}注:query方法中使用了hibernate框架特有的查詢語言hql
。hql語言是面向?qū)ο蟮牟樵冋Z言,hql直接查詢實(shí)體類或?qū)嶓w類的屬性,最簡單的hql如:fromObject,更多關(guān)于hql的知識(shí)可以參閱hibernate官方文檔。一個(gè)編程技巧:query方法中定義查詢語句的時(shí)候因需要根據(jù)方法中傳遞參數(shù)的個(gè)數(shù)動(dòng)態(tài)組織hql語句,故在hql關(guān)鍵字where后添加了一個(gè)恒等式1=1,以便于動(dòng)態(tài)組織查詢條件子句。進(jìn)行查詢:需要使用session提供的createQuery方法來創(chuàng)建hibernate的用于hql查詢的Query對象(類型為org.hibernate.Query),該對象使用list方法進(jìn)行查詢并返回一個(gè)List集合類型的查詢結(jié)果列表。service層:新建類QueryService,添加業(yè)務(wù)處理代碼在com.zdsoft.service包下新建QueryService類,在類中創(chuàng)建成員變量queryDao和query方法,關(guān)鍵代碼如下:publicclassQueryService{ privateQueryDaoqueryDao=newQueryDao(); publicList<Province>query(StringqueryProvince){ returnqueryDao.query(queryProvince); }}注:該業(yè)務(wù)邏輯類沒有復(fù)雜的業(yè)務(wù)處理,故這里直接調(diào)用dao層的數(shù)據(jù)訪問代碼。action層:新建類QueryAction,調(diào)用業(yè)務(wù)處理類進(jìn)行查詢在com.zdsoft.action包下創(chuàng)建QueryAction類,并在類中創(chuàng)建三個(gè)成員變量——查詢條件省份、業(yè)務(wù)處理類、查詢結(jié)果。關(guān)鍵代碼如下:publicclassQueryAction{privateStringqueryProvince;//查詢條件:省份privateQueryServiceregisterService=newQueryService();//業(yè)務(wù)處理類privateSet<User>users=newHashSet<User>();//查詢的結(jié)果//這里省略成員變量的get/set方法}然后在類中創(chuàng)建查詢的方法query,關(guān)鍵代碼如下:publicStringquery(){ List<Province>provinces=registerService.query(queryProvince); if(provinces==null||provinces.isEmpty()){ return"error"; }else{ //根據(jù)省份名從表中查詢數(shù)據(jù),若省份在表中不重復(fù)的話,僅查出一條,這里取第一條 Provinceprovince=provinces.get(0); users=province.getUsers(); return"success"; }}view(視圖)層:新建查詢頁面query.jsp在WebContent(或WebRoot)目錄下創(chuàng)建query.jsp頁面,該頁面為注冊用戶信息查詢頁面,關(guān)鍵代碼如下:<body> <s:formaction="query"method="post"> <tablealign="center"> <tr> <tdcolspan="2"align="center">注冊用戶查詢</td> </tr> <s:textfieldname="queryProvince"label="省份"/> <s:submitmethod="query"value="查詢"/> </table> </s:form> <tablealign="center"border="1"> <thead> <tdcolspan="8">查詢結(jié)果</td> </thead> <thead> <td>會(huì)員登錄名</td> <td>用戶昵稱</td> <td>性別</td> <td>年齡</td> <td>生日</td> <td>電話</td> <td>愛好</td> <td>電子郵件</td> </thead> <s:iteratorvalue="users"> <tr> <td><s:propertyvalue="name"/></td> <td><s:propertyvalue="userName"/></td> <td><s:propertyvalue="sex"/></td> <td><s:propertyvalue="age"/></td> <td><s:propertyvalue="birth"/></td> <td><s:propertyvalue="mobile"/></td> <td><s:propertyvalue="hobbies"/></td> <td><s:propertyvalue="email"/></td> </tr> </s:iterator> </table></body>注:頁面中的循環(huán)標(biāo)簽<s:iteratorvalue="users">中的users來源于QueryAction中的成員變量users,兩者名字必須一致。另外,錯(cuò)誤頁面error.jsp可以參考任務(wù)解析中的例子,這里略。修改struts.xml配置文件,添加查詢的action的配置修改src包下的struts.xml配置文件,增加QueryAction的配置,關(guān)鍵代碼<actionname="query"class="com.zdsoft.action.QueryAction"method=”query”> <resultname="success">/query.jsp</result> <resultname="error">/error.jsp</result></action>調(diào)試運(yùn)行首先,準(zhǔn)備查詢的數(shù)據(jù),在省份表和用戶表中加入幾條記錄,如圖3.2-5a、圖3.2-5b所示,在用戶表中有兩條記錄,都是屬于重慶這個(gè)省份。圖3.2-5a省份表中的數(shù)據(jù)圖3.2-5b用戶表中的數(shù)據(jù)然后將工程發(fā)布到服務(wù)器,啟動(dòng)服務(wù)器,運(yùn)行頁面query.jsp,在查詢條件中輸入重慶,可查到兩條省份為重慶的用戶,如圖3.2-1c所示。根據(jù)任務(wù)提出問題(45-55分鐘)什么是一對多關(guān)系?如何使用hibernate完成多表查詢?問題解析(45-55分鐘)什么是一對多關(guān)系?在關(guān)系型數(shù)據(jù)庫中兩個(gè)表之間往往存在一對多的關(guān)系。一個(gè)表(我們稱為主表)的主鍵字段與另一個(gè)表(我們稱為從表)的某個(gè)非主鍵字段的值相對應(yīng)(這里的對應(yīng)是指從表對應(yīng)的非主鍵字段的取值必須來源于主表的主鍵的值)其中主表中主鍵的值是唯一的,而從表中非主鍵的值是可以重復(fù)的,對于主表和從表這樣的對應(yīng)關(guān)系我們稱之為一對多關(guān)系。例如在數(shù)據(jù)庫中存在班級表和學(xué)生表兩張表,班級表中存在主鍵:班級號,學(xué)生表中存在非主鍵:班級號,學(xué)生表中的非主鍵字段班級號的值來源于班級表中的主鍵班級號,因此,班級表與學(xué)生表就是一對多的關(guān)系。從現(xiàn)實(shí)世界來看:即是一個(gè)班級擁有有多個(gè)學(xué)生,班級對學(xué)生就是一對多。實(shí)現(xiàn)一對多查詢:以學(xué)生信息管理系統(tǒng)根據(jù)班級號查詢學(xué)生信息為例【例子3.2-1】在學(xué)生信息管理系統(tǒng)中班級與學(xué)生之間存在著這樣的關(guān)系:一個(gè)班級中包含多個(gè)學(xué)生。這是典型的一對多關(guān)聯(lián)關(guān)系,對應(yīng)到hibernate的對象模型中是單向一對多映射。要求使用hibernate一對多單向映射實(shí)現(xiàn)查詢功能:根據(jù)班級id查詢該班級所有學(xué)生的信息,并把學(xué)生信息列表顯示在查詢頁面中。在數(shù)據(jù)庫中學(xué)生表與班級表結(jié)構(gòu)如表3.2-2a、表3.2-2b所示。表3.2-2a學(xué)生表student字段序號中文描述英文字段名字段類型備注流水號idintpk、notnull、自增學(xué)號studentNovarchar(50)notnull姓名studentNamevarchar(100)性別sexvarchar(2)年齡ageint班級idclazz_idintfk、notnull、=clazz.id表3.2-2b班級表class字段序號中文描述英文字段名字段類型備注流水號idintpk、notnull、自增班級編號clazzNovarchar(50)notnull班級名稱clazzNamevarchar(100)系部departmentvarchar(100)步驟1:在eclipse中創(chuàng)建web工程studentInfoManage,并把hibernate,struts2及數(shù)據(jù)庫所需的jar包拷貝到工程WebContent/WEB-INF/lib目錄下。步驟2:在工程中src目錄下創(chuàng)建com.zdsoft.domain并在該包路徑下創(chuàng)建學(xué)生實(shí)體類Student和對應(yīng)的映射文件Student.hbm.xml。實(shí)體類Student的關(guān)鍵代碼如下:publicclassStudent{ privateintid; privateStringstudentName; privateStringstudentNo; privateStringsex; privateintage;//以下省略成員變量的get/set方法}映射文件Student.hbm.xml的關(guān)鍵代碼如下: <classname="Student"> <idname="id"> <generatorclass="native"/> </id> <propertyname="studentName"/> <propertyname="studentNo"/> <propertyname="sex"/> <propertyname="age"/> </class>步驟3:在工程中com.zdsoft.domain包路徑下創(chuàng)建班級的實(shí)體類Clazz和映射文件Clazz.hbm.xml。Clazz.hbm.xml關(guān)鍵代碼如下:<hibernate-mappingpackage="com.zdsoft.domain"> <classname="Clazz"> <idname="id"column="clazz_id"> <generatorclass="native"/> </id> <propertyname="clazzNo"/> <propertyname="clazzName"/> <propertyname="department"/> <setname="students"cascade="save-update"lazy="false"> <keycolumn="clazz_id"/> <one-to-manyclass="Student"/> </set> </class></hibernate-mapping>代碼說明:set節(jié)點(diǎn):描述類中存在的集合類對象,在Clazz中List對象是student。set的name屬性表示在該類中定義的集合對應(yīng)的名稱,在Clazz中定義的List對象的名稱是students.set的cascade屬性表示讓操作級聯(lián)到子對象.save-update屬性表示在父對象做保存或者修改操作的時(shí)候級聯(lián)操作子對象。set的lazy屬性表示是否延遲加載子對象.這里的值是false表示不延遲加載,在獲取Clazz對象的同時(shí)初始化對應(yīng)的students集合對象。key節(jié)點(diǎn)中的column屬性指定從表的外鍵字段名,在本例中clazz_id是實(shí)體類Student對應(yīng)的表student的外鍵字段clazz_id。one-to-many節(jié)點(diǎn)配置一對多關(guān)系中的多方實(shí)體類,其中class屬性就是多方的實(shí)體類名。本例表示實(shí)體類Clazz與實(shí)體類Student是一對多關(guān)系。Clazz關(guān)鍵代碼如下:publicclassClazz{ privateintid; privateStringclazzNo; privateStringclazzName; privateStringdepartment; privateSet<Student>students=newHashSet(0); //以下省略各個(gè)成員變量的get/set方法}代碼說明:Set<Student>students=newHashSet(0);該語句聲明了Set集合對象students,該對象的屬性名稱與Clazz.hbm.xml映射文件中set節(jié)點(diǎn)中的name屬性值必須一致,表示一個(gè)班級中可以存在多個(gè)學(xué)生。步驟4:在src下創(chuàng)建com.zdsoft.dao包,并在該包下創(chuàng)建類ClazzDao,在類中新建根據(jù)班級id查詢學(xué)生信息的方法findStudentByClazzId,關(guān)鍵代碼如下:publicclassClazzDao{ publicClazzfindStudentByClazzId(intclazzId){ Clazzret=null;//返回值 List<Student>students=newArrayList<Student>(); SessionFactorysessionFactory=null; Configurationcfg=null; Sessionsession=null; try{ cfg=newConfiguration(); cfg.configure(); sessionFactory=cfg.buildSessionFactory(); session=sessionFactory.openSession(); ret=(Clazz)session.load(Clazz.class,clazzId); }catch(HibernateExceptione){ e.printStackTrace(); } if(session!=null){ session.close(); } if(sessionFactory!=null){ sessionFactory.close(); } returnret; }}代碼說明:Clazzclazz=(Clazz)session.load(Clazz.class,clazzId);該語句通過調(diào)用session的load方法查詢了班級id值為clazzId的班級對象,因在Clazz.hbm.xml映射文件中l(wèi)ist的lazy屬性值為false故load方法同時(shí)會(huì)把該班級的所有學(xué)生也查詢到并加載到該Clazz對象的students集合中。load方法的參數(shù):Clazz.class表示要查詢的對象是Clazz對象。參數(shù)clazzId表示查詢Clazz對象的查詢條件為:主鍵值=clazzId。load方法的返回類型:load方法返回的類型是Object對象,故需要向下強(qiáng)制轉(zhuǎn)成我們所需要的Clazz對象。步驟5:在hibernate.cfg.xml文件中的session-factory節(jié)點(diǎn)中加入實(shí)體類的映射文件:<mappingresource="com/zdsoft/domain/Student.hbm.xml"/><mappingresource="com/zdsoft/domain/Clazz.hbm.xml"/>代碼說明:將班級、學(xué)生實(shí)體類的映射文件加入到全局配置文件hibernate.cfg.xml中。步驟6:在該工程src創(chuàng)建com.zdsoft.action包,并在該包下創(chuàng)建類ClazzAction,關(guān)鍵代碼如下:publicclassClazzAction{ privateintclazzId; privateSet<Student>students=newHashSet(0); privateClazzDaoclazzDao=newClazzDao(); publicStringexecute()throwsException{ students=clazzDao.findStudentByClazzId(this.clazzId).getStudents(); if(students!=null){ return"success"; }else{ return"error"; } } //以下省略成員變量clazzId與students的get/set方法}代碼說明:該類中定義了三個(gè)成員變量。其中clazzId用來接收頁面上傳遞的班級Id的值。Students集合變量用來保存查詢的學(xué)生信息(多條),并傳遞到頁面顯示。clazzDao用來完成數(shù)據(jù)庫數(shù)據(jù)的查詢功能。步驟7:在該工程WebContent目錄下創(chuàng)建studentmanage.jsp頁面和失敗頁面errors.jsp,查詢頁面的關(guān)鍵代碼如下:<body> 歡迎來到學(xué)生信息管理系統(tǒng) <s:formaction="query"method="post"name="studentForm"> <table> <tr> <td>班級ID</td> <td><inputname="clazzId"type="text"value="${clazzId}"/></td> <td><inputname="query"type="submit"value="查詢"/></td> </tr> </table> <tableborder="1"> <tr> <td>姓名</td>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外墻水泥板隔音施工方案
- 曲面游樂場混凝土施工方案
- 集水坑排污泵維修施工方案
- 提高學(xué)習(xí)效率講座
- 環(huán)衛(wèi)節(jié)發(fā)言稿
- 圖書管理員發(fā)言稿
- 星輝餐廳服務(wù)報(bào)告
- 綠色礦山發(fā)言稿
- 新婚發(fā)言稿新郎
- 個(gè)人務(wù)虛會(huì)發(fā)言稿
- 2023年常州工業(yè)職業(yè)技術(shù)學(xué)院高職單招(語文)試題庫含答案解析
- GB/T 3452.2-2007液壓氣動(dòng)用O形橡膠密封圈第2部分:外觀質(zhì)量檢驗(yàn)規(guī)范
- GB/T 30797-2014食品用洗滌劑試驗(yàn)方法總砷的測定
- GB/T 20057-2012滾動(dòng)軸承圓柱滾子軸承平擋圈和套圈無擋邊端倒角尺寸
- GB/T 19808-2005塑料管材和管件公稱外徑大于或等于90mm的聚乙烯電熔組件的拉伸剝離試驗(yàn)
- GB/T 10051.1-2010起重吊鉤第1部分:力學(xué)性能、起重量、應(yīng)力及材料
- 2022年人民交通出版社股份有限公司招聘筆試試題及答案解析
- 班組建設(shè)工作體系課件
- 第章交通調(diào)查與數(shù)據(jù)分析課件
- 穆斯林太巴熱咳慶念詞文
- 軟硬結(jié)合板的設(shè)計(jì)制作與品質(zhì)要求課件
評論
0/150
提交評論