SSH框架项目教程课件第3章第五讲_第1页
SSH框架项目教程课件第3章第五讲_第2页
SSH框架项目教程课件第3章第五讲_第3页
SSH框架项目教程课件第3章第五讲_第4页
SSH框架项目教程课件第3章第五讲_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆正大软件学院软件系《MVC框架程序设计》电子教案重庆正大软件学院软件系《MVC框架程序设计》课程组重庆正大软件职业技术学院教案(项目类)授课对象系别软件系本次课学时4学时年级班次大二章节题目第4章hibernate注解目的要求(含技能要求)理解注解的概念掌握在hibernate框架中使用注解方式配置实体与表的映射关系本节重点掌握在hibernate框架中使用注解方式配置实体与表的映射关系本节难点理解注解的概念教学方法项目教学法教学用具机房、屏幕广播问题引入通过本章第一节用户注册数据入库案例,从而引出本次课程。难点与重点讲解方法引导、分析、讲解、实作演示本次课小结课程小结教后礼记讨论、思考题、作业(含实训作业)完成本次课的课堂任务填写实验报告任务介绍(5分钟)改造本章第一节注册信息入库的任务,使用hibernate框架注解方式取代对象与表的映射文件来实现注册入库,改造后执行效果与改造前一样。任务解析(50-60分钟)加入hibernate框架注解相关jar包修改用户实体类User,增加注解相关代码。修改hibernate.cfg.xml配置文件。dao层:修改数据库入库处理类。调试运行详细步骤加入hibernate框架注解相关jar包在eclipse中打开第8章第一节完成的工程,加入注解相关jar包,具体jar包请参考本节任务解析部分【例子3.5-1c】的相关内容,该jar包在同一个工程中只需加入一次。修改用户实体类User,增加注解相关代码,参考如下:@Entity@Table(name="user")publicclassUser{ @Id() @GeneratedValue(generator="userid") @GenericGenerator(name="userid",strategy="native") intid; @Column(name="name") Stringname; @Column(name="userName") StringuserName; @Column(name="password") Stringpassword; @Column(name="sex") Stringsex; @Column(name="province") Stringprovince; @Column(name="age") intage; @Column(name="birth") Datebirth; @Column(name="mobile") Stringmobile; @Column(name="hobbies") Stringhobbies; @Column(name="email") Stringemail; //以下省略每个成员变量的get/set方法}修改hibernate.cfg.xml配置文件。修改src目录下的hibernate.cfg.xml,删除或屏蔽下列代码:<mappingresource="com/zdsoft/domain/User.hbm.xml"/>并在该位置添加代码:<mappingclass="com.zdsoft.domain.User"/>dao层:修改数据库入库处理类。修改com.zdsoft.dao包下的数据处理类RegisterDao的构造方法,save方法可完全重用,不作修改。构造方法RegisterDao的关键代码如下: publicRegisterDao(){ cfg=newAnnotationConfiguration();//注解方式创建 cfg.configure(); sessionFactory=cfg.buildSessionFactory(); }调试运行发布工程,启动web服务器,运行注册页面,按照本章第一节任务运行,其结果一样。根据任务提出问题(45-55分钟)什么是注解?如何在hibernate框架中使用注解方式配置对象与表的关系映射?问题解析(45-55分钟)关于注解注解(annotation)概念:是与一个程序中某个元素关联信息或元数据的标注。它不直接影响java程序的执行,但是对例如编译器警告或者像文档生成器等辅助工具产生影响。注解在java1.5以上支持。我们可以这样理解:注解是一个标注;不直接影响java程序的执行;注解的作用是为被注解的程序提供执行所需的类似于工具、文档或类库,它反过来会影响程序的执行。深入了解——注解与注释的异同。相同点:都是给程序进行标注,都不是必须的。不同点:作用对象不同——注释是给程序员看的,是把程序对程序员进行解释,注解是给编译器看的,是把程序对编译器进行解释;程序运行结果不同——注释不影响程序的结果,注解不直接影响程序执行,但为被注解的程序提供执行所需的类似于工具、文档或类库,程序在运行中有可能会用到注解所提供的“库”,从而间接影响程序执行结果。注解语法:@+注解类型名+(参数名=参数值,...)语法说明:注解是一种修饰符,能够如其它修饰符(如public、static、final)一般使用。习惯用法是,注解用在其它的修饰符前面。注解由@开头;注解类型是关键字,()里边是多个成员-值列表组成的。这些参数的值必须是编译时常量(即在运行时不变)。如何获得注解类型?这里可以通过三种方式获得。方式1:使用内建注解——Java5.0中经常用到三个内建注解:@Deprecated用于修饰已经过时的方法;@Override用于修饰此方法覆盖了父类的方法(而非重载);@SuppressWarnings用于通知java编译器禁止特定的编译警告。【例子3.5-1a】一个使用Java5.0内建注解的类,该类演示了三个内建注解的使用:publicclassUsingBuiltInAnnotation{//食物类classFood{}//干草类classHayextendsFood{}//动物类classAnimal{FoodgetFood(){returnnull;}//使用Annotation声明Deprecated方法@DeprecatedvoiddeprecatedMethod(){}}//马类-继承动物类classHorseextendsAnimal{//使用Annotation声明覆盖方法@OverrideHaygetFood(){returnnewHay();}//使用Annotation声明禁止警告@SuppressWarnings({"deprecation","unchecked"})voidcallDeprecatedMethod(ListhorseGroup){Animalan=newAnimal();an.deprecatedMethod();horseGroup.add(an);}}}参考资料:/docs/books/tutorial/java/javaOO/annotations.html/j2se/1.5.0/docs/guide/language/annotations.html/jgloss/annotations.html方式2:开发者自定义注解类型——类似于定义一个接口interface【例子3.5-1b】自定义一个注解类型@AnnotationDefineForTestFunction首先,定义注解类型@AnnotationDefineForTestFunction,代码如下:importjava.lang.annotation.*;/***定义annotation*@authorcleverpig**///加载在VM中,在运行时进行映射@Retention(RetentionPolicy.RUNTIME)//限定此annotation只能标示方法@Target(ElementType.METHOD)public@interfaceAnnotationDefineForTestFunction{}然后,使用该注解类型,参考代码如下:/***一个实例程序应用前面定义的Annotation:AnnotationDefineForTestFunction*/publicclassUsingAnnotation{@AnnotationDefineForTestFunctionpublicstaticvoidmethod01(){}@AnnotationDefineForTestFunctionpublicstaticvoidmethod02(){}@AnnotationDefineForTestFunctionpublicstaticvoidmethod03(){thrownewRuntimeException("method03");}publicstaticvoidmethod04(){thrownewRuntimeException("method04");}publicstaticvoidmain(String[]argv)throwsException{intpassed=0,failed=0;//被检测的类名StringclassName="annotation.custom.UsingAnnotation";//逐个检查此类的方法,当其方法使用annotation声明时用此方法for(Methodm:Class.forName(className).getMethods()){if(m.isAnnotationPresent(AnnotationDefineForTestFunction.class)){try{m.invoke(null);passed++;}catch(Throwableex){System.out.printf("测试%s失败:%s%n",m,ex.getCause());failed++;}}}System.out.printf("测试结果:通过:%d,失败:%d%n",passed,failed);}}代码说明:上述类中main程序从className中取出类名,并且遍历此类的所有方法,尝试调用其中被自定义的注解类型AnnotationDefineForTestFunction标注过的方法。在此过程中为了找出哪些方法被AnnotationDefineForTestFunction类型标注过,需要使用反射的方式执行此查询。如果在调用方法时抛出异常,此方法被认为已经失败,并打印一个失败报告。最后,打印运行通过/失败的方法数量。方式3:使用第三方开发的注解类型:这是开发人员所常常用到的一种方式。比如我们使用JPA或者Hibernate框架中的注解类型,就以利用其中之一生成数据表映射配置文件,而不必使用xml文档。关于JPA与hibernate框架:JPA(JavaPersistenceAPI,java持久化对象应用编程接口)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。其目的主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面,制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不是使用私有供应商特有的API。因此开发人员只需使用供应商特有的API来获得JPA规范没有解决但应用程序中需要的功能。尽可能地使用JPA的API,但是当需要供应商公开但是规范中没有提供的功能时,则使用供应商特有的API。JPA是需要供应商来实现其功能的,Hibernate就是JPA供应商中很强的一个,目前来说应该无人能出其右。从功能上来说,JPA现在就是Hibernate功能的一个子集。Hibernate从3.2开始,就开始兼容JPA。Hibernate3.2获得了SunTCK的JPA(JavaPersistenceAPI)兼容认证。接下来,使用hibernate框架提供的注解类型,正是本节要重点介绍的内容。关于hibernate框架注解官方文档可参考/hibernate/annotations/3.4/reference/zh_cn/html_single/.如何在hibernate框架中使用注解方式配置对象与表的关系映射?如何使用注解:以学生信息管理系统新增学生信息入库为例。【例子3.5-1c】学生信息管理系统中新生入学时需要录入学生信息,学生信息包括学生姓名,性别,年龄,学号等。要求使用hibernate注解方式完成学生信息新增功能(不要求页面,仅仅实现后台入库)。在数据库中学生表结构如表3.5-1a所示。表3.5-1a学生表student字段序号中文描述英文字段名字段类型备注流水号idintpk、notnull、自增学号studentNovarchar(50)notnull姓名studentNamevarchar(100)性别sexvarchar(2)年龄ageint步骤1:先在数据库中创建如表3.5-1a所示的学生表,然后在eclipse或myeclipse中创建web工程studentInfoManage,并把hibernate及数据库所需的jar文件拷贝到该工程WebContent/WEB-INF/lib目录下。其中,hibernate注解安装包(hibernate-annotations-3.4.0.GA.zip)需要解压三个jar包:hibernate-annotations.jar、lib\ejb3-persistence.jar、hibernate-commons-annotations.jar,另外,要求JDK5.0以上(JDK1.5以上)。步骤2:在工程中创建com.zdsoft.domain包,在该包下新建学生实体类Student,关键代码如下:@Entity@Table(name="student")publicclassStudent{@Id@GeneratedValue(generator="pkGenerator")@GenericGenerator(name="pkGenerator",strategy="native")privateintid;@ColumnprivateStringstudentName;@ColumnprivateStringstudentNo;@ColumnprivateStringsex;@Columnprivateintage; //以下省略get/set方法}.代码说明:@Entity声明一个实体类,必须配置项,将一个类声明为一个实体类(即一个持久化POJO类,该类是要和表进行映射的)。声明位置:声明在实体类定义的前面,本例声明了类Student是一个实体类。@Table(name="student")常见语法:@Table(name=“表名”);位置:声明在类定义的前面;说明:声明了该实体类映射关联的表(table)。name属性就是指定表名。若没有使用该声明,默认映射与类名相同的表名。本例指定实体类Stuent映射的表是student。通常可以将@Entity与@Table两种注解简化配置为:@Entity(name=”student”)。@Id必须配置项,用来声明主键,常见语法:@Id();位置:声明在某个类成员变量或该成员变量的get方法前;本例声明了该实体类Student类的成员变量id为主键属性(对应表中的主键)。注意:若该注解没有参数,则类中成员变量名必须与表中的主键名一致。@GeneratedValue(generator="pkGenerator")@GenericGenerator(name="pkGenerator",strategy="native")组合配置项,用来声明主键值的生成方式,常见语法:@GeneratedValue(generator=“生成器名字")@GenericGenerator(name=“生成器名字”,strategy=“生成策略")声明位置:声明在@id后面,@GeneratedValue与@GenericGenerator配合使用;用来指定在增加记录到表中时,其主键值的赋值方式;生成器名字:程序员自定;生成策略:关键字,由hibernate框架提供了10多种生成策略,本例指定native就是将主键的生成工作交由数据库完成,hibernate不管(很常用),其他生成策略参见表3.5-1b所示。表3.5-1bhibernate框架提供的生成策略序号生成策略使用说明native对于orcale采用Sequence方式,对于MySQL和SQLServer采用identity(处境主键生成机制),native就是将主键的生成工作将由数据库完成,hibernate不管(很常用)

例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="native")uuid采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="uuid")hilo要在数据库中建立一张额外的表,默认表名为hibernate_unque_key,默认字段为integer类型,名称是next_hi(比较少用)例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="hilo")assigned在插入数据的时候主键由程序处理(很常用),这是<generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。例:

