您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > ITjob就业培训java教材34
第三十四章:Hibernate基础ITJob就业培训677第三十四章:Hibernate基础学习目标理解ORM机制理解Hibernate的工作原理Hibernate的配置和对象-映射文件理解对象持久化第三十四章:Hibernate基础ITJob就业培训678Hibernate简介Hibernate是Java应用和关系数据库之间的桥梁,它负责Java对象关系数据之间的映射。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。在Java应用中使用Hibernate包含以下步骤。(1)创建Hibernate的配置文件。(2)创建持久化类。(3)创建对象-关系映射文件。(4)通过HibernateAPI编写访问数据库的代码。建立简单的Hibernate应用本章通过一个简单的例子customerApp应用,演示如何运用Hibernate来访问关系数据库。customerApp应用的功能非常简单:通过Hibernate保存、更新、删除、加载以及查询Customer对象。创建Hibernate的配置文件Hibernate从其配置文件中读取和数据库连接有关的信息,这个配置文件应该位于应用的classpath中。Hibernate的配置文件有两种形式:一种是XML格式的文件;还有一种是Java属性文件,采用“健=值”的形式。下面介绍如何以Java属性文件的格式来创建Hibernate的配置文件。这种配置文件的默认文件名为hibernate.properties。hibernate.properties的内容如下:hibernate.dialect=net.sf.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEBhibernate.connection.username=roothibernate.connection.password=1234hibernate.show_sql=true以上hibernate.properties文件包含了一系列属性及其属性值,Hibernate将根据这些属性来连接数据库,本例为连接MySQL数据库的配置代码。下表对以上hibernate.properties文件中的所有属性做了描述。属性描述hibernate.dialectSQL指定数据库使用的方言hibernate.connection.driver_class指定数据库的驱动程序hibernate.connection.urlURL指定连接数据库的hibernate.connection.username指定连接数据库的用户名hibernate.connection.password指定连接数据库的口令hibernate.show_sql如果为true,表示在程序运行时,会在控制台输出SQL语句,这有利于跟踪Hibernate的运行状态。默认为false。在应用开发和测试阶段,可以把这个属性设为true,以便跟踪和调试应用程序,在应用发布阶段,应该把这个属性设为false,以便减少应用的输出信息,提高运行性能。Hibernate能够访问多种关系数据库,如MySQL、Oracle和Sybase等。尽管多数关系数据库都支持标准的SQL语言,但是它们往往还有各自的SQL方言,就象不同地区的人既能说标准的普通话,还能讲各自的方言一样。hibernate.dialect属性用于指定被访问数据库使用的SQL方言,当Hibernate生成SQL查询语句,或者使用native对象标识符生成策略时,都会参考本地数据库的SQL方言。创建持久化类第三十四章:Hibernate基础ITJob就业培训679持久化类是指其实例需要被Hibernate持久化到数据库中的类。持久化类通常都是域模型中的实体域类。持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。以下定义了一个名为Customer的持久化类。packagecom.itjob.jiaowu.hibernate;importjava.io.Serializable;importjava.sql.Date;importjava.sql.Timestamp;publicclassCustomerimplementsSerializable{privateLongid;privateStringname;privateStringemail;privateStringpassword;privateintphone;privatebooleanmarried;privateStringaddress;privatecharsex;privateStringdescription;privatebyte[]image;privateDatebirthday;privateTimestampregisteredTime;publicCustomer(){}publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}//此处省略email、password和phone等属性的getXXX()和setXXX()方法……}持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。getXXX()和setXXX()方法必须符合特定的命名规则,“get”和第三十四章:Hibernate基础ITJob就业培训680“set”后面紧跟属性的名字,并且属性名的首字母为大写,例如name属性的get方法为getName(),如果把get方法写为getname()或者getNAME(),会导致Hibernate在运行时抛出以下异常:net.sf.hibernate.PropertyNotFoundException:Couldnotfindagetterforpropertynameinclasscom.itjob.jiaowu.hibernate.Customer如果持久化类的属性为boolean类型,那么它的get方法名既可以用“get”作为前缀,也可以用“is”作为前缀。例如Customer类的married属性为boolean类型,因此以下两种get方法是等价的:publicbooleanisMarried(){returnmarried;}或者publicbooleangetMarried(){returnmarried;}Hibernate并不要求持久化类必须实现java.io.Serializable接口,但是对于采用分布式结构的Java应用,当Java对象在不同的进程节点之间传输时,这个对象所属的类必须实现Serializable接口,此外,在JavaWeb应用中,如果希望对HttpSession中存放的Java对象进行持久化,那么这个Java对象所属的类也必须实现Serializable接口。Customer持久化类有一个id属性,用来惟一标识Customer类的每个对象。在面向对象术语中,这个id属性被称为对象标识符(OID,ObjectIdentifier),通常它都用整数表示,当然也可以设为其他类型。如果customerA.getId().equals(customerB.getId())的结果是true,就表示customerA和customerB对象指的是同一个客户,它们和CUSTOMERS表中的同一条记录对应。Hibernate要求持久化类必须提供一个不带参数的默认构造方法,在程序运行时,Hibernate运用Java反射机制,调用java.lang.reflect.Constructor.newInstance()方法来构造持久化类的实例。如果对这个持久化类使用延迟检索策略,为了使Hibernate能够在运行时为这个持久化类创建动态代理,要求持久化类的默认构造方法的访问级别必须是public或protected类型,而不能是default或private类型。在Customer类中没有引入任何HibernateAPI,Customer类不需要继承Hibernate的类,或实现Hibernate的接口,这提高了持久化类的独立性。如果日后要改用其他的ORM产品,比如由Hibernate改为OJB,不需要修改持久化类的代码。创建数据库Schema在本例中,与Customer类对应的数据库表名为CUSTOMERS,它在MySQL数据库中的DDL定义如下:createtableCUSTOMERS(IDbigintnotnullprimarykey,NAMEvarchar(15)notnull,EMAILvarchar(128)notnull,PASSWORDvarchar(8)notnull,PHONEint,ADDRESSvarchar(255),SEXchar(1),IS_MARRIEDbit,第三十四章:Hibernate基础ITJob就业培训681DESCRIPTIONtext,IMAGEblob,BIRTHDAYdate,REGISTERED_TIMEtimestamp);CUSTOMERS表有一个ID字段,它是表的主键,它和Customer类的id属性对应。CUSTOMERS表中的字段使用了各种各样的SQL类型,参见下表。字段名SQL类型说明IDBIGINT整数,占8字节,取值范围为:-2^63~2^63-1NAMEVARCHAR变长字符串,占0~255个字节SEXCHAR定长字符串,占0~255个字节IS_MARRIEDBIT布尔类型DESCRIPTIONTEXT长文本数据,占0~65535255字节。如果字符串长度小于255,可以用VARCHAR或CHAR类型来表示。如果字符串长度大于255,可以定义为TEXT类型。IMAGEBLOB二进制长数据,占0~65535字节,BLOB是BinaryLargeObject的缩写。IMAGE在本例中,字段用来存放图片数据BIRTHDAYDATE代表日期,格式为“YYYY-MM-DD”REGISTERED_TIMETIMESTAMP代表日期和时间,格式为“YYYYMMDDHHMMSS”创建对象-关系映射文件Hibernate采用XML格式的文件来指定对象和关系数据之间的映射。在运行时,Hibernate将根据这个映射文件来生成各种SQL语句。在本例中,将创建一个名为Customer.hbm.xml的文件,它用于把Customer类映射到CUSTOMERS表,这个文件应该和Customer.class文件存放在同一个目录下。以下为Customer.hbm.xml文件的源代码。?xmlversion=1.0?!DOCTYPEhibernate-mappingPUBLIC-//Hibernate/HibernateMappingDTD2.0//EN=mypack.Customertable=CUSTOMERSidname=idcolumn=IDtype=longgeneratorclass=increment//idpropertyname=namecolumn=NAMEtype=stringnot-null=true/propertyname=emailc
本文标题:ITjob就业培训java教材34
链接地址:https://www.777doc.com/doc-6981237 .html