Hibernate组件框架

上传人:hs****ma 文档编号:569806857 上传时间:2024-07-31 格式:PPT 页数:46 大小:1.40MB
返回 下载 相关 举报
Hibernate组件框架_第1页
第1页 / 共46页
Hibernate组件框架_第2页
第2页 / 共46页
Hibernate组件框架_第3页
第3页 / 共46页
Hibernate组件框架_第4页
第4页 / 共46页
Hibernate组件框架_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《Hibernate组件框架》由会员分享,可在线阅读,更多相关《Hibernate组件框架(46页珍藏版)》请在金锄头文库上搜索。

1、Hibernate组件框架组件框架Hibernate?u直接使用JDBC操作数据库的步骤很繁琐uJDBC操作的是关系型数据库u我们用JAVA开发程序,则使用面向对象的思想uHibernate正是在这两种不同的模型之间建立关联,Hibernate给我们提供了利用面向对象的思想来操作关系型数据的接口什么是关系模型(Relational Model)?u关系模型把世界看作是由实体(Entity)和联系(Relationship)构成的。 u所谓实体就是指现实世界中具有区分与其它事物的特征或属性并与其它实体有联系的对象。在关系模型中实体通常是以表的形式来表现的。表的每一行描述实体的一个实例,表的每一列

2、描述实体的一个特征或属性。 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是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数

3、据从一种形式转换到另外一种形式。 uWhy ORM?面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 关系数据库是企业级应用环境中永久存放数据的主流数据存储系统 u字母O起源于“对象”(Object),而R则来自于“关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和呈现层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。 u当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。而这些代码写起来总是重复的。 Hibernate是

4、一个优秀的持久化框架什么是持久化?内存内存姓名:小颖姓名:小颖性别:女性别:女特长:英语、程序设计特长:英语、程序设计瞬时状态瞬时状态磁盘磁盘持久状态持久状态用用JDBC完成数据在持久和瞬时状完成数据在持久和瞬时状态间的转换态间的转换:stmt.execute().瞬时状态:瞬时状态:保存在内存的程序数据,程序退出保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态后,数据就消失了,称为瞬时状态持久状态:持久状态:保存在磁盘上的程序数据,程序退保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持出后依然存在,称为程序数据的持久状态久状态持久化:持久化:将程序数据在瞬时状态和持久

