




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate培训教程 学员要求:熟悉Java、SQL、JDBC,掌握面向对象的开发方法。培训目标:了解O/R Mapping原理,掌握Hibernate开发的相关知识,清楚3层架构,已及在实际项目中如何利用hibernate解决实际问题课程计划本课程计划7天,21课时,1天3课时,2课时讲解,一课时做练习具体内容:1持久化技术介绍,引入Hibernate应用,学习工具使用工具,部署应用2。详细讲解herbinate核心类,影射maping,集合,只讲一个,2个3。域对象在持久化层的状态,缓存,延迟导入 4。映射组成关系,继承5。Hibernate检索策略和方式,分页6。数据库事务与并发7
2、。herbinate在开发中的作用基于herbinat和struct或Struct的java web应用分析一 持久化技术介绍内容纲要:n 软件分层体系结构n Java应用的持久化层技术n JDBC回顾n ORM简介n 引入herbinate1 软件分层体系结构综观计算机软件的发展的历程,是伴随硬件发展的从单层体系到多层体系的演化过程。最初的单层体系软件只在大型机上运行,并未出现数据库的概念。20世纪70代开始,数据库的普及,pc机和局域网的出现,触使软件体系架构发展到了双层应用双层应用里,数据库作为存放数据的数据层,包含用户界面和逻辑代码的应用程序为一层。其缺点是程序结构不清晰,升级维护困难
3、。三层体系结构:在双层体系结构基础上,把应用层重新划分为表示层和业务层,实现了显示和逻辑的解耦,其中表示层提供与用户交互的界面,业务层实现业务逻辑,如定单,银行转帐等业务流程;数据库层,管理和存放持久性数据。缺点,数据访问代码巨大,数据访问方式变化,对应用层影响太大四层体系结构:把数据的持久化从业务层剥离出来,形成了所谓的四层结构,即,业务层只关注实现业务逻辑,持久层负责数据库访问,数据保存,更新,查询,删除等操作 三层体系到四层体系的演变四层体系结构中,最初的持久层多由应用软件自己封装实现,越复杂的数据模型,对开发人员的专业知识要求越高,一定程度上制约了其可行性。鉴于此,越多约多持久层软件出
4、现,并以更专业的角度给出持久层解决方案。Hibernate便是其中之一软件分层的总体原则n 上层与下层之间存在自上而下的依赖关系,即上层组件会访问下层组件的API,而下层组件不应该依赖上层组件。例如:表述层依赖于业务逻辑层,而业务逻辑层依赖于数据库层。n 每个层对上层公开API,但具体的实现细节对外透明。当某一层的实现发生变化,只要它的API不变,不会影响其他层的实现。软件分层的优点 1伸缩性 伸缩性指应用程序是否能支持更多的用户。应用的层越少,可以增加资源(如CPU和内存)的地方就越少。层数越多,可以将每层分布在不同的机器上2可维护性 可维护性指的是当发生需求变化,只需修改软件的某一部分,不
5、会影响其他部分的代码。3可扩展性 可扩展性指的是在现有系统中增加新功能的难易程度。层数越多,就可以在每个层中提供扩展点,不会打破应用的整体框架。4可重用性 可重用性指的是程序代码没有冗余,同一个程序能满足多种需求。例如,业务逻辑层可以被多种表述层共享。5可管理性 可管理性指的是管理系统的难易程度。将应用程序分为多层后,可以将工作分解给不同的开发小组,从而便于管理。应用越复杂,规模越大,需要的层就越多。经典名词:基于b/s的3层体系结构 基于b/s的3层体系结构原理是上面的讲的4层体系结构,只是由于关系型数据的成熟化通用化而省略,机遇b/s的概念相对机遇c/s的2层体系,基于浏览器,不用安装客户
6、端软件,其软件升级容易。现在比较流行struct+spring+hibernate便是经典基于b/s的3层体系结构。 注:怎么分层不是目的,分为几层同样也不是目的。目的是要体会分层所带来的好处,已经在以后的应用中结合自己的实际情况作出合理的架够,也并不是4层结构就一定比2层结构的应用程序好。2 软件的模型在软件开发领域,模型用来表示真实世界的实体。在软件开发的不同阶段,需要为目标系统创建不同类型的模型:在分析阶段,需要创建概念模型;在设计阶段,需要创建域模型和数据模型。 1概念模型概念模型用来模拟问题域中的真实实体。概念模型描述了每个实体的概念和属性,以及实体之间的关系。概念模型并不描述实体的
7、行为。不管是技术人员还是非技术人员都能看得懂概念模型,他们可以很容易的提出模型中存在的问题,帮助系统分析人员及早对模型进行修改。 2. 数据模型 关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构,它由以下内容组成:n 一个或多个表n 表的所有索引n 视图n 触发器n 表与表之间的参照完整性 主键的概念:在关系数据库表中,用主键来识别记录并保证每条记录的惟一性。作为主键的字段必须满足以下条件:n 不允许为null。n 每条记录具有惟一的主键值,不允许主键值重复。n 每条记录的主键值永远不会改变。使用代理主键机制,代理主键不具有业务含义,不会被改变。3. 域模型 域模型是
8、面向对象的。在面向对象术语中,域模型也可称为设计模型。域模型由以下内容组成:n 具有状态和行为的域对象n 域对象之间的关系l 关联l 依赖l 聚集l 一般化 域对象可以代表业务领域中的人、地点、事物或概念。域对象分为以下几种:l 实体域对象:业务领域的名词l 过程域对象:业务领域的动词l 事件域对象:业务领域中的事件实体对象可以代表人、地点、事物或概念。例如客户、订单、商品等作为实体域对象在J2EE应用中,这些名词可以作为实体EJB。对于普通的Web应用,这些名词可以作为包含状态和行为的JavaBean。采用JavaBean形式的实体域对象也称为POJO(Plain Old Java Obje
9、ct)。为了使实体域对象与关系数据库表中记录对应,可以为每个实体域对象分配惟一的OID(Object Identifier,即对象标识符),OID是关系数据库表中的主键(通常为代理主键)在实体域对象中的等价物。过程域对象代表应用中的业务逻辑或流程。它们通常依赖于实体域对象。可以把业务领域中的动词,例如客户发出订单、登入应用等作为过程域对象。在J2EE应用中,它们通常作为会话EJB或者消息驱动EJB。在非J2EE应用中,它们可作为常规的JavaBean,具有管理和控制应用的行为。过程域对象也可以拥有状态,例如在J2EE应用中,会话EJB可分为有状态和无状态两种类型。事件域对象代表应用中的一些事件
10、(如异常、警告或超时)。这些事件通常由系统中的某种行为触发。例如在多用户环境中,当一个客户端程序更新了某种实时数据,服务器端程序会创建一个事件域对象,其他正在浏览相同数据的客户端程序能够接受到这一事件域对象,随即同步刷新客户界面。3 Java应用的持久层技术持久化的概念:狭义的理解,“持久化”仅仅指把域对象永久保存到数据库中广义的理解,“持久化”包括和数据库相关的各种操作:n 保存:把域对象永久保存到数据库中。n 更新:更新数据库中域对象的状态。n 删除:从数据库中删除一个域对象。n 加载:根据特定的OID,把一个域对象从数据库加载到内存中。n 查询:根据特定的查询条件,把符合查询条件的一个或
11、多个域对象从数据库加载到内存中。数据层技术的选择主要有以下几种:1SQL/JDBC优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。这项工作通常会消耗很大一部分的开发努力。此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。2序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据
12、库中。持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。持久化的另一种用法是在机器集群中跨节点复制应用状态。缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。甚至不可能独立地访问或更新一个单独的对象或子图。非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。在特定的环境中它被作为桌面应用的适当的持久化机制。3EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。EJB规范的设计缺陷阻碍了Bea
13、n管理的持久性(BMP)实体Bean有效地执行。在EJB1.1许多明显的缺陷被纠正之后,一个边缘的稍微可接受的解决方案是容器管理的持续性(CMP)。然而,CMP并不能表示一种对象-关系不匹配的解决方案。CMP缺点:n CMP实体Bean的粒度既太粗又太细:CMP Bean与关系模型中的表是按照一对一的方式定义的。这样,它们的粒度过粗,不能够完全利用Java丰富的类型。n 虽然EJB可以利用继承实现,但实体Bean并不支持多态的关联和查询n 不管EJB规范所宣称的目标,实体Bean实际上是不可移植的。CMP引擎的性能因厂商而异,并且映射元数据也是高度特定于厂商的。n 实体Bean不可序列化。我们
14、发现当我们需要将数据传输到远程客户层时,我们必须定义额外的数据传输对象(DTO,也被称作值对象)n 实体Bean必须依赖于EJB容器测试困难。4JDO、Object-oriented database systems大多数面向对象的数据库系统对ODMG标准都提供了许多程度的支持,但据我们所知,还没有完全的实现。此外,在规范发布以后的很多年,甚至到了3.0版,还是感觉不太成熟,并且缺乏很多有用的特征,特别是基于Java环境的。ODMG也不再活跃。最近,Java数据对象(JDO)规范(发表于2002年4月)揭开了新的可能性。JDO由面向对象数据库团体的成员驱动,除了对现有的ODMG的支持之外,面向
15、对象的数据库产品现在还经常将其作为主要的API采用。JDO 的优点在于它很简单。开发人员使用 Java 语言持久存储对象实例并从存储器检索实例。处理逻辑、同步和故障转移等均被透明地处理。开发人员无需使用 SQL 或 Java 语言提供的不便的序列化机制,只使用 POJO(无格式普通 Java 对象)即可,利用 JDO 接口将对象引用传递到存储器中并从存储器检索对象引用。5O/R Mapping简单地说,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示(双向)转换为
16、另一种。O/R Mapping主要优点:n 提高生产率(Productivity)与持久性有关的代码可能是Java应用中最乏味的代码。Hibernate去掉了很多让人心烦的工作(多于你的期望),让你可以集中更多的精力到业务问题上。不论你喜欢哪种应用开发策略自顶向下,从域模型开始;或者自底向上,从一个现有的数据库模式开始使用Hibernate和适当的工具将会减少大量的开发时间。n 可维护性(Maintainability) 减少了代码,重构更方便,提高了可维护性。ORM是对象和关系数据库之间的缓冲区,用来很好的将他们隔离。n 更好性能(Performance)ORM软件的实现人员可能有比你更多的
17、时间来研究性能优化问题。你知道吗,例如,缓存PreparedStatement的实例对DB2的JDBC驱动导致了一个明显的性能增长但却破坏了InterBase的JDBC驱动?你了解吗,对某些数据库只更新一个表中被改变的字段可能会非常快但潜在地对其它的却很慢?在你手工编写的解决方案中,对这些不同策略之间的冲突进行试验是多么不容易呀?n 厂商独立性(Vendor independence)ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式。如果工具支持许多不同的数据库(dialect),那么这会给你的应用带来一定程度的可移植性。你不必期望可以达到“一次编写,到处运行”,因为数据库的性能不同
18、并且达到完全的可移植性需要牺牲更强大的平台的更多的力气。然而,使用ORM开发跨平台的应用通常更容易。即使你不需要跨平台操作,ORM依然可以帮你减小被厂商锁定的风险。另外,数据库独立性对这种开发情景也有帮助:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上。4 JDBC回顾Java应用访问数据库的最直接的方式就是直接访问JDBC API,JDBC是Java Database Connectivity的缩写。java.sql包提供了JDBC API。在java.sql包中常用的接口和类包括:a) DriverManager:驱动程序管理器,负责创建数据库连接。b) C
19、onnection:代表数据库连接。c) Statement:负责执行SQL语句。d) PreparedStatement:负责执行SQL语句,具有预定义SQL语句的功能。e) ResultSet:代表SQL查询语句的查询结果集。 Jdbc程序示例:con=getConnection(); /获得数据库连接 /开始一个数据库事务 con.setAutoCommit(false); /以下是业务逻辑代码,检查客户姓名是否为空 if(customer.getName()=null) throw new BusinessException("客户姓名不允许为空"); /以下是数据
20、访问代码,持久化Customer对象 /为新的CUSTOMERS记录分配惟一的ID long customerId=getNextId(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.g
21、etAge(); stmt.execute();Iterator iterator =customer.getOrders().iterator(); while (iterator.hasNext() ) /以下是业务逻辑代码,检查订单编号是否为空 Order order=(Order)iterator.next(); if(order.getOrderNumber()=null) throw new BusinessException("订单编号不允许为空"); /以下是数据访问代码,级联持久化Order对象 /为新的ORDERS记录分配惟一的ID long order
22、Id=getNextId(con,"ORDERS"); /把Order对象映射为面向关系的SQL语句 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); s
23、tmt.execute(); /提交数据库事务 mit();jdbc实现业务逻辑的代码和数据库访问代码掺杂在一起,使程序结构不清晰,可读性差。在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维来编写程序。业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,例如修改了CUSTOMERS表的结构,那么必须手工修改程序代码中所有相关的SQL语句,这增加了维护软件的难度。如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。 5 ORM简单介绍 ORM解决的主要问题就是对象-关系的映射。域模型和关系模型都分别建
24、立在概念模型的基础上。域模型是面向对象的,而关系数据模型是面向关系的.一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,例子如下:public class User /java代码private Long id;private String name;private List address;create table tbl_user ( /关系数据表id bigint not null auto_increment, name varchar(255), primary key (id)Java数据库类的属性(基本类型)表的列类表1:n/n:1外键n:m关联表继承单表继承
25、、具体表继承、类表继承域模型与关系模型之间存在许多不匹配之处。 n 域模型中有继承关系,关系模型不能直接表示继承关系n 域模型中有多对多关联关系,关系模型通过连接表来表示多对多关联关系n 域模型中有双向关联关系,关系模型只有单向参照关系,而且总是many方参照one方。n 域模型提倡精粒度模型,而关系模型提倡粗粒度模型Orm就是为了解决范式不匹配问题,当然具体的orm产品不只解决上述问题,连接池管理,事物,缓存等问题都在orm产品中得到很好的支持6 主流的持久层架构纵览目前众多厂商和开源社区都提供了持久层框架实现,常见的有:Apache OJB(/ojb/
26、 )Cayenne(/cayenne/ )Jaxor( )Hibernate()iBATIS( )jRelationalFramework()mirage(/en/oss/mirage/toon)SMYLE(http:/www.drjava.de/smyle/)TopLink( )(其中TopLink 是Oracle 的商业产品。其他均为开源项目)Apache OJB 的优势在于对各种标准的全面支持(不过事实上,我们的系统研发中并不需要同时支持这么多标准,追求多种标准的并
27、行支持本身也成为Apache OJB 项目发展的沉重包袱),且其从属于Apache 基金组织,有着可靠的质量保证和稳定的发展平台。Hibernate 在2003 年末被JBoss 组织收纳,成为从属于JBoss 组织的子项目之一,从而赢得了良好的发展前景(同时荣获Jolt 2004 大奖)。Hibernate 与OJB 设计思想类似,具备相近的功能和特色,但由于其更加灵活快速的发展策略,得到了广大技术人员的热情参与,因此也得到了更广泛的推崇。相对ApacheOJB 迟钝的项目开发进度表,Hibernate 活跃的开发团队以及各社区内对其热烈的关注为其带来了极大的活力,并逐渐发展成Java 持久
28、层事实上的标准。iBATIS 相对Apache OJB 和Hibernate 项目则另具特色,iBATIS 采取了更加开放式的设计,通过iBATIS,我们可以控制更多的数据库操作细节。相对而言,Hibernate、Apache OJB 对持久层的设计则较为封闭,封闭化的设计对持久层进行了较为彻底的封装,从而将底层细节与上层架构完全分离,大多数情况下,特别是对于新系统,新产品的研发而言,封闭化的设计带来了更高的开发效率和更好的封装机制,但是在某些情况下,却又为一些必须的底层调整带来了阻力,如在对遗留系统的改造和对既有数据库的复用上,表现出灵活性不足的弱点。此时作为OJB,Hibernate 的一
29、个有益补充,iBATIS的出现显得别具意义。二 第一个hibernate内容纲要:n 创建Hibernate的配置文件n 创建持久化类n 创建数据库Scheman 创建对象-关系映射文件n 映射文件的文档类型定义(DTD)n 把Customer持久化类映射到CUSTOMERS表n 通过Hibernate API操纵数据库n 用ANT工具管理项目n 编写一个简单的hibernate应用程序1 Hibernate概述Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。(O/R Mapping是一项实用的工程技术,把数据库的
30、E/R模型用java的OO语法描述出来,Hibernate是其中的当之无愧的最耀眼的明星,cglib动态增强,多种灵活的class继承树映射机制,广泛的社团支援,掩盖了其他项目的光辉。) 2 Hibernate的优势开源成熟流行(约13 000 downloads/month)自定义APIJBoss 将用Hibernate3实现Entity Beans3 Hibernate核心接口 Configuration:正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要获取一些底层实现的基本信息,其中几个关键属性包括:1) 数据库URL2) 数
31、据库用户3) 数据库用户密码4) 数据库JDBC驱动类5) 数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。Hibernate配置有两种方法:一、 属性文件配置。默认文件名是perties。调用代码: Configuration config = new Configuration();二、 XML文件配置。默认文件名是hibernate.cfg.xml。Configuration config = ne
32、w Configuration().configure();SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。SessionFactory sessi
33、onFactory = config.buildSessionFactory();Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的概念介于Connection和Transaction之间。我们可以简单的认为它是已经装载对象的缓存或集合的一个独立工作单元。我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。Hibernate会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用。Hibernate会话与W
34、eb层的HttpSession没有任何关系。Session session = sessionFactory.openSession();Transaction:事务将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。Transaction trans = session.beginTransaction ();Query: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用H
35、QL或者本地数据库的SQL方言编写。Query query = session.createQuery(“from User”);Lifecycle:Lifecycle接口提供了一些回调方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。public interface Lifecycle public boolean onSave(Session s) throws CallbackException; (1) public boolean onUpdate(Session s) throws CallbackException;
36、(2) public boolean onDelete(Session s) throws CallbackException; (3) public void onLoad(Session s, Serializable id); (4)(1) onSave - 在对象即将被save或者insert的时候回调 (2) onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候) (3) onDelete - 在对象即将被delete(删除)的时候回调 (4) onLoad - 在对象刚刚被load(装载)后的时候回调Validatabl
37、e: 该接口是合法性检查的回调。如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口: public interface Validatable public void validate() throws ValidationFailure;如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。 和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。Interceptor: Inter
38、ceptor接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是用来监视统计信息。比如,下面的Interceptor会自动在一个Auditable创建的时候设置其createTimestamp,并且当它被更改的时候,设置其lastUpdateTimestamp属性。UserType: 开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合
39、元素)到不止一个数据库表字段。比如说,你可能有这样的Java属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAME, INITIAL, SURNAME。 要实现一个自定义类型,可以实现net.sf.hibernate.UserType或net.sf.hibernate.CompositeUserType中的任一个,并且使用类型的Java全限定类名来声明属性。请查看net.sf.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。 <property name="
40、twoStrings" type="net.sf.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/></property>注意使用<column>标签来把一个属性映射到多个字段的做法。4 开始第一个hibernate应用本章将通过一个简单的例子-helloapp应用,演示如何通过Hibernate访问关系型数据库。本示例编写一个简单的C
41、ustomer实体类,并对其做简单的持久化操作。本示例的源程序在sourcecodechapter2目录下编写一个Hibernate的步骤:n 创建Hibernate的配置文件n 创建持久化类n 创建对象-关系映射文件n 通过Hibernate API编写访问数据库的代码1 创建Hibernate的配置文件= hibernate.dialect=net.sf.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysq
42、l:/localhost:3306/SAMPLEDB hibernate.connection.username=roothibernate.connection.password=1234hibernate.show_sql=true=以上是Hibernate的配置文件(perties)内容如下herbinate将根据以上的配置信息建立数据库连接。本示例使用mysql作为数据2 创建持久化类 持久化类必须遵循的原则:n 持久化类符合JavaBean的规范,包含一些属性,以及与之对应的getXXX()和setXXX()方法。 n 持久化类有一个id属性,用来惟一标识C
43、ustomer类的每个对象。在面向对象术语中,这个id属性被称为对象标识符(OID,Object Identifier),通常它都用整数表示 n Hibernate要求持久化类必须提供一个不带参数的默认构造方法 Customer.java 程序=package mypack;import java.io.Serializable;public class Customer implements Serializable private Long id; private String name; public Customer() public Long getId() return id; p
44、ublic void setId(Long id) this.id = id; public String getName() return name; public void setName(String name) =name; 3 创建数据库表Customer.sql create table CUSTOMERS ( ID bigint not null primary key, NAME varchar(15) not null,);4 创建对象-关系映射文件 Hibernate需要知道怎样去加载(load)和存储(store)我们的持久化类的对象。这里正是Hiber
45、nate映射文件(mapping file)发挥作用的地方。 映射文件告诉Hibernate它应该访问数据库里面的哪个表(table)和应该使用表里面的哪些字段(column)。注意Customer.hbm.xml必须放在Customer类所在路径下映射文件Customer.hbm.xml 如下=<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-/Hibernate/Hibernate Mapping DTD 2.0/EN""<hibernate-mapp
46、ing> <class name="mypack.Customer" table="CUSTOMERS"> <id name="id" column="ID" type="long"> <generator class="increment"/> </id> <property name="name" column="NAME" type="string"
47、not-null="true" /> </class></hibernate-mapping> <id>元素映射OID:id元素是标识属性(identifer property)的声明, name="id" 声明了Java属性(property)的名字 Hibernate将使用getId()和setId()来访问它。 字段参数(column attribute)则告诉Hibernate我们使用EVENTS表的哪个字段作为主键。 嵌套的generator元素指定了标识符的生成策略 在这里我们使用increment,
48、这个是非常简单的在内存中直接生成数字的方法,多数用于测试(或教程)中。 Hibernate同时也支持使用数据库生成(database generated),全局唯一性(globally unique)和应用程序指定(application assigned) (或者你自己为任何已有策略所写的扩展) 这些方式来生成标识符。<property>元素映射值类型属性:n name属性:指定持久化类的属性的名字。n type属性:指定Hibernate映射类型。Hibernate映射类型是Java类型与SQL类型的桥梁。n column属性:指定与类的属性映射的表的字段名。Java类型、Hi
49、bernate映射类型以及SQL类型之间的对应关系如下: Hibernate中通过如上的实现对象(Customer.java)和关系对象表CUSTOMERS的映射这种方式的影射有很多优点,如:n Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。n 软件开发人员可以独立设计域模型,不必强迫遵守任何规范。n 数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。n 对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便5 通过Hibernate API编写访问数据库的代码下面创建测试
50、类,BusinessService类 其代码如下:= ackage mypack;import javax.servlet.*;import net.sf.hibernate.*;import net.sf.hibernate.cfg.Configuration;import java.io.*;import java.sql.Date;import java.sql.Timestamp;import java.util.*;public class BusinessService public static SessionFactory sessionFactory; static try
51、/ Create a configuration based on the properties file we've put / in the standard place. Configuration config = new Configuration(); config.addClass(Customer.class); / Get the session factory we can use for persistence sessionFactory = config.buildSessionFactory(); catch(Exception e)e.printStack
52、Trace(); public void findAllCustomers() throws Exception / Ask for a session using the JDBC information we've configured Session session = sessionFactory.openSession(); Transaction tx = null; try tx = session.beginTransaction(); List customers=session.find("from Customer as c order by c.nam
53、e asc"); for (Iterator it = customers.iterator(); it.hasNext();) printCustomer( (Customer) it.next(); / We're done; make our changes permanent mit(); catch (Exception e) if (tx != null) / Something went wrong; discard all partial changes tx.rollback(); throw e; finally / No matter what, close the session session.clos
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 雇主保姆劳务合同范本
- 按日租车合同范本
- 赠与子女土地合同范本
- 重庆买卖合同范本
- 超市专柜扣点合同范本
- 中文版Creo-3.0基础教程-第4章-工程特征建模
- 正规私人借款合同范本
- 简单电脑租赁合同范本
- 承接镀锌加工合同范本
- 2025私人房屋交易合同样本
- 人教版小学数学四年级下册平均数教学教材课件
- 中国古钱币课件5(宋元明清)
- 外脚手架拆除方案
- 配电变压器运行管理制度
- 不可gdqwz01-ae001l01eel cl0501rev.0物料电力电缆表
- 应急管理概论-理论与实践电子教案完整版
- 保安队排班表
- (完整版)ERCP并发症及应急预案
- AD域部署方案完整版
- T∕CAGHP 066-2019 危岩落石柔性防护网工程技术规范(试行)
- 初一数学趣味竞赛试题
评论
0/150
提交评论