首页 > > > 02_hibernateapp.pdf

02_hibernateapp.pdf

02_hibernateapp.pdf

上传者: 小公子 2011-06-21 评分1 评论0 下载7 收藏10 阅读量115 暂无简介 简介 举报

简介:本文档为《02_hibernateapppdf》,可适用于软件工程领域,主题内容包含第一个Hibernate应用n教学目标n创建Hibernate的配置文件n创建持久化类n创建数据库Scheman创建对象关系映射文件n映射文件的文档符等。

第一个Hibernate应用 n 教学目标 n 创建Hibernate的配置文件 n 创建持久化类 n 创建数据库Schema n 创建对象-关系映射文件 n 映射文件的文档类型定义(DTD) n 把Customer持久化类映射到CUSTOMERS表 n 通过Hibernate API操纵数据库 n 用ANT工具管理项目 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 在Java应用中使用Hibernate的步骤 n 创建Hibernate的配置文件 n 创建持久化类 n 创建对象-关系映射文件 n 通过Hibernate API编写访问数据库的代 码 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Helloapp应用的结构 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Hibernate的配置文件(hibernate.properties) hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB hibernate.connection.username=root hibernate.connection.password=1234 hibernate.show_sql=true PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Hibernate配置文件的属性 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 创建持久化类Customer n 持久化类符合JavaBean的规范,包含一些属性, 以及与之对应的getXXX()和setXXX()方法。 n 持久化类有一个id属性,用来惟一标识 Customer类的每个对象。在面向对象术语中, 这个id属性被称为对象标识符(OID,Object Identifier),通常它都用整数表示 n Hibernate要求持久化类必须提供一个不带参数 的默认构造方法 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 创建数据库Schema create table CUSTOMERS ( ID bigint not null primary key, NAME varchar(15) not null, EMAIL varchar(128) not null, PASSWORD varchar(8) not null, PHONE int , ADDRESS varchar(255), SEX char(1) , IS_MARRIED bit, DESCRIPTION text, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp ); PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 创建对象-关系映射文件Customer.hbm.xml <hibernate-mapping> <class name="mypack.Customer" table="CUSTOMERS"> <id name="id" column="ID" type="long"> <generator class="increment"/> </id> <property name="name" column="NAME" type="string" not-null="true" /> <property name="email" column="EMAIL" type="string" not-null="true" /> <property name="password" column="PASSWORD" type="string" not- null="true"/> <property name="phone" column="PHONE" type="int" /> <property name="address" column="ADDRESS" type="string" /> <property name="sex" column="SEX" type="character"/> …… </class> </hibernate-mapping> PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn <id>元素映射OID n <generator>子元素用来设定标识符生成器。Hibernate提供了提 供了多种内置的实现。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn <property>元素映射值类型属性 n name属性:指定持久化类的属性的名字。 n type属性:指定Hibernate映射类型。 Hibernate映射类型是Java类型与SQL类型的桥 梁。 n column属性:指定与类的属性映射的表的字段 名。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Java类型、Hibernate映射类型以及SQL类型之间的对应关系 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Customer.hbm.xml配置的对象-关系映射 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 采用XML文件来配置对象-关系映射的优点 n Hibernate既不会渗透到上层域模型中,也不会 渗透到下层数据模型中。 n 软件开发人员可以独立设计域模型,不必强迫 遵守任何规范。 n 数据库设计人员可以独立设计数据模型,不必 强迫遵守任何规范。 n 对象-关系映射不依赖于任何程序代码,如果需 要修改对象-关系映射,只需修改XML文件,不 需要修改任何程序,提高了软件的灵活性,并 且使维护更加方便。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 通过Hibernate API操纵数据库 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 通过Hibernate API操纵数据库 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 创建BusinessService类 n 初始化Hibernate n 通过Hibernate的Session接口操纵数据库: n 保存Customer对象 n 更新Customer对象 n 加载Customer对象 n 删除Customer对象 n 检索Customer对象 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Hibernate的初始化 static{ try{ // 根据默认位置的Hibernate配置文件的配置信息,创建一个 //Configuration实例 Configuration config = new Configuration(); config.addClass(Customer.class); // 创建SessionFactory实例 */ sessionFactory = config.buildSessionFactory(); }catch(Exception e){e.printStackTrace();} } PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Hibernate的初始化 n (1)创建一个Configuration类的实例,Configuration类的构造方 法把默认文件路径下的hibernate.properties配置文件中的配置信 息读入到内存: Configuration config = new Configuration(); n (2)调用Configuration类的addClass(Customer.class)方法: config.addClass(Customer.class); 该方法把默认文件路径下的Customer.hbm.xml文件中的映射信息 读入到内存中。 n (3)调用Configuration类的buildSessionFactory()方法: sessionFactory = config.buildSessionFactory(); PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn SessionFactory接口 n 一个SessionFactory实例对应一个数据存储源, 应用从SessionFactory中获得Session实例。 SessionFactory有以下特点: n 它是线程安全的,这意味着它的同一个实例可以被 应用的多个线程共享。 n 它是重量级的,这意味着不能随意创建或销毁它的 实例。如果应用只访问一个数据库,只需要创建一 个SessionFactory实例,在应用初始化的时候创建 该实例。如果应用同时访问多个数据库,则需要为 每个数据库创建一个单独的SessionFactory实例。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Session接口 n Session接口是Hibernate应用使用最广泛的接口。 n Session也被称为持久化管理器,它提供了和持久化相 关的操作,如添加、更新、删除、加载和查询对象。 n Session有以下特点: n 不是线程安全的,因此在设计软件架构时,应该避免多个线 程共享同一个Session实例。 n Session实例是轻量级的,所谓轻量级是指它的创建和销毁不 需要消耗太多的资源。这意味着在程序中可以经常创建或销 毁Session对象,例如为每个客户请求分配单独的Session实例, 或者为每个工作单元分配单独的Session实例。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn Session接口操纵数据库的方法 n Session接口提供了操纵数据库的各种方法,如: n save()方法:把Java对象保存数据库中。 n update()方法:更新数据库中的Java对象。 n delete()方法:把Java对象从数据库中删除。 n load()方法:从数据库中加载Java对象。 n find()方法:从数据库中查询Java对象。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 用Session来执行事务的流程 Session session = factory.openSession(); Transaction tx; try { //开始一个事务 tx = session.beginTransaction(); //执行事务 ... //提交事务 tx.commit(); } catch (Exception e) { //如果出现异常,就撤销事务 if (tx!=null) tx.rollback(); throw e; } finally { //不管事务执行成功与否,最后都关闭Session session.close(); } PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 正常执行数据库事务的流程 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn saveCustomer()方法 n 该方法调用Session的save()方法,把Customer对象持久化到数据库中。 tx = session.beginTransaction(); session.save(customer); tx.commit(); n 当运行session.save()方法时,Hibernate执行以下SQL语句: insert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED,DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME) values(1,'Tom','tom@yahoo.com','1234',55556666,'Shanghai','M',0,'I am very honest.', ,'1980-05-06',null) n 在test()方法中并没有设置Customer对象的id属性,Hibernate会根据映射 文件的配置,采用increment标识符生成器自动以递增的方式为OID赋值。 在Customer.hbm.xml文件中相关的映射代码如下: <id name="id" column="ID" type="long"> <generator class="increment"/> </id> PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn findAllCustomers()方法 n 该方法调用Session的find()方法,查询所有的Customer对象。 tx = session.beginTransaction(); List customers=session.find("from Customer as c order by c.name asc"); for (Iterator it = customers.iterator(); it.hasNext();) { printCustomer(context,out,(Customer) it.next()); } tx.commit(); n Session的find()方法有好几种重载形式,本例中传递的是字符串 参数“from Customer as c order by c.name asc”,它使用的是 Hibernate查询语言。运行session.find()方法时, Hibernate执行 以下SQL语句: select * from CUSTOMERS order by NAME asc; PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn loadAndUpdateCustomer ()方法 n 该方法调用Session的load()方法,加载Customer对象,然后再修改Customer对象 的属性。 tx = session.beginTransaction(); Customer c=(Customer)session.load(Customer.class,customer_id); c.setAddress(address); tx.commit(); n 以上代码先调用Session的load()方法,它按照参数指定的OID从数据库中检索出 匹配的Customer对象,Hibernate会执行以下SQL语句: select * from CUSTOMERS where ID=1; n loadAndUpdateCustomer()方法接着修改Customer对象的address属性。那么, Hibernate会不会同步更新数据库中相应的CUSTOMERS表的记录呢?答案是肯定 的。Hibernate采用脏检查机制,按照内存中的Customer对象的状态的变化,来同 步更新数据库中相关的数据,Hibernate会执行以下SQL语句: update CUSTOMERS set NAME="Tom",EMAIL="Tom@yahoo.com"…ADDRESS="Beijing"… where ID=1; n 尽管只有Customer对象的address属性发生了变化,但是Hibernate执行的update 语句中会包含所有的字段。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn printCustomer()方法 n 该方法打印Customer对象的信息, private void printCustomer(Customer customer)throws Exception{ byte[] buffer=customer.getImage(); FileOutputStream fout=new FileOutputStream("photo_copy.gif"); fout.write(buffer); fout.close(); System.out.println("------以下是"+customer.getName()+"的个人信息---- --"); System.out.println("ID: "+customer.getId()); System.out.println("口令: "+customer.getPassword()); System.out.println("E-Mail: "+customer.getEmail()); System.out.println("电话: "+customer.getPhone()); …… } PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn deleteAllCustomers()方法 n 该方法调用Session的delete()方法,删除所有的 Customer对象: tx = session.beginTransaction(); session.delete("from Customer as c"); tx.commit(); n 运行session.delete()方法时,Hibernate先执行select 语句,查询CUSTOMERS表的所有Customer对象: select * from CUSTOMERS; n 接下来Hibernate根据Customer对象的OID,依次删除 每个对象: delete from CUSTOMERS where ID=1; PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 用ANT工具管理项目 n 在build.xml文件中先定义了三个属性: <property name="source.root" value="src"/> <property name="class.root" value="classes"/> <property name="lib.dir" value="lib"/> n source.root属性指定Java源文件的路径, class.root属性指定Java类的路径,lib.dir 属性指定所有JAR文件的路径。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn 用ANT工具管理项目 n 在build.xml文件中接着定义了三个target: n prepare target: 如果存在classes子目录,先将它删 除。接着重新创建classes子目录。然后把src子目录 下所有扩展名为“.properties”、“.hbm.xml”、“.xml” 以及“.gif”的文件拷贝到WEB-INF/classes目录下。 n compile target:编译src子目录下的所有Java源文 件。编译生成的类文件存放在WEB-INF/classes子目 录下。 n run target:运行BusinessService类。 n <target>元素的depends属性指定所依赖的target,当 运行run target时,会依次执行prepare target、 compile target和run target。 PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.com.cn

该用户的其他资料

  • 名称/格式
  • 评分
  • 下载次数
  • 资料大小
  • 上传时间

用户评论

0/200
    暂无评论
上传我的资料

相关资料

资料评价:

/ 30
所需积分:1 立即下载
返回
顶部
举报
资料
关闭

温馨提示

感谢您对爱问共享资料的支持,精彩活动将尽快为您呈现,敬请期待!