5、状态将程序数据在瞬时状态和持久状态之间转换的机制之间转换的机制持久化持久化Hibernate是一个主流的ORM框架什么是ORM?对象数据(对象数据(OO)name:小颖:小颖sex:女:女skill:英语、程序设计:英语、程序设计User对象对象持久化层持久化层业务逻辑层业务逻辑层表现层表现层数据库数据库TBL_User表表关系型数据关系型数据(R R)映射信息映射信息ORM(对象(对象-关系映射):关系映射):完成对象数据到关系型数据映射的完成对象数据到关系型数据映射的机制称为对象机制称为对象-关系映射,简称关系映射,简称ORM。什么是Hibernate?u对象/关系映射一直都是数据库技术中

6、的难点,尽管人们提出了许多方案解决这个问题,但都不能完全做到即便利又高效。EJB的推出让人们看到了希望,但实践证明实体Bean的效率并不高,并且还十分难于为初学者理解。由Gavin King创建的Hibernate框架,从某种程序上正在朝着正确的方向迈走,并且得到越来越多IT从业人员的认可。就像当年的Struts框架一样,Hibernate也已经在许多项目中得到广泛应用。Hibernate由于投注了更多的精力在提升效率上,使用起来又十分方便,新版的EJB规范正在向Hibernate方向靠拢。正是由于得到广泛的认可,Hibernate已经成为程序员必须掌握的技术之一。Hibernate能做什么?

7、 - 理解O/R映射uHibernate能帮助我们利用面向对象面向对象的思想,开发基于关系型基于关系型数据库数据库的应用程序第一:将对象数据保存到数据库第二:将数据库数据读入对象中u基于B/S的典型三层架构关于分层关于分层 业务逻辑层和持久化层绝对不能依赖于展现层持久化与持久层什么是持久化?什么是持久化?将数据保存到物理的储存器(硬盘、磁带等)上的过程叫持久化。什么是持久层?什么是持久层?专门负责处理与物理数据相关操作(持久化数据,以供日后使用)的独立层次。“持久化持久化”与与“持久层持久层”之间的关系?之间的关系?持久化是动词,表示将内存中的数据存储到数据库或其他媒介。持久层是名词,实现数据

8、持久化的一个相对独立的领域(层),将数据使用者与数据实体相分离。问题:上图中哪些具有持久化过程?哪些具有持久层?问题:问题:上图中哪些具有持久化过程?哪些具有持久层?问题:上图中哪些具有持久化过程?哪些具有持久层?问题:上图中哪些具有持久化过程?哪些具有持久层?持久层与MVC持久层解决了什么问题?持久层解决了什么问题?当发生以下三种情况的时候,数据持久化代码不需要重新编译(1)表示层发生变化(2)业务逻辑层发生变化(3)底层数据格式或持久化机制发生变化Hibernate与O、R之间的关系使用Hibernate实现用户添加使用Hibernate的7个步骤:7 7、关闭关闭关闭关闭SessionS

9、ession6 6、提交事务提交事务提交事务提交事务 5 5、持久化操作持久化操作持久化操作持久化操作 save/update/delete/findsave/update/delete/find4 4、开始一个事务开始一个事务开始一个事务开始一个事务3 3、打开打开打开打开SessionSession1 1、ConfigurationConfiguration2 2、创建创建创建创建SessionFactorySessionFactory 使用Hibernate实现用户添加七个步骤对应的程序代码publicstaticvoidmain(Stringargs)Configurationconf

10、=newConfiguration().configure();/1、读取配置文件、读取配置文件SessionFactorysf=conf.buildSessionFactory();/2、创建、创建SessionFactorySessionsession=sf.openSession();/3、打开、打开SessionTransactiontx=null;trytx=session.beginTransaction();/4、开始一个事务、开始一个事务/5、持久化操作、持久化操作Useruser=newUser();user.setUname(Hibernateuser);user.setU

11、pass(password);session.save(user);mit();/6、提交事务提交事务catch(Exceptione)if(null!=tx)tx.rollback();e.printStackTrace();finallysession.close();/7、关闭、关闭Session执行结果执行结果Hibernate执行过程ConfigurationSessionFactorySessionTransaction创建创建创建创建开始开始mit()session.close()执行执行Hibernate.cfg.xmlFWXX.cfg.xmlUser.hbm.xml结束结束创

12、建和销毁都相当耗费创建和销毁都相当耗费资源,通常一个系统内资源,通常一个系统内一个数据库只创建一个一个数据库只创建一个类似于类似于JDBC中的中的Connection复杂的查询操作稍后介绍复杂的查询操作稍后介绍使用Hibernate实现数据的加载/删除/修改 程序代码Sessionsession=sf.openSession();Useruser=(User)session.get(User.class,id);session.close();System.out.println(user.getUname()+,+user.getUpass();根据主键加载根据主键加载tx=session.

13、beginTransaction();Useruser=this.testLoad(id);user.setUname(newName);session.update(user);mit();修改修改tx=session.beginTransaction();Useruser=this.testLoad(id);session.delete(user);mit();删除删除没有更新数据,没有更新数据,不进行事务控不进行事务控制制先加载,再更新先加载,再更新不再需要繁琐的逐字不再需要繁琐的逐字段编码段编码先加载,先加载,再删除再删除演示示例:演示示例:HibTest2.javaHibernate

14、的配置文件(hibernate.properties) hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql:/localhost:3306/SAMPLEDB hibernate.connection.username=roothibernate.connection.password=1234hibernate.show_sql=trueHibernate配置文件

15、的属性创建持久化类Customer持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。 持久化类有一个id属性,用来惟一标识Customer类的每个对象。在面向对象术语中,这个id属性被称为对象标识符(OID,Object Identifier),通常它都用整数表示 Hibernate要求持久化类必须提供一个不带参数的默认构造方法 创建数据库Schema create table CUSTOMERS ( ID bigint not null primary key, NAME varchar(15) not null, EMAIL varch

16、ar(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);blob (二进制大数据)binary large object创建对象-关系映射文件Customer.hbm.xml 元素映射OID子元素用来设定标识符生成器。Hibernate提供了提供了多种内置的实现。 MySQL中:ID b

17、igint auto_increment primary key元素映射值类型属性name属性:指定持久化类的属性的名字。column属性:指定与类的属性映射的表的字段名。type属性:指定Hibernate映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。Java类型:StringSQL类型:varcharHibernate类型:stringJava类型、类型、Hibernate映射类型以及映射类型以及SQL类型之间的对应关系类型之间的对应关系 Customer.hbm.xml配置的对象-关系映射 classesmypackCustomer.classclassesmyp

18、ackCustomer.hbm.xml采用采用XML文件来配置对象文件来配置对象-关系映射的优点关系映射的优点Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。软件开发人员可以独立设计域模型,不必强迫遵守任何规范。数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。通过通过HibernateAPI操纵数据库操纵数据库 通过通过HibernateAPI操纵数据库操纵数据库 创建创建BusinessService类类 初始化Hi

19、bernate通过Hibernate的Session接口操纵数据库:保存Customer对象更新Customer对象加载Customer对象删除Customer对象检索Customer对象Hibernate的初始化的初始化 static try / 根据默认位置的Hibernate配置文件的配置信息,创建一个 /Configuration实例 Configuration config = new Configuration(); config.addClass(Customer.class); / 创建SessionFactory实例 */ sessionFactory = config.bu

20、ildSessionFactory(); catch(Exception e)e.printStackTrace(); Hibernate的初始化的初始化 (1)创建一个Configuration类的实例,Configuration类的构造方法把默认文件路径下的hibernate.properties配置文件中的配置信息读入到内存: Configuration config = new Configuration();(2)调用Configuration类的addClass(Customer.class)方法: config.addClass(Customer.class); 该方法把默认文件

21、路径下的Customer.hbm.xml文件中的映射信息读入到内存中。(3)调用Configuration类的buildSessionFactory()方法: sessionFactory = config.buildSessionFactory();SessionFactory接口接口 一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获得Session实例。SessionFactory有以下特点:它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个

22、SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。Session接口接口 Session接口是Hibernate应用使用最广泛的接口。Session也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。Session有以下特点:不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户

23、请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。Session接口操纵数据库的方法Session接口提供了操纵数据库的各种方法,如:save()方法:把Java对象保存数据库中。update()方法:更新数据库中的Java对象。delete()方法:把Java对象从数据库中删除。load()或get()方法:从数据库中加载Java对象。find()方法:从数据库中查询Java对象。在 Hibernate3中,该方法已经被废弃。 Hibernate提供了专门的Query查询接口。用用Session来执行事务的流程来执行事务的流程 Session session

24、= factory.openSession(); Transaction tx; try /开始一个事务 tx = session.beginTransaction(); /执行事务 . /提交事务 mit(); catch (Exception e) /如果出现异常,就撤销事务 if (tx!=null) tx.rollback(); throw e; finally /不管事务执行成功与否,最后都关闭Session session.close(); 正常执行数据库事务的流程正常执行数据库事务的流程 saveCustomer()方法该方法调用Session的save()方法,把Custome

25、r对象持久化到数据库中。 tx = session.beginTransaction(); session.save(customer); mit();当运行session.save()方法时,Hibernate执行以下SQL语句: insert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED,DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME) values(1,Tom,,1234,55556666,Shanghai,M,0,I am very hon

26、est., ,1980-05-06,null)在test()方法中并没有设置Customer对象的id属性,Hibernate会根据映射文件的配置,采用increment标识符生成器自动以递增的方式为OID赋值。在Customer.hbm.xml文件中相关的映射代码如下: findAllCustomers()方法该方法通过Query接口查询所有的Customer对象。 tx = session.beginTransaction(); /开始一个事务Query query=session.createQuery(from Customer as c order by c.name asc);Li

27、st customers=query.list();for (Iterator it = customers.iterator(); it.hasNext();) printCustomer(context,out,(Customer) it.next();mit(); /提交事务Session的createQuery()方法的参数“from Customer as c order by c.name asc”使用的是Hibernate查询语言。运行Query.list()方法时, Hibernate执行以下SQL语句: select * from CUSTOMERS order by NAM

28、E asc;HQL查询语句Hibernate Query LanguageloadAndUpdateCustomer ()方法该方法调用Session的get()方法,加载Customer对象,然后再修改Customer对象的属性。 tx = session.beginTransaction(); Customer c=(Customer)session.get(Customer.class,customer_id); c.setAddress(address); /修改内存中Customer对象的address属性 mit();以上代码先调用Session的get()方法,它按照参数指定的O

29、ID从数据库中检索出匹配的Customer对象,Hibernate会执行以下SQL语句: select * from CUSTOMERS where ID=1;loadAndUpdateCustomer()方法接着修改Customer对象的address属性。那么,Hibernate会不会同步更新数据库中相应的CUSTOMERS表的记录呢?答案是肯定的。Hibernate采用脏检查机制,按照内存中的Customer对象的状态的变化,来同步更新数据库中相关的数据,Hibernate会执行以下SQL语句: update CUSTOMERS set NAME=Tom,EMAIL=TADDRESS=B

30、eijing where ID=1;尽管只有Customer对象的address属性发生了变化,但是Hibernate执行的update语句中会包含所有的字段。内存Session对象的缓存loadAndUpdateCustomer ()方法CUSTOMERS记录Customer对象加载同步更新当Customer对象位于Session对象的缓存中,当Customer对象的属性发生变化,Session对象会自动同步更新数据库。deleteCustomer()方法该方法调用Session的delete()方法,删除特定的Customer对象: tx = session.beginTransactio

31、n(); session.delete(customer); mit();运行session.delete()方法时,Hibernate根据Customer对象的OID,执行以下SQL delete语句: delete from CUSTOMERS where ID=1;持久化对象的生命周期(lifecycle) Customer对象的状态转换过程 用用Session的的update()方法关联游离对象方法关联游离对象Customercustomer=newCustomer();customer.setName(Tom);Sessionsession1=sessionFactory.openS

32、ession();Transactiontx1=session1.beginTransaction();session1.save(customer);mit();/此时此时Customer对象变为游离对象对象变为游离对象session1.close();Sessionsession2=sessionFactory.openSession();Transactiontx2=session2.beginTransaction();/在和在和session2关联之前修改关联之前修改Customer对象的属性对象的属性customer.setName(Linda);session2.update(c

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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号