SSH框架項目教程課件第3章第三講_第1頁
SSH框架項目教程課件第3章第三講_第2頁
SSH框架項目教程課件第3章第三講_第3頁
SSH框架項目教程課件第3章第三講_第4頁
SSH框架項目教程課件第3章第三講_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

重慶正大軟件學院軟件系《MVC框架程序設計》電子教案重慶正大軟件學院軟件系《MVC框架程序設計》課程組重慶正大軟件職業技術學院教案(項目類)授課對象系別軟件系本次課學時4學時年級班次大二章節題目第3章hibernate多對一目的要求(含技能要求)了解hibernate多對一概念、作用掌握hibernate多對一查詢基本配置本節重點掌握hibernate多對一查詢基本配置本節難點了解hibernate多對一概念、作用教學方法項目教學法教學用具機房、屏幕廣播問題引入通過用戶注冊案例中用戶表與出生地表的關系,從而引出本次課程。難點與重點講解方法引導、分析、講解、實作演示本次課小結課程小結教后禮記討論、思考題、作業(含實訓作業)完成本次課的課堂任務填寫實驗報告任務介紹(5分鐘)改造上一節查詢任務,要求使用hibernate框架多對一(即:用戶表與省份表是多對一的關系)的配置實現在查詢頁面中輸入省份名這個條件查詢出屬于該省份的所有注冊用戶,其省份表、用戶表及查詢界面及查詢結果均和上一節任務一樣。任務解析(50-60分鐘)修改省份實體類Province及對應的映射文件Province.hbm.xml修改用戶實體類User及對應的映射文件User.hbm.xmldao層:修改類QueryDao.,修改條件查詢的相關代碼service層:修改類QueryService,修改業務處理代碼action層:修改類QueryAction調試運行詳細步驟修改省份實體類Province及對應的映射文件Province.hbm.xmlProvince類中去掉集合成員變量users,關鍵代碼如下:publicclassProvince{ intid;//省份流水號 Stringname;//省份名稱 Stringnote;//描述 //以下省略每個成員變量的get/set方法}Province.hbm.xml映射文件中去掉users集合變量的配置,關鍵代碼如下:<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>注:user表(用戶)與province表(省份)是多對一的關系,user是“多”方,province是“一”方,多對一關系在“多”方進行配置,“一”方無需配置,故Province實體類及對應的映射文件中可以去掉users的相關配置。修改用戶實體類User及對應的映射文件User.hbm.xml修改com.zdsoft.domain包下的User.類,增加成員變量province(省份),類型為Province同時增加對應的get/set方法。User類的關鍵代碼如下:publicclassUser{ intid; Stringname; StringuserName; Stringpassword; Stringsex; intage; Datebirth; Stringmobile; Stringhobbies; Stringemail; Provinceprovince; //以下省略每個成員變量的get/set方法}同樣地,將對應的映射文件User.hbm.xml中增加關于province的配置,關鍵代碼如下:<hibernate-mappingpackage="com.zdsoft.domain"> <classname="User"> <idname="id"> <generatorclass="native"/> </id> <propertyname="name"/> <propertyname="password"/> <propertyname="userName"/> <propertyname="sex"/> <propertyname="age"/> <propertyname="birth"/> <propertyname="mobile"/> <propertyname="email"/> <propertyname="hobbies"/> <many-to-onename="province"column="province" class="Province"fetch="select"not-null="true"lazy="false"/> </class></hibernate-mapping>dao層:修改類QueryDao.,添加條件查詢的相關代碼修改成員方法query中的hsql語句(查詢的實體類從Province改為User),并修改返回值類型(將List<Province>改為List<User>),關鍵代碼如下:publicclassQueryDao{ //使用hibernate框架創建sessionFactory對象 SessionFactorysessionFactory=newConfiguration().configure().buildSessionFactory(); publicList<User>query(Stringprovince){ List<User>ret=null; //編寫查詢的hibernate框架特有的sql語句 Stringhql="fromUserwhere1=1"; if(null!=province&&!"".equals(province)){ hql=hql+"and='"+province+"'"; }else{ returnnull;//若沒有輸入省份,查詢結果是無意義的,直接返回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; }}service層:修改類QueryService,修改業務處理代碼修改QueryService類query方法返回值類型(將List<Province>改為List<User>),關鍵代碼如下:publicclassQueryService{ privateQueryDaoqueryDao=newQueryDao(); publicList<User>query(StringqueryProvince){ returnqueryDao.query(queryProvince); }}action層:修改類QueryAction修改成員變量users的類型(從Set<User>改為List<User>),并修改query方法中對service層的業務調用代碼。關鍵代碼如下:publicclassQueryAction{privateStringqueryProvince;//查詢條件:省份privateQueryServiceregisterService=newQueryService();//業務處理類privateList<User>users=null;//查詢的結果publicStringquery(){ users=registerService.query(queryProvince); if(users==null||users.isEmpty()){ return"error"; }else{ return"success"; }}//以下省略成語變量的get/set方法}調試運行首先,準備與上節任務一樣的查詢的數據,參考如圖3.2-5a、圖3.2-5b所示。然后將工程發布到服務器,啟動服務器,運行頁面query.jsp,在查詢條件中輸入重慶,其結果與上節任務一樣(如圖3.2-5c所示)。根據任務提出問題(45-55分鐘)什么是多對一關系?如何使用hibernate完成多表查詢?問題解析(45-55分鐘)什么是多對一關系?在前面章節提到一對多的關系:對于主表和從表存在外鍵的對應關系我們稱之為一對多關系,反過來,從表對主表的關系即是多對一的關系。例如在數據庫中存在班級表和學生表兩張表,班級表中存在主鍵:班級號,學生表中存在非主鍵:班級號,學生表中的非主鍵字段班級號的值來源于班級表中的主鍵班級號,因此,學生表與班級表就是多對一的關系。從現實世界來看:即是有多個學生在同一個班級,學生對班級就是多對一。實現多對一查詢:以學生信息管理系統根據班級號查詢學生信息為例【例子3.3-1】在學生信息管理系統中班級與學生之間存在著這樣的關系:多個學生屬于同一個班級。這是典型的多對一關聯關系,對應到hibernate的對象模型中是單向多對一映射。要求使用hibernate多對一單向映射實現查詢功能:根據班級名稱查詢該班級所有學生的信息,并把學生信息列表顯示在查詢頁面中。在數據庫中學生表與班級表結構與【例子3.2-1】一樣,請參見表3.2-2a、表3.2-2b所示。步驟1:在eclipse中創建web工程studentInfoManage,并把hibernate,struts2及數據庫所需的jar包拷貝到工程WebContent/WEB-INF/lib目錄下。步驟2:在工程中src目錄下創建com.zdsoft.domain并在該包路徑下創建學生實體類Student和對應的映射文件Student.hbm.xml。實體類Student的關鍵代碼如下:publicclassStudent{ privateintid; privateStringstudentName; privateStringstudentNo; privateStringsex; privateintage; privateClazzclazz;//多對一關系的處理//以下省略成員變量的get/set方法}代碼說明:在多對一的配置中,Student類中的成員變量clazz對應到表student中的clazz_id這個外鍵字段,因而clazz不是一個普通的類型,必須被定義為Clazz類型。映射文件Student.hbm.xml的關鍵代碼如下: <classname="Student"> <idname="id"> <generatorclass="native"/> </id> <propertyname="studentName"/> <propertyname="studentNo"/> <propertyname="sex"/> <propertyname="age"/> <many-to-onename="clazz"column="clazz_id" class="Clazz"fetch="select"not-null="true"lazy="false"/> </class>代碼說明:many-to-one節點配置多對一關系中的“一”方實體類,其中name屬性指定多方實體類中的成員變量,column指定多方表(從表)中的外鍵字段,class屬性就是“一”方的實體類名,lazy=”true”表示不使用延遲加載。本例表示實體類Student與實體類Clazz是一對多關系,兩者通過外鍵clazz_id關聯起來。步驟3:在工程中com.zdsoft.domain包路徑下創建班級的實體類Clazz和映射文件Clazz.hbm.xml,因為是進行多對一的配置,關聯配置都在多方,對于“一”方無需關聯配置。Clazz.hbm.xml關鍵代碼如下:<hibernate-mappingpackage="com.zdsoft.domain"> <classname="Clazz"> <idname="id"column="clazz_id"> <generatorclass="native"/> </id> <propertyname="clazzNo"/> <propertyname="clazzName"/> <propertyname="department"/> </class></hibernate-mapping>Clazz關鍵代碼如下:publicclassClazz{ privateintid; privateStringclazzNo; privateStringclazzName; privateStringdepartment; //以下省略各個成員變量的get/set方法}步驟4:在src下創建com.zdsoft.dao包,并在該包下創建類ClazzDao,在類中新建根據班級id查詢學生信息的方法findStudentByClazzId,關鍵代碼如下:publicclassClazzDao{ //使用hibernate框架創建sessionFactory對象 SessionFactorysessionFactory=newConfiguration().configure().buildSessionFactory(); publicList<Student>findStudentByClazzId(StringclazzName){ List<Student>ret=null; //編寫查詢的hibernate框架特有的sql語句 Stringhql="fromStudentwhereclazz.clazzName='"+clazzName+"'"; Sessionsession=sessionFactory.openSession(); try{ Queryquery=session.createQuery(hql); ret=query.list(); }catch(HibernateExceptione){ e.printStackTrace(); ret=null; }finally{ if(session!=null){ session.close(); } } returnret; }}代碼說明:在上述hibernate的sql語句中的where子句——clazz.clazzName=’"+clazzName+”’”的含義是,實體類Student的屬性clazz中的clazzName屬性的值與查詢輸入的條件clazzName相匹配,即是實體類Student根據clazz_id外鍵所關聯的Clazz實體類中的班級名clazzName與查詢輸入的班級名clazzName進行查詢匹配。若翻譯成sql語句則是:select*fromstudent,clazzwherestudent.clazz_id=clazz.idandclazz.clazzName=查詢輸入條件clazzName變量的值步驟5:在hibernate.cfg.xml文件中的session-factory節點中加入實體類的映射文件:<mappingresource="com/zdsoft/domain/Student.hbm.xml"/><mappingresource="com/zdsoft/domain/Clazz.hbm.xml"/>代碼說明:將班級、學生實體類的映射文件加入到全局配置文件hibernate.cfg.xml中。步驟6:在該工程src創建com.zdsoft.action包,并在該包下創建類ClazzAction,關鍵代碼如下:publicclassClazzAction{ privateStringclazzName; privateClazzDaoclazzDao=newClazzDao(); privateList<Student>students=newArrayList(); publicStringexecute()throwsException{ students=clazzDao.findStudentByClazzId(this.clazzName); if(students!=null){ return"success"; }else{ return"error"; } } //以下省略成員變量的get/set方法}代碼說明:該類中定義了三個成員變量。其中clazzName用來接收頁面上傳遞的班級名稱的值。Students集合變量用來保存查詢的學生信息(多條),并傳遞到頁面顯示。clazzDao用來完成數據庫數據的查詢功能。步驟7:在該工程WebContent或WebRoot目錄下創建studentmanage.jsp頁面和失敗頁面errors.jsp,查詢頁面studentmanage.jsp的關鍵代碼如下:<body> 歡迎來到學生信息管理系統 <s:form

溫馨提示

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

評論

0/150

提交評論