15-Hibernate组件框架.ppt

上传人:hyn****60 文档编号:70309310 上传时间:2023-01-19 格式:PPT 页数:45 大小:642KB
返回 下载 相关 举报
15-Hibernate组件框架.ppt_第1页
第1页 / 共45页
15-Hibernate组件框架.ppt_第2页
第2页 / 共45页
点击查看更多>>
资源描述

《15-Hibernate组件框架.ppt》由会员分享,可在线阅读,更多相关《15-Hibernate组件框架.ppt(45页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、HibernateHibernate组件框架组件框架目标u了解持久层概述u了解Hibernate的基本组件及接口u掌握基础语法u熟悉基础配置u了解基于hibernate的开发流程及简单应用u理解持久化对象的生命周期Hibernate?u直接使用JDBC操作数据库的步骤很繁琐uJDBC操作的是关系型数据库u我们用JAVA开发程序,则使用面向对象的思想uHibernate正是在这两种不同的模型之间建立关联,Hibernate给我们提供了利用面向对象的思想来操作关系型数据的接口什么是关系模型(Relational Model)?u关系模型把世界看作是由实体(Entity)和联系(Relationsh

2、ip)构成的。u所谓实体就是指现实世界中具有区分与其它事物的特征或属性并与其它实体有联系的对象。在关系模型中实体通常是以表的形式来表现的。表的每一行描述实体的一个实例,表的每一列描述实体的一个特征或属性。u所谓联系就是指实体之间的关系,即实体之间的对应关系。1:1 1:nm:n u关系数据库表字段主键外键什么是面向对象?u面向对象三大特征:封装、继承(一般与特殊)、多态(覆盖与重载)u类u对象u属性u关系一般与特殊关系(is a)组成(has a)关联及其多重性1:11:nm:n双向关联与单向关联对象关系映射(Object Relational Mapping,简称ORM)uORM是一种为了解

3、决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。uWhy ORM?面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 关系数据库是企业级应用环境中永久存放数据的主流数据存储系统 u字母O起源于“对象”(Object),而R则来自于“关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和呈现层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。u当你开发一个应用程

4、序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。而这些代码写起来总是重复的。什么是Hibernate?u对象/关系映射一直都是数据库技术中的难点,尽管人们提出了许多方案解决这个问题,但都不能完全做到即便利又高效。EJB的推出让人们看到了希望,但实践证明实体Bean的效率并不高,并且还十分难于为初学者理解。由Gavin King创建的Hibernate框架,从某种程序上正在朝着正确的方向迈走,并且得到越来越多IT从业人员的认可。就像当年的Struts框架一样,Hibernate也已经在许多项目中得到广泛应用。Hibernate

5、由于投注了更多的精力在提升效率上,使用起来又十分方便,新版的EJB规范正在向Hibernate方向靠拢。正是由于得到广泛的认可,Hibernate已经成为程序员必须掌握的技术之一。Hibernate能做什么?-理解O/R映射uHibernate能帮助我们利用面向对象面向对象的思想,开发基于关系型基于关系型数据库数据库的应用程序第一:将对象数据保存到数据库第二:将数据库数据读入对象中u基于B/S的典型三层架构关于分层关于分层 业务逻辑层和持久化层绝对不能依赖于展现层持久化与持久层u什么是持久化?什么是持久化?u将数据保存到物理的储存器(硬盘、磁带等)上的过程叫持久化。u什么是持久层?什么是持久层

6、?u专门负责处理与物理数据相关操作(持久化数据,以供日后使用)的独立层次。u“持久化持久化”与与“持久层持久层”之间的关系?之间的关系?u持久化是动词,表示将内存中的数据存储到数据库或其他媒介。u持久层是名词,实现数据持久化的一个相对独立的领域(层),将数据使用者与数据实体相分离。问题问题:上图中哪些具有持久化过程?哪些具有持久层?问题:问题:上图中哪些具有持久化过程?哪些具有持久层?问题问题:上图中哪些具有持久化过程?哪些具有持久层?问题问题:上图中哪些具有持久化过程?哪些具有持久层?持久层与MVC持久层解决了什么问题?持久层解决了什么问题?当发生以下三种情况的时候,数据持久化代码不需要重新

7、编译(1)表示层发生变化(2)业务逻辑层发生变化(3)底层数据格式或持久化机制发生变化Hibernate与O、R之间的关系快速起步准备工作快速起步准备工作:下载地址http:/www.hibernate.org。将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:commons-collections.jar,commons-logging.jar,antlr.jar,cglib.jar,asm.jar,jta.jar,dom4j.jar第一个Hibernate应用 u教学目标创建Hibernate的配置文件创建持久化类创建数据库Sc

8、hema创建对象-关系映射文件映射文件的文档类型定义(DTD)把Customer持久化类映射到CUSTOMERS表通过Hibernate API操纵数据库在Java应用中使用Hibernate的步骤u创建Hibernate的配置文件u创建持久化类u创建对象-关系映射文件u通过Hibernate API编写访问数据库的代码Helloapp应用的结构Hibernate的配置文件(hibernate.properties)hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.

9、mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql:/localhost:3306/SAMPLEDB hibernate.connection.username=roothibernate.connection.password=1234hibernate.show_sql=trueHibernate配置文件的属性创建持久化类Customeru持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。u持久化类有一个id属性,用来惟一标识Customer类的每个对象。在面向对象术语中,这个id属

10、性被称为对象标识符(OID,Object Identifier),通常它都用整数表示 uHibernate要求持久化类必须提供一个不带参数的默认构造方法 创建数据库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,IM

11、AGE blob,BIRTHDAY date,REGISTERED_TIME timestamp);blob (二进制大数据)binary large object创建对象-关系映射文件Customer.hbm.xml 元素映射OIDu子元素用来设定标识符生成器。Hibernate提供了提供了多种内置的实现。MySQL中:ID bigint auto_increment primary key元素映射值类型属性uname属性:指定持久化类的属性的名字。ucolumn属性:指定与类的属性映射的表的字段名。utype属性:指定Hibernate映射类型。Hibernate映射类型是Java类型与S

