版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 补充:补充: 连接面向对象编程和关系数据库的桥梁连接面向对象编程和关系数据库的桥梁- Hibernatel1.1.应用程序的分层体系结构和应用程序的分层体系结构和Hibernate的作用的作用l2 2 软件的模型软件的模型l3. 在在Java应用中使用应用中使用Hibernate的步骤的步骤l(1 1)创建)创建HibernateHibernate的配置文件的配置文件l(2 2)创建持久化类)创建持久化类l(3 3)创建数据库)创建数据库SchemaSchemal(4 4)创建对象)创建对象- -关系映射文件关系映射文件 (5)5)通过通过Hibernate APIHibernate API
2、操纵数据库操纵数据库Java对象持久化技术概述对象持久化技术概述l应用程序的分层体系结构应用程序的分层体系结构lJava应用的持久化层应用的持久化层l软件的模型软件的模型 概念模型 关系数据模型 域模型l域对象域对象 域对象之间的关系 域对象的持久化概念l直接通过直接通过JDBC API来持久化实来持久化实体域对象体域对象lORM简介简介l实体域对象的其他持久化模式实体域对象的其他持久化模式 主动域对象模式 JDO模式 CMP模式 1.应用程序的分层体系结构应用程序的分层体系结构 和和Hibernate的作用的作用 l双层应用双层应用 应用程序层 数据库层l三层应用三层应用 表述层 业务逻辑层
3、 数据库层l四层应用四层应用 表述层 业务逻辑层 持久化层 数据库层lN层应用层应用 软件层的特征软件层的特征 l 层与层之间存在自上而下层与层之间存在自上而下的依赖关系,即上层组件会访的依赖关系,即上层组件会访问下层组件的问下层组件的API,而下层组件,而下层组件不应该依赖上层组件。例如:不应该依赖上层组件。例如:表述层依赖于业务逻辑层,而表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层。业务逻辑层依赖于数据库层。l 每个层对上层公开每个层对上层公开API,但具体的实现细节对外透明。但具体的实现细节对外透明。当某一层的实现发生变化,只当某一层的实现发生变化,只要它的要它的API不变,不会影
4、响其他不变,不会影响其他层的实现。层的实现。 软件分层的优点软件分层的优点 l1伸缩性伸缩性 伸缩性指应用程序是否能支持更多的用户。应用的层越少,可以伸缩性指应用程序是否能支持更多的用户。应用的层越少,可以增加资源(如增加资源(如CPU和内存)的地方就越少。层数越多,可以将每层分和内存)的地方就越少。层数越多,可以将每层分布在不同的机器上布在不同的机器上l2可维护性可维护性 可维护性指的是当发生需求变化,只需修改软件的某一部分,不可维护性指的是当发生需求变化,只需修改软件的某一部分,不会影响其他部分的代码。会影响其他部分的代码。l3可扩展性可扩展性 可扩展性指的是在现有系统中增加新功能的难易程
5、度。层数越多,可扩展性指的是在现有系统中增加新功能的难易程度。层数越多,就可以在每个层中提供扩展点,不会打破应用的整体框架。就可以在每个层中提供扩展点,不会打破应用的整体框架。l 4可重用性可重用性 可重用性指的是程序代码没有冗余,同一个程序能满足多种需求。可重用性指的是程序代码没有冗余,同一个程序能满足多种需求。例如,业务逻辑层可以被多种表述层共享。例如,业务逻辑层可以被多种表述层共享。l5可管理性可管理性 可管理性指的是管理系统的难易程度。将应用程序分为多层后,可管理性指的是管理系统的难易程度。将应用程序分为多层后,可以将工作分解给不同的开发小组,从而便于管理。应用越复杂,规可以将工作分解
6、给不同的开发小组,从而便于管理。应用越复杂,规模越大,需要的层就越多。模越大,需要的层就越多。 Java应用的持久化层应用的持久化层 封装JDBC API MVC设计模式与四层应用结构的对应关系设计模式与四层应用结构的对应关系 Hibernate是持久化层的一种实现方式是持久化层的一种实现方式Hibernate不和特定的业务领域相关,能够把任意一个Java应用与数据库系统连接,它是一种中间件。 2. 软件的模型软件的模型l在软件开发领域,模型用来表示真实世界的实体。在软件开发领域,模型用来表示真实世界的实体。l在软件开发的不同阶段,需要为目标系统创建不同类在软件开发的不同阶段,需要为目标系统创
7、建不同类型的模型:型的模型: 在分析阶段,需要创建概念模型。 在设计阶段,需要创建域模型和数据模型。 模型之间的关系模型之间的关系 概念模型概念模型l概念模型用来模拟问题域中的真实实体。概念模型用来模拟问题域中的真实实体。l概念模型描述了每个实体的概念和属性,以及实体之概念模型描述了每个实体的概念和属性,以及实体之间的关系。间的关系。l概念模型并不描述实体的行为。概念模型并不描述实体的行为。l不管是技术人员还是非技术人员都能看得懂概念模型,不管是技术人员还是非技术人员都能看得懂概念模型,他们可以很容易的提出模型中存在的问题,帮助系统他们可以很容易的提出模型中存在的问题,帮助系统分析人员及早对模
8、型进行修改。分析人员及早对模型进行修改。 购物网站应用的概念模型购物网站应用的概念模型 实体与实体之间存在三种关系实体与实体之间存在三种关系 lCustomer和Order实体: 一对多。一个客户有多个订单,而一个订单只能属于一个客户。lCategory和Item实体:多对多。一个商品类别包含多个商品,而一个商品可以属于多个商品类别。lOrder和Item实体:多对多。一个订单包含多个商品,而一个商品可以属于多个订单。lCustomer和ShoppingCart实体:一对多。一个客户有多个购物车,而一个购物车只能属于一个客户lShoppingCart和Item实体:多对多。一个购物车包含多个商
9、品,而一个商品可以属于多个购物车。 关系数据模型关系数据模型l 关系数据模型是在概念模型的基础上建立起来关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构,它由以的,用于描述这些关系数据的静态结构,它由以下内容组成:下内容组成: 一个或多个表 表的所有索引 视图 触发器 表与表之间的参照完整性 表的主键表的主键l在关系数据库表中,用主键来识别记录并保证每条记录的惟在关系数据库表中,用主键来识别记录并保证每条记录的惟一性。作为主键的字段必须满足以下条件:一性。作为主键的字段必须满足以下条件: 不允许为null。 每条记录具有惟一的主键值,不允许主键值重复。 每条记录的主键
10、值永远不会改变。l使用代理主键机制,代理主键不具有业务含义,不会被改变。使用代理主键机制,代理主键不具有业务含义,不会被改变。create table CUSTOMER(ID bigint auto_increment primary key, NAME varchar(30);insert into CUSTOMERS(NAME) values(Tom);insert into CUSTOMERS(NAME) values(Jack);select * from CUSTOMER;查询结果+-+-+| ID | NAME |+-+-+| 1 | Tom | 2 | Jack |+-+-+ 表
11、与表之间的参照完整性表与表之间的参照完整性 用连接表表示多对多关系用连接表表示多对多关系 域模型域模型 l域模型是面向对象的。在面向对象术语中,域模型也域模型是面向对象的。在面向对象术语中,域模型也可称为设计模型。域模型由以下内容组成:可称为设计模型。域模型由以下内容组成: 具有状态和行为的域对象 域对象之间的关系l关联l依赖l聚集l一般化 域对象域对象l域对象可以代表业务领域中的人、地点、事物或概念。域对象可以代表业务领域中的人、地点、事物或概念。域对象分为以下几种:域对象分为以下几种: 实体域对象:业务领域的名词 过程域对象:业务领域的动词 事件域对象:业务领域中的事件实体域对象实体域对象
12、l实体对象可以代表人、地点、事物或概念。例如客户、订实体对象可以代表人、地点、事物或概念。例如客户、订单、商品等作为实体域对象。单、商品等作为实体域对象。l在在Java EE应用中,这些名词可以作为实体应用中,这些名词可以作为实体EJB。l对于普通的对于普通的Java应用,这些名词可以作为包含状态和行为应用,这些名词可以作为包含状态和行为的的JavaBean。采用。采用JavaBean形式的实体域对象也称为形式的实体域对象也称为POJO(Plain Old Java Object)。)。l为了使实体域对象与关系数据库表中记录对应,可以为每为了使实体域对象与关系数据库表中记录对应,可以为每个实体
13、域对象分配惟一的个实体域对象分配惟一的OID(Object Identifier,即对,即对象标识符),象标识符),OID是关系数据库表中的主键(通常为代理是关系数据库表中的主键(通常为代理主键)在实体域对象中的等价物。主键)在实体域对象中的等价物。 过程域对象过程域对象l过程域对象代表应用中的业务逻辑或流程。它们通常依赖过程域对象代表应用中的业务逻辑或流程。它们通常依赖于实体域对象。于实体域对象。l可以把业务领域中的动词,例如客户发出订单、登入应用可以把业务领域中的动词,例如客户发出订单、登入应用等作为过程域对象。等作为过程域对象。l在在Java EE应用中,它们通常作为会话应用中,它们通常
14、作为会话EJB或者消息驱动或者消息驱动EJB。l在非在非Java EE应用中,它们可作为常规的应用中,它们可作为常规的JavaBean,具,具有管理和控制应用的行为。有管理和控制应用的行为。l过程域对象也可以拥有状态,例如在过程域对象也可以拥有状态,例如在J2EE应用中,会话应用中,会话EJB可分为有状态和无状态两种类型。可分为有状态和无状态两种类型。 事件事件域对象域对象l事件域对象代表应用中的一些事件(如异常、警告或事件域对象代表应用中的一些事件(如异常、警告或超时)。这些事件通常由系统中的某种行为触发。超时)。这些事件通常由系统中的某种行为触发。l例如在多用户环境中,当一个客户端程序更新
15、了某种例如在多用户环境中,当一个客户端程序更新了某种实时数据,服务器端程序会创建一个事件域对象,其实时数据,服务器端程序会创建一个事件域对象,其他正在浏览相同数据的客户端程序能够接受到这一事他正在浏览相同数据的客户端程序能够接受到这一事件域对象,随即同步刷新客户界面。件域对象,随即同步刷新客户界面。 域对象之间的关系域对象之间的关系l关联关联(Association)l依赖依赖(Dependency)l聚集聚集(Aggregation)l一般化一般化(Generalization) 关联关系关联关系private Customer customer;public Customer getCus
16、tomer();public void setCustomer(Customer c);private Customer customer;public Customer getCustomer();public void setCustomer(Customer c);private Set orders;public Set getOrders();public void setOrders(Set o);private Set orders;public Set getOrders();public void setOrders(Set o); 依赖关系依赖关系 在BusinessSer
17、vice类中访问Customer类的方法,并且构造Customer类的实例 聚集关系聚集关系l聚集指的是整体与部分之间的关系,在实体域对象之聚集指的是整体与部分之间的关系,在实体域对象之间很常见。间很常见。 一般化关系一般化关系l一般化指的是类之间的继承关系。一般化指的是类之间的继承关系。 域对象的持久化概念域对象的持久化概念 域对象的持久化概念域对象的持久化概念l狭义的理解,狭义的理解,“持久化持久化”仅仅指把域对象永久保存到数据仅仅指把域对象永久保存到数据库中库中l广义的理解,广义的理解,“持久化持久化”包括和数据库相关的各种操作:包括和数据库相关的各种操作: 保存:把域对象永久保存到数据
18、库中。 更新:更新数据库中域对象的状态。 删除:从数据库中删除一个域对象。 加载:根据特定的OID,把一个域对象从数据库加载到内存中。 查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载到内存中。 通过通过JDBC API来持久化实体域对象来持久化实体域对象 lJava应用访问数据库的最直接的方式就是直接访问应用访问数据库的最直接的方式就是直接访问JDBC API,JDBC是是Java Database Connectivity的缩写。的缩写。ljava.sql包提供了包提供了JDBC API。在。在java.sql包中常用的接口包中常用的接口和类包括和类包括: Drive
19、rManager:驱动程序管理器,负责创建数据库连接。 Connection:代表数据库连接。 Statement:负责执行SQL语句。 PreparedStatement:负责执行SQL语句,具有预定义SQL语句的功能。 ResultSet:代表SQL查询语句的查询结果集。 JDBC驱动程序驱动程序lJava应用必须通过应用必须通过JDBC驱动程序来和特定的数据库系统驱动程序来和特定的数据库系统连接。连接。 lJDBC驱动程序由数据库厂商或第三方提供。驱动程序由数据库厂商或第三方提供。 JDBC API负责持久化负责持久化Customer对象的对象的BusinessServicelsaveC
20、ustomer():把:把Customer域对象永久保存到数据库域对象永久保存到数据库中。中。lupdateCustomer():更新数据库中:更新数据库中Customer域对象的状域对象的状态。态。ldeleteCustomer():从数据库中删除一个:从数据库中删除一个Customer域对域对象。象。lloadCustomer():根据特定的:根据特定的OID,把一个,把一个Customer域域对象从数据库加载到内存中。对象从数据库加载到内存中。lfindCustomerByName():根据特定的客户姓名,把符合:根据特定的客户姓名,把符合查询条件的查询条件的Customer域对象从数据
21、库加载到内存中。域对象从数据库加载到内存中。业务逻辑代码与数据访问代码耦合的业务逻辑代码与数据访问代码耦合的saveCustomer()方法方法 con=getConnection(); /获得数据库连接 /开始一个数据库事务 con.setAutoCommit(false); /以下是业务逻辑代码,检查客户姓名是否为空 if(customer.getName()=null) throw new BusinessException(客户姓名不允许为空); /以下是数据访问代码,持久化Customer对象 /为新的CUSTOMERS记录分配惟一的ID long customerId=getNex
22、tId(con,CUSTOMERS); /把Customer对象映射为面向关系的SQL语句 stmt=con.prepareStatement(insert into CUSTOMERS(ID,NAME,AGE) values(?,?,?); stmt.setLong(1,customerId); stmt.setString(2,customer.getName(); stmt.setInt(3,customer.getAge(); stmt.execute(); 业务逻辑代码与数据访问代码耦合的业务逻辑代码与数据访问代码耦合的saveCustomer()方法方法 Iterator iter
23、ator =customer.getOrders().iterator(); while (iterator.hasNext() ) /以下是业务逻辑代码,检查订单编号是否为空 Order order=(Order)iterator.next(); if(order.getOrderNumber()=null) throw new BusinessException(订单编号不允许为空); /以下是数据访问代码,级联持久化Order对象 /为新的ORDERS记录分配惟一的ID long orderId=getNextId(con,ORDERS); /把Order对象映射为面向关系的SQL语句
24、stmt=con.prepareStatement(insert into ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID)values(?,?,?,?); stmt.setLong(1,orderId); stmt.setString(2,order.getOrderNumber(); stmt.setDouble(3,order.getPrice(); stmt.setLong(4,customerId); stmt.execute(); /提交数据库事务 mit(); JDBC编程的缺点编程的缺点l实现业务逻辑的代码和数据库访问代码掺杂在一起,使程实现业
25、务逻辑的代码和数据库访问代码掺杂在一起,使程序结构不清晰,可读性差。序结构不清晰,可读性差。l在程序代码中嵌入面向关系的在程序代码中嵌入面向关系的SQL语句,使开发人员不能语句,使开发人员不能完全运用面向对象的思维来编写程序。完全运用面向对象的思维来编写程序。l业务逻辑和关系数据模型绑定,如果关系数据模型发生变业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,例如修改了化,例如修改了CUSTOMERS表的结构,那么必须手工表的结构,那么必须手工修改程序代码中所有相关的修改程序代码中所有相关的SQL语句,这增加了维护软件语句,这增加了维护软件的难度。的难度。l如果程序代码中的如果程序代码中的
26、SQL语句包含语法错误,在编译时不能语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。了调试程序的难度。 数据访问模式数据访问模式l业务逻辑和数据访问耦合业务逻辑和数据访问耦合lORM模式模式:在单个组件中负责所有实体域对象的持久化,:在单个组件中负责所有实体域对象的持久化,封装数据访问细节。封装数据访问细节。 l主动域对象模式主动域对象模式:由实体域对象本身负责管理自己的持久:由实体域对象本身负责管理自己的持久化化lJDO模式模式: SUN公司制定的描述对象持久化语义的标准公司制定的描述对象持久
27、化语义的标准API lCMP模式模式:由容器负责管理持久化:由容器负责管理持久化 ORM模式模式对象对象-关系映射关系映射(Object-Relation Mapping)的概念的概念 lORM解决的主要问题就是对象解决的主要问题就是对象-关系的映射。域模型和关关系的映射。域模型和关系模型都分别建立在概念模型的基础上。域模型是面向对系模型都分别建立在概念模型的基础上。域模型是面向对象的,而关系数据模型是面向关系的象的,而关系数据模型是面向关系的.l一般情况下,一个持久化类和一个表对应,类的每个实例一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。对应表中的一条记录。l域模型
28、与关系模型之间存在许多不匹配之处。域模型与关系模型之间存在许多不匹配之处。 域模型与关系模型之间存在许多不匹配之处域模型与关系模型之间存在许多不匹配之处l域模型中有继承关系,关系模型不能直接表示继承关系域模型中有继承关系,关系模型不能直接表示继承关系l域模型中有多对多关联关系,关系模型通过连接表来表示域模型中有多对多关联关系,关系模型通过连接表来表示多对多关联关系多对多关联关系l域模型中有双向关联关系,关系模型只有单向参照关系,域模型中有双向关联关系,关系模型只有单向参照关系,而且总是而且总是many方参照方参照one方。方。l域模型提倡精粒度模型,而关系模型提倡粗粒度模型域模型提倡精粒度模型
29、,而关系模型提倡粗粒度模型Category类Item类域模型与关系模型之间的不匹配举例域模型与关系模型之间的不匹配举例l如果类的粒度比较大,不利于代码的可重用如果类的粒度比较大,不利于代码的可重用.Customer类homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcodeEmployee类homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcode增加Room信息Customer类homeRoomcomR
30、oomEmployee类homeRoomcomRoom 域模型与关系模型之间的不匹配举例域模型与关系模型之间的不匹配举例精粒度域模型和粗粒度关系模型private Address homeAddress;private Address comAddress; 3.在在Java应用中使用应用中使用Hibernate的步骤的步骤l在在Java应用中使用应用中使用Hibernate的步骤的步骤需要以下步骤:需要以下步骤:l(1)创建创建Hibernate的配置文件的配置文件l(2)创建持久化类创建持久化类l(3) 创建数据库创建数据库Schema l(4)创建对象创建对象-关系映射文件关系映射文件l
31、(5)通过通过Hibernate API编写访问数据库的代码编写访问数据库的代码Helloapp应用的结构应用的结构(1)Hibernate的配置文件的配置文件(perties) hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql:/localhost:3306/SAMPLEDB hibernate.connection.username
32、=roothibernate.connection.password=1234hibernate.show_sql=true Hibernate配置文件的属性配置文件的属性 (2)创建持久化类)创建持久化类Customerl持久化类符合持久化类符合JavaBean的规范,的规范,包含一些属性,以及与之对应的包含一些属性,以及与之对应的getXXX()和和setXXX()方法。方法。 l持久化类有一个持久化类有一个id属性,用来惟一属性,用来惟一标识标识Customer类的每个对象类的每个对象。在。在面向对象术语中,这个面向对象术语中,这个id属性被称属性被称为对象标识符(为对象标识符(OID,
33、Object Identifier),通常它都用整数表),通常它都用整数表示示 lHibernate要求持久化类必须提供要求持久化类必须提供一个不带参数的默认构造方法一个不带参数的默认构造方法 (3) 创建数据库创建数据库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 c
34、har(1) , IS_MARRIED bit, DESCRIPTION text, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp);blob (二进制大数据)binary large object (4)创建对象)创建对象-关系映射文件关系映射文件 Customer.hbm.xml 元素映射元素映射OIDl子元素用来设定标识符生成器。子元素用来设定标识符生成器。Hibernate提供了提供了多种提供了提供了多种内置的实现。内置的实现。 MySQL中:ID bigint auto_increment primary key 元素映射值
35、类型属性元素映射值类型属性lname属性:属性:指定持久化类的属性的名字。指定持久化类的属性的名字。lcolumn属性:属性:指定与类的属性映射的表的字段名。指定与类的属性映射的表的字段名。ltype属性:属性:指定指定Hibernate映射类型。映射类型。Hibernate映射类型是映射类型是Java类型与类型与SQL类型的桥梁。类型的桥梁。lJava类型:StringSQL类型:varcharHibernate类型:string Java类型、类型、Hibernate映射类型映射类型 以及以及SQL类型之间的对应关系类型之间的对应关系 Customer.hbm.xml配置的对象配置的对象-
36、关系映射关系映射 采用采用XML文件来配置对象文件来配置对象-关系映射的优点关系映射的优点lHibernate既不会渗透到上层域模型中,也不会渗透既不会渗透到上层域模型中,也不会渗透到下层数据模型中。到下层数据模型中。l软件开发人员可以独立设计域模型,不必强迫遵守任软件开发人员可以独立设计域模型,不必强迫遵守任何规范。何规范。l数据库设计人员可以独立设计数据模型,不必强迫遵数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。守任何规范。l对象对象-关系映射不依赖于任何程序代码,如果需要修改关系映射不依赖于任何程序代码,如果需要修改对象对象-关系映射,只需修改关系映射,只需修改XML文件,
37、不需要修改任何文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。程序,提高了软件的灵活性,并且使维护更加方便。 (5)通过)通过Hibernate API操纵数据库操纵数据库 创建创建BusinessService类类 l初始化初始化Hibernatel通过通过Hibernate的的Session接口操纵数据库接口操纵数据库: 保存Customer对象 更新Customer对象 加载Customer对象 删除Customer对象 检索Customer对象 Hibernate的初始化的初始化 static try / 根据默认位置的根据默认位置的Hibernate配置文件的配置信
38、息,创建一个配置文件的配置信息,创建一个 /Configuration实例实例 Configuration config = new Configuration(); config.addClass(Customer.class); / 创建创建SessionFactory实例实例 */ sessionFactory = config.buildSessionFactory(); catch(Exception e)e.printStackTrace(); Hibernate的初始化的初始化 l(1)创建一个)创建一个Configuration类的实例,类的实例,Configuration类的
39、构造方类的构造方法把默认文件路径下的法把默认文件路径下的perties配置文件中的配置信息配置文件中的配置信息读入到内存:读入到内存: Configuration config = new Configuration();l(2)调用)调用Configuration类的类的addClass(Customer.class)方法:方法: config.addClass(Customer.class); 该方法把默认文件路径下的该方法把默认文件路径下的Customer.hbm.xml文件中的映射信息文件中的映射信息读入到内存中。读入到内存中。l(3)调用)调用Configu
40、ration类的类的buildSessionFactory()方法:方法: sessionFactory = config.buildSessionFactory(); SessionFactory接口接口 l一个一个SessionFactory实例对应一个数据存储源,应用从实例对应一个数据存储源,应用从SessionFactory中获得中获得Session实例。实例。SessionFactory有以下特点:有以下特点: 它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。 它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFa
41、ctory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。 Session接口接口 lSession接口是接口是Hibernate应用使用最广泛的接口。应用使用最广泛的接口。lSession也被称为持久化管理器,它提供了和持久化相关也被称为持久化管理器,它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。的操作,如添加、更新、删除、加载和查询对象。lSession有以下特点:有以下特点: 不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。 Session实例是轻量级的
42、,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。 Session接口操纵数据库的方法接口操纵数据库的方法lSession接口提供了操纵数据库的各种方法,如:接口提供了操纵数据库的各种方法,如: save()方法:把Java对象保存数据库中。 update()方法:更新数据库中的Java对象。 delete()方法:把Java对象从数据库中删除。 load()或get()方法:从数据库中加载Java对象。 find()方法:从数据库中查询Jav
43、a对象。在 Hibernate3中,该方法已经被废弃。 Hibernate提供了专门的Query查询接口。 用用Session来执行事务的流程来执行事务的流程 Session session = factory.openSession(); Transaction tx; try /开始一个事务开始一个事务 tx = session.beginTransaction(); /执行事务执行事务 . /提交事务提交事务 mit(); catch (Exception e) /如果出现异常,就撤销事务如果出现异常,就撤销事务 if (tx!=null) tx.rollback(); throw e;
44、 finally /不管事务执行成功与否,最后都关闭不管事务执行成功与否,最后都关闭Session session.close(); 正常执行数据库事务的流程正常执行数据库事务的流程 saveCustomer()方法方法l该方法调用该方法调用Session的的save()方法,把方法,把Customer对象持久化到数据库中。对象持久化到数据库中。 tx = session.beginTransaction(); session.save(customer); mit();l当运行当运行session.save()方法时,方法时,Hibernate执行以下执行以下SQL语句:语句: insert
45、 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 honest., ,1980-05-06,null)l在在test()方法中并没有设置方法中并没有设置Customer对象的对象的id属性,属性,Hibernate会根据映射文件的会根据映射文件的配置,采用配置,采用increment标识符生成器自动以递
46、增的方式为标识符生成器自动以递增的方式为OID赋值。在赋值。在Customer.hbm.xml文件中相关的映射代码如下:文件中相关的映射代码如下: findAllCustomers()方法方法l该方法通过该方法通过Query接口查询所有的接口查询所有的Customer对象。对象。 tx = session.beginTransaction(); /开始一个事务开始一个事务Query query=session.createQuery(from Customer as c order by asc);List customers=query.list();for (Iterator
47、 it = customers.iterator(); it.hasNext();) printCustomer(context,out,(Customer) it.next();mit(); /提交事务提交事务lSession的的createQuery()方法的参数方法的参数“from Customer as c order by asc”使用的是使用的是Hibernate查询语言。运行查询语言。运行Query.list()方法时,方法时, Hibernate执行以下执行以下SQL语句:语句: select * from CUSTOMERS order by NAME asc;
48、HQL查询语句Hibernate Query Language loadAndUpdateCustomer ()方法方法l该方法调用该方法调用Session的的get()方法,加载方法,加载Customer对象,然后再修改对象,然后再修改Customer对象的属性。对象的属性。 tx = session.beginTransaction(); Customer c=(Customer)session.get(Customer.class,customer_id); c.setAddress(address); /修改内存中修改内存中Customer对象的对象的address属性属性 mit()
49、;l以上代码先调用以上代码先调用Session的的get()方法,它按照参数指定的方法,它按照参数指定的OID从数据库中检从数据库中检索出匹配的索出匹配的Customer对象,对象,Hibernate会执行以下会执行以下SQL语句:语句: select * from CUSTOMERS where ID=1;lloadAndUpdateCustomer()方法接着修改方法接着修改Customer对象的对象的address属性属性。那么,。那么,Hibernate会不会同步更新数据库中相应的会不会同步更新数据库中相应的CUSTOMERS表的记表的记录呢?答案是肯定的。录呢?答案是肯定的。Hibernate采用脏检查机制,按照内存中的采用脏检查机制,按照内存中的Customer对象的状态的变化,来同步更新数据库中相关的数据,对象的状态的变化,来同步更新数据库中相关的数据,Hibernate会执行以下会执行以下SQL语句:语句: update CUSTOMERS set NAME=Tom,EMAIL=TADDRESS=Beijing where ID=1;l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《焊接自动化技术》教学大纲
- 点金术课件教学课件
- 玉溪师范学院《社会体育指导员一级》2022-2023学年第一学期期末试卷
- 防疫和应急演练方案及流程
- goodhabits课件教学课件
- 项目建议书与可研报告编制大纲及二者区别
- 特殊气候条件下施工方案
- 2024年二季度碳交易市场运行与政策盘点-碳价突破百元 碳市场扩容在即
- 2024年薯、豆相关植物加工品项目成效分析报告
- 2019粤教版 高中美术 选择性必修2 中国书画《第五单元 以形写神的人物画》大单元整体教学设计2020课标
- 胺碘酮临床应用
- 成长生涯发展展示
- 新疆地方教材五年级可爱的中国计划、教案
- 老年人的火灾预防与自救技巧课件
- 消防设施的维护保养方案
- 新时代鲁班精神
- 软件工程生涯发展展示
- 检验检测机构质量管理
- 痔疮护理课件
- 林业技术的职业生涯规划书
- 以瞄准我的妹妹没剪板
评论
0/150
提交评论