




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重庆正大软件学院软件系《MVC框架程序设计》电子教案重庆正大软件学院软件系《MVC框架程序设计》课程组重庆正大软件职业技术学院教案(项目类)授课对象系别软件系本次课学时4学时年级班次大二章节题目第3章hibernate一对多目的要求(含技能要求)了解hibernate一对多概念、作用掌握hibernate一对多查询基本配置本节重点掌握hibernate一对多查询基本配置本节难点了解hibernate一对多概念、作用教学方法项目教学法教学用具机房、屏幕广播问题引入通过用户注册案例中出生地的数据来源,从而引出本次课程。难点与重点讲解方法引导、分析、讲解、实作演示本次课小结课程小结教后礼记讨论、思考题、作业(含实训作业)完成本次课的课堂任务填写实验报告任务介绍(5分钟)改造注册功能,假定注册信息中的“省份”下拉选项的内容(比如重庆、北京、天津等等)不是在编码中写死的,而是来源于数据库中省份表的内容(如表3.2-1a所示),相应地,原注册的用户表中省份字段修改如表3.2-1b所示。这样,在进行注册信息查询时,就会涉及到两张表(省份表与用户表一对多关系)的查询,本任务要求在查询页面中输入省份名这个条件查询出属于该省份的所有注册用户,如图3.2-1c所示。表3.2-1a省份表province字段编号英文字段名中文描述字段类型备注id流水号int自增、pk、notnullname省份名varchar(50)notnullnote描述varchar(255)表3.2-1b修改后的用户表user字段编号英文字段名中文描述字段类型备注id流水号int自增、pk、notnullname会员登录名varchar(50)notnulluserName真实姓名varchar(50)password用户密码varchar(20)notnullsex性别varchar(2)notnullprovince省份intfk、notnull、=province.idage年龄intbirth生日datemobile手机varchar(20)email电子邮箱varchar(50)hobbies爱好varchar(255)图3.2-1c注册用户查询结果任务解析(50-60分钟)创建省份表、修改用户表结构创建省份实体类Province及对应的映射文件Province.hbm.xml修改用户实体类User及对应的映射文件User.hbm.xml修改hibernate.cfg.xml配置文件,添加省份实体类的映射文件配置dao层:新建类QueryDao.,添加条件查询的相关代码service层:新建类QueryService,添加业务处理代码action层:新建类QueryAction,调用业务处理类进行查询view(视图)层:新建查询页面query.jsp修改struts.xml配置文件,添加查询的action的配置调试运行详细步骤创建省份表、修改用户表结构参见工作任务描述中的表3.2-1a和表3.2-1b进行表结构的改写。创建省份实体类Province及对应的映射文件Province.hbm.xml在工程的com.zdsoft.domain包下创建兴创建省份实体类Province及对应的映射文件Province.hbm.xml,Province类的关键代码如下:publicclassProvince{ intid;//省份流水号 Stringname;//省份名称 Stringnote;//描述 privateSet<User>users=newHashSet(0);//同一个省份的多个用户 //以下省略每个成员变量的get/set方法}Province.hbm.xml映射文件关键代码如下:<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及对应的映射文件User.hbm.xml修改com.zdsoft.domain包下的User.类,将成员变量province(省份)去掉,同时去掉get/set方法。同样地,将对应的映射文件User.hbm.xml中关于省份的配置去掉。注:province表(省份)与user表(用户)是一对多的关系,user是“多”方,province是“一”方,一对多关系在“一”方进行配置,“多”方无需配置,故User实体类及对应的映射文件中可以去掉省份的相关配置。修改hibernate.cfg.xml配置文件,添加省份实体类的映射文件配置在<session-factory>节点中添加一行代码:<mappingresource="com/zdsoft/domain/User.hbm.xml"/>dao层:新建类QueryDao.,添加条件查询的相关代码在com.zdsoft.dao包下新建类QueryDao,在类中创建成员变量sessionFactory和成员方法query,关键代码如下:publicclassQueryDao{ //使用hibernate框架创建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;//若没有输入省份,查询结果是无意义的,直接返回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语言是面向对象的查询语言,hql直接查询实体类或实体类的属性,最简单的hql如:fromObject,更多关于hql的知识可以参阅hibernate官方文档。一个编程技巧:query方法中定义查询语句的时候因需要根据方法中传递参数的个数动态组织hql语句,故在hql关键字where后添加了一个恒等式1=1,以便于动态组织查询条件子句。进行查询:需要使用session提供的createQuery方法来创建hibernate的用于hql查询的Query对象(类型为org.hibernate.Query),该对象使用list方法进行查询并返回一个List集合类型的查询结果列表。service层:新建类QueryService,添加业务处理代码在com.zdsoft.service包下新建QueryService类,在类中创建成员变量queryDao和query方法,关键代码如下:publicclassQueryService{ privateQueryDaoqueryDao=newQueryDao(); publicList<Province>query(StringqueryProvince){ returnqueryDao.query(queryProvince); }}注:该业务逻辑类没有复杂的业务处理,故这里直接调用dao层的数据访问代码。action层:新建类QueryAction,调用业务处理类进行查询在com.zdsoft.action包下创建QueryAction类,并在类中创建三个成员变量——查询条件省份、业务处理类、查询结果。关键代码如下:publicclassQueryAction{privateStringqueryProvince;//查询条件:省份privateQueryServiceregisterService=newQueryService();//业务处理类privateSet<User>users=newHashSet<User>();//查询的结果//这里省略成员变量的get/set方法}然后在类中创建查询的方法query,关键代码如下:publicStringquery(){ List<Province>provinces=registerService.query(queryProvince); if(provinces==null||provinces.isEmpty()){ return"error"; }else{ //根据省份名从表中查询数据,若省份在表中不重复的话,仅查出一条,这里取第一条 Provinceprovince=provinces.get(0); users=province.getUsers(); return"success"; }}view(视图)层:新建查询页面query.jsp在WebContent(或WebRoot)目录下创建query.jsp页面,该页面为注册用户信息查询页面,关键代码如下:<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">查询结果</td> </thead> <thead> <td>会员登录名</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>注:页面中的循环标签<s:iteratorvalue="users">中的users来源于QueryAction中的成员变量users,两者名字必须一致。另外,错误页面error.jsp可以参考任务解析中的例子,这里略。修改struts.xml配置文件,添加查询的action的配置修改src包下的struts.xml配置文件,增加QueryAction的配置,关键代码<actionname="query"class="com.zdsoft.action.QueryAction"method=”query”> <resultname="success">/query.jsp</result> <resultname="error">/error.jsp</result></action>调试运行首先,准备查询的数据,在省份表和用户表中加入几条记录,如图3.2-5a、图3.2-5b所示,在用户表中有两条记录,都是属于重庆这个省份。图3.2-5a省份表中的数据图3.2-5b用户表中的数据然后将工程发布到服务器,启动服务器,运行页面query.jsp,在查询条件中输入重庆,可查到两条省份为重庆的用户,如图3.2-1c所示。根据任务提出问题(45-55分钟)什么是一对多关系?如何使用hibernate完成多表查询?问题解析(45-55分钟)什么是一对多关系?在关系型数据库中两个表之间往往存在一对多的关系。一个表(我们称为主表)的主键字段与另一个表(我们称为从表)的某个非主键字段的值相对应(这里的对应是指从表对应的非主键字段的取值必须来源于主表的主键的值)其中主表中主键的值是唯一的,而从表中非主键的值是可以重复的,对于主表和从表这样的对应关系我们称之为一对多关系。例如在数据库中存在班级表和学生表两张表,班级表中存在主键:班级号,学生表中存在非主键:班级号,学生表中的非主键字段班级号的值来源于班级表中的主键班级号,因此,班级表与学生表就是一对多的关系。从现实世界来看:即是一个班级拥有有多个学生,班级对学生就是一对多。实现一对多查询:以学生信息管理系统根据班级号查询学生信息为例【例子3.2-1】在学生信息管理系统中班级与学生之间存在着这样的关系:一个班级中包含多个学生。这是典型的一对多关联关系,对应到hibernate的对象模型中是单向一对多映射。要求使用hibernate一对多单向映射实现查询功能:根据班级id查询该班级所有学生的信息,并把学生信息列表显示在查询页面中。在数据库中学生表与班级表结构如表3.2-2a、表3.2-2b所示。表3.2-2a学生表student字段序号中文描述英文字段名字段类型备注流水号idintpk、notnull、自增学号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中创建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;//以下省略成员变量的get/set方法}映射文件Student.hbm.xml的关键代码如下: <classname="Student"> <idname="id"> <generatorclass="native"/> </id> <propertyname="studentName"/> <propertyname="studentNo"/> <propertyname="sex"/> <propertyname="age"/> </class>步骤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"/> <setname="students"cascade="save-update"lazy="false"> <keycolumn="clazz_id"/> <one-to-manyclass="Student"/> </set> </class></hibernate-mapping>代码说明:set节点:描述类中存在的集合类对象,在Clazz中List对象是student。set的name属性表示在该类中定义的集合对应的名称,在Clazz中定义的List对象的名称是students.set的cascade属性表示让操作级联到子对象.save-update属性表示在父对象做保存或者修改操作的时候级联操作子对象。set的lazy属性表示是否延迟加载子对象.这里的值是false表示不延迟加载,在获取Clazz对象的同时初始化对应的students集合对象。key节点中的column属性指定从表的外键字段名,在本例中clazz_id是实体类Student对应的表student的外键字段clazz_id。one-to-many节点配置一对多关系中的多方实体类,其中class属性就是多方的实体类名。本例表示实体类Clazz与实体类Student是一对多关系。Clazz关键代码如下:publicclassClazz{ privateintid; privateStringclazzNo; privateStringclazzName; privateStringdepartment; privateSet<Student>students=newHashSet(0); //以下省略各个成员变量的get/set方法}代码说明:Set<Student>students=newHashSet(0);该语句声明了Set集合对象students,该对象的属性名称与Clazz.hbm.xml映射文件中set节点中的name属性值必须一致,表示一个班级中可以存在多个学生。步骤4:在src下创建com.zdsoft.dao包,并在该包下创建类ClazzDao,在类中新建根据班级id查询学生信息的方法findStudentByClazzId,关键代码如下: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);该语句通过调用session的load方法查询了班级id值为clazzId的班级对象,因在Clazz.hbm.xml映射文件中list的lazy属性值为false故load方法同时会把该班级的所有学生也查询到并加载到该Clazz对象的students集合中。load方法的参数:Clazz.class表示要查询的对象是Clazz对象。参数clazzId表示查询Clazz对象的查询条件为:主键值=clazzId。load方法的返回类型:load方法返回的类型是Object对象,故需要向下强制转成我们所需要的Clazz对象。步骤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{ 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方法}代码说明:该类中定义了三个成员变量。其中clazzId用来接收页面上传递的班级Id的值。Students集合变量用来保存查询的学生信息(多条),并传递到页面显示。clazzDao用来完成数据库数据的查询功能。步骤7:在该工程WebContent目录下创建studentmanage.jsp页面和失败页面errors.jsp,查询页面的关键代码如下:<body> 欢迎来到学生信息管理系统 <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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【道法】做自强不息的中国人课件-2024-2025学年统编版道德与法治七年级下
- 2024年图书管理员考试大纲解读与试题答案
- 诗意文化与写作技巧试题及答案
- 如何高效准备消防设施考试试题及答案
- 专升本语文现代文解读知识点及答案
- 2024-2025学年高一下学期《从心入手用“行”规范》主题班会课件
- 2025年度环保设备维修人员劳动合同模板
- 二零二五年度企业员工合同模板汇编:试用期管理篇
- 2025年度铁路施工安全协议模板
- 2025届江苏省南通市高三下学期3月二模化学试题(含答案)
- 钦州市充电站建设计划书
- 自缢的护理查房
- 安全生产费用使用台账
- 新外研版高一英语必修二unit6课文
- 精神障碍社区康复服务投标方案
- 冰箱温度监测登记表
- 《利用导数研究函数的零点问题》教学设计
- 唯识二十论述记讲记(完整版)-智敏上师
- 建设单位甲方对监理单位考核管理办法
- 摩登情书原著全文在线【3篇】
- 统一战线理论与政策(讲课稿)
评论
0/150
提交评论