12、QL类型的桥梁。uJava类型:StringSQL类型:varcharHibernate类型:stringJava类型、类型、Hibernate映射类型以及映射类型以及SQL类型之间的对应关系类型之间的对应关系 Customer.hbm.xml配置的对象-关系映射 classesmypackCustomer.classclassesmypackCustomer.hbm.xml采用采用XML文件来配置对象文件来配置对象-关系映射的优点关系映射的优点uHibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。u软件开发人员可以独立设计域模型,不必强迫遵守任何规范。u数据库设计人员可以

13、独立设计数据模型,不必强迫遵守任何规范。u对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。通过通过HibernateAPI操纵数据库操纵数据库 通过通过HibernateAPI操纵数据库操纵数据库 创建创建BusinessService类类 u初始化Hibernateu通过Hibernate的Session接口操纵数据库:保存Customer对象更新Customer对象加载Customer对象删除Customer对象检索Customer对象Hibernate的初始化的初始化 static try /

14、根据默认位置的Hibernate配置文件的配置信息,创建一个 /Configuration实例 Configuration config=new Configuration();config.addClass(Customer.class);/创建SessionFactory实例*/sessionFactory=config.buildSessionFactory();catch(Exception e)e.printStackTrace();Hibernate的初始化的初始化 u(1)创建一个Configuration类的实例,Configuration类的构造方法把默认文件路径下的hibe

15、rnate.properties配置文件中的配置信息读入到内存:Configuration config=new Configuration();u(2)调用Configuration类的addClass(Customer.class)方法:config.addClass(Customer.class);该方法把默认文件路径下的Customer.hbm.xml文件中的映射信息读入到内存中。u(3)调用Configuration类的buildSessionFactory()方法:sessionFactory=config.buildSessionFactory();SessionFactory接

16、口接口 u一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。Session接口接口 uSession接口是Hibernate应用使用最广泛的接口。uSession也被称为持久化管理器

17、,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。uSession有以下特点:不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。Session接口操纵数据库的方法uSession接口提供了操纵数据库的各种方法,如:save()方法:把Java对象保存数据库中。update()方法:更新数据库中的Java对象。delet

