




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重庆正大软件学院软件系《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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会议推广合同范本
- 江西购房合同范本
- 口罩机采购合同范本
- 10《我们所了解的环境污染》教学设计-2023-2024学年道德与法治四年级上册统编版
- Lesson 1 Nice to meet you. (单元整体教学设计)-2024-2025学年接力版英语四年级上册
- 百分数的意义教学设计
- 长沙铺面出租合同范本
- 苗木包成活合同范本
- 26手术台就是阵地(教学设计)-2024-2025学年统编版语文三年级上册
- 2023-2024学年川教版(2019)小学信息技术五年级下册初识人工智能(教学设计)
- 《S公司客户开发与维护策略改进探究》开题报告10000字
- 计算机网络基础与应用中职完整全套教学课件
- 《触不可及》影视鉴赏
- 北师大版 四年级下册心理健康教育 失败不可怕 |教案
- 医师定期考核人文医学考试题库500题(含参考答案)
- 读书分享课件:《一句顶一万句》
- 物业消防安全管理培训【共54张课件】
- 空心杯电机基础知识
- DL-T+5839-2021土石坝安全监测系统施工技术规范
- 历年交管12123驾照学法减分复习题库带答案下载
- 人教鄂教版-科学-三年级下册-知识点
评论
0/150
提交评论