@GenericGenerator(name="",strategy="assigned")identity使用SQLServer和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQLServer中很常用)。等同于JPA中的IDENTITY,例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="identity")select使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="select")sequence调用谨慎数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="sequence",

parameters={@Parameter(name="sequence",value="seq_payablemoney")})seqhilo通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持Sequence的数据库,如Orcale(比较少用)例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="seqhilo",

parameters={@Parameter(name="max_lo",value="5")})increnment插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="increnment")foreign使用另一个相关的对象的主键。通常和<one-to-one>联合起来使用。例:@Id

@GeneratedValue(generator="idGenerator")

@GenericGenerator(name="idGenerator",strategy="foreign",parameters={@Parameter(name="property",value="info")})

Integerid;

@OneToOne

EmployeeInfoinfo;guid采用数据库底层的guid算法机制,对应MySQL的uuid()函数,SQLServer的newid()函数,ORCALE的rawtohex(sys_guid())函数等。例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="guid")uuid.hex类似uuid,建议用uuid替换,例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="uuid.hex")sequence-identitysequence策略的扩展,采用立即检索策略来获取sequence值,需要JDBC3.0和JDK4以上(含1.4)版本,例:@GeneratedValue(generator="paymentableGenerator")

@GenericGenerator(name="paymentableGenerator",strategy="sequence-identity",

parameters={@Parameter(name="sequence",value="seq_payablemoney")})@Column可选配置项,声明非主键字段,常见语法:@Column(name=“列名”);声明位置:声明在某个类成员变量或该成员变量的get方法前;声明了该实体类的非主键属性(对应表中的某个非主键的字段)其中,name属性指定表中的某个非主键列名,可选,默认列名与实体类的成员变量名一样。@Column注解的其他属性说明:unique可选,是否唯一(默认值false);nullable可选,是否为空(默认值false)insertable可选,该列是否可以增加(默认值true);updatable可选,该列是否可以更新(默认值true);columnDefinition可选,为这个特定列覆盖sql的ddl片段(这可能导致无法在不同数据库间移植);table可选,定义对应的表(默认为主表);length可选,列长度(默认值255);precision可选,列十进制精度(decimalprecision)(默认值0);scale可选,如果列十进制数值范围(decimalscale)可用,可以设置(默认值0)。步骤3:编写hibernate.cfg.xml文件,加入实体类映射配置,关键代码如下:<mappingclass="com.zdsoft.domain.Student"/>代码说明:此处修改改变了hibernate加载持久化对象的方式。在使用xml配置文件方式下使用的是Student.hbm.xml映射文件,在使用注解方式下直接配置Student类。注:目前版本的hibernate,两种方式不能混用。步骤4:新建数据库处理类StudentDao,其中创建sessionFactory的关键代码(与使用配置文件进行映射的不一样),两者不能混用:注解方式:newAnnotationConfiguration().configure().buildSessionFactory();配置文件方式:newConf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论