18、e()方法:把Java对象从数据库中删除。load()或get()方法:从数据库中加载Java对象。find()方法:从数据库中查询Java对象。在 Hibernate3中,该方法已经被废弃。Hibernate提供了专门的Query查询接口。用用Session来执行事务的流程来执行事务的流程 Session session=factory.openSession();Transaction tx;try /开始一个事务 tx=session.beginTransaction();/执行事务 ./提交事务 mit();catch(Exception e)/如果出现异常,就撤销事务 if(tx!=

19、null)tx.rollback();throw e;finally /不管事务执行成功与否,最后都关闭Session session.close();正常执行数据库事务的流程正常执行数据库事务的流程 saveCustomer()方法u该方法调用Session的save()方法,把Customer对象持久化到数据库中。tx=session.beginTransaction();session.save(customer);mit();u当运行session.save()方法时,Hibernate执行以下SQL语句:insert into CUSTOMERS(ID,NAME,EMAIL,PASS

20、WORD,PHONE,ADDRESS,SEX,IS_MARRIED,DESCRIPTION,IMAGE,BIRTHDAY,REGISTERED_TIME)values(1,Tom,1234,55556666,Shanghai,M,0,I am very honest.,1980-05-06,null)u在test()方法中并没有设置Customer对象的id属性,Hibernate会根据映射文件的配置,采用increment标识符生成器自动以递增的方式为OID赋值。在Customer.hbm.xml文件中相关的映射代码如下:findAllCustomers()方法u该方法通过Query接口查询

21、所有的Customer对象。tx=session.beginTransaction();/开始一个事务Query query=session.createQuery(from Customer as c order by c.name asc);List customers=query.list();for(Iterator it=customers.iterator();it.hasNext();)printCustomer(context,out,(Customer)it.next();mit();/提交事务uSession的createQuery()方法的参数“from Customer

22、 as c order by c.name asc”使用的是Hibernate查询语言。运行Query.list()方法时,Hibernate执行以下SQL语句:select*from CUSTOMERS order by NAME asc;HQL查询语句Hibernate Query LanguageloadAndUpdateCustomer()方法u该方法调用Session的get()方法,加载Customer对象,然后再修改Customer对象的属性。tx=session.beginTransaction();Customer c=(Customer)session.get(Custom

23、er.class,customer_id);c.setAddress(address);/修改内存中Customer对象的address属性 mit();u以上代码先调用Session的get()方法,它按照参数指定的OID从数据库中检索出匹配的Customer对象,Hibernate会执行以下SQL语句:select*from CUSTOMERS where ID=1;uloadAndUpdateCustomer()方法接着修改Customer对象的address属性。那么,Hibernate会不会同步更新数据库中相应的CUSTOMERS表的记录呢?答案是肯定的。Hibernate采用脏检查

24、机制,按照内存中的Customer对象的状态的变化,来同步更新数据库中相关的数据,Hibernate会执行以下SQL语句:update CUSTOMERS set NAME=Tom,EMAIL=TADDRESS=Beijing where ID=1;u尽管只有Customer对象的address属性发生了变化,但是Hibernate执行的update语句中会包含所有的字段。内存Session对象的缓存loadAndUpdateCustomer()方法CUSTOMERS记录Customer对象加载同步更新当Customer对象位于Session对象的缓存中,当Customer对象的属性发生变化,

25、Session对象会自动同步更新数据库。deleteCustomer()方法u该方法调用Session的delete()方法,删除特定的Customer对象:tx=session.beginTransaction();session.delete(customer);mit();u运行session.delete()方法时,Hibernate根据Customer对象的OID,执行以下SQL delete语句:delete from CUSTOMERS where ID=1;持久化对象的生命周期(lifecycle)Customer对象的状态转换过程 用用Session的的update()方法关

26、联游离对象方法关联游离对象Customercustomer=newCustomer();customer.setName(Tom);Sessionsession1=sessionFactory.openSession();Transactiontx1=session1.beginTransaction();session1.save(customer);mit();/此时此时Customer对象变为游离对象对象变为游离对象session1.close();Sessionsession2=sessionFactory.openSession();Transactiontx2=session2.b

27、eginTransaction();/在和在和session2关联之前修改关联之前修改Customer对象的属性对象的属性customer.setName(Linda);session2.update(customer);/在和在和session2关联之后修改关联之后修改Customer对象的属性对象的属性customer.setName(Jack);mit();session2.close();Session的的update()方法方法uSession的的update()方法完成以下操作:方法完成以下操作:(1)把)把Customer对象重新加入到对象重新加入到Session缓存中,使缓存中,使它变为持久化对象。它变为持久化对象。(2)计划执行一个)计划执行一个update语句。值得注意的是,语句。值得注意的是,Session只有在清理缓存的时候才会执行只有在清理缓存的时候才会执行update语句,语句,并且在执行时才会把并且在执行时才会把Customer对象当前的属性值组装到对象当前的属性值组装到update语句中。因此,即使程序中多次修改了语句中。因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次对象的属性,在清理缓存时只会执行一次update语句。语句。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com