使用Hibernate完成对象持久化Word文件下载.docx
- 文档编号:17841298
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:22
- 大小:1.72MB
使用Hibernate完成对象持久化Word文件下载.docx
《使用Hibernate完成对象持久化Word文件下载.docx》由会员分享,可在线阅读,更多相关《使用Hibernate完成对象持久化Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
1.极大的提高了生产力
2.更面向对象化
3.透明持久化(侵入性比较少了)
4.移植性好
以下是使用Hibernate后的DAO层代码:
5.2Hibernate是什么?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
这也是Hibernate能流行起来的原因。
Hibernate之父GavinKing1974年出生于澳大利亚,现在居住在澳大利亚默尔本市。
GavinKing是Hibernate的作者,EJB3.0专家委员会成员,JBoss核心成员之一。
Hibernate诞生在2001年11月,在短短的两年多时间就发展成为Java世界主流的持久层框架软件。
GavinKing是JBossSeam项目的领导人。
Seam是一个强大的用来构建下一代Web2.0应用程序的应用程序框架,它统一和集成流行的面向服务(SOA)技术,例如AJAX,JSF,EJB3,JavaPortlets和BPM,工作流。
Gavin也是EJB3.0(JSR220)专家组成员,对Javapersisence标准以及整个EJB3.0标准的制定都产生了巨大影响。
他还是雄心勃勃的WebBeansJSR299标准项目的负责人,该标准旨在将JSF受管理beans组件模型与EJB3.0组件模型统一起来。
5.2.1持久化
程序运行时,有些程序数据保存在内存中,当程序退出后,这些数据就不复存在了,所以,我们称这些数据大的状态为瞬时的(Transient)。
有些数据,在程序退出后,还以文件等形式保持在存储设备(硬盘,光盘等)中,我们称这些数据的状态是持久的(Persistent)。
持久化是将程序中数据在瞬时状态和持久状态的机制。
持久化概念图如图5.2所示。
图5.2持久化概念图
Hibernate对象状态:
1.瞬时(Transient)-由new操作符创建,且尚未与HibernateSession关联的对象被认定为瞬时(Transient)的。
瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。
如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbagecollector)销毁。
使用HibernateSession可以将其变为持久(Persistent)状态。
(Hibernate会自动执行必要的SQL语句)
2.持久(Persistent)-持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。
持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。
Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unitofwork)执行完毕时将对象数据(state)与数据库同步(synchronize)。
开发者不需要手动执行UPDATE。
将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。
3.脱管(Detached)-与持久(Persistent)对象关联的Session被关闭后,对象就变为脱管(Detached)的。
对脱管(Detached)对象的引用依然有效,对象可继续被修改。
脱管(Detached)对象如果重新关联到某个新的Session上,会再次转变为持久(Persistent)的(在Detached其间的改动将被持久化到数据库)。
这个功能使得一种编程模型,即中间会给用户思考时间(userthink-time)的长时间运行的操作单元(unitofwork)的编程模型成为可能。
我们称之为应用程序事务,即从用户观点看是一个操作单元(unitofwork)。
持久化对象的生命周期(lifecycle)如图5.3所示:
图5.3持久化对象的生命周期
5.2.2对象--关系映射
Java是纯粹的面向对象语言,自然,写出的程序也应当是面向对象的。
而目前流行的大多数数据库却是关系型数据库,平时采用jdbc方式连接数据库,并操纵数据库是由对象到关系的操纵。
目前,大多数的项目是以数据库为中心来开发,这样一来就会遇到很尴尬的问题----面向对象的编程变为了面向关系的编程,Hibernate很好的解决了如上问题。
HIbernate对JDBC进行了封装,简化了JDBC方式繁琐的编程工作。
使用Hibernate将对象保存到数据库中再也不用编写很长的SQL语句,对应的每个字段设置PreparedStatement中参数的值。
仅仅需要使用session对象完成相应的数据库操纵。
在Hibernate中,使用xml配置文件保存相应的映射信息。
在5.3小节中将详细讲到。
对象-关系映射信息的示例如图5.4所示。
图5.4对象-关系映射信息
5.3使用Hibernate的基本步骤
5.3.1准备工作
简单的说,使用Hibernate的步骤可简单的归结为“3个准备,7个步骤”。
下面将通过一个“用户添加”|的示例来讲解使用Hibernate的基本步骤:
准备1:
导入Hibernate库(jar包)
首先需要从Hibernate的官方网站(www.hibernate.org)下载相应的jar包,然后打开Myeclipse,选中项目单击右键,选择“Myeclipse”“AddHibernateCapabilities”选项,如图5..5所示。
图5.5添加Hibernate支持
在弹出的“HibernateSupportforMyeclipse”对话框中,选择“Hibernate3.3”。
如图5.6所示。
图5.6添加Hibernate支持
5.3.2Hibernate配置文件
准备2:
添加配置文件--hibernate.cfg.xml
准备3:
添加实体类和映射文件(User.hbm.xml)
User类定义如下:
User.hbm.xml文件配置如下图5.7所示。
图5.7User.hbm.xml文件配置
User.hbm.xml配置说明:
<
classname="
com.aptech.jb.entity.User"
table="
TBL_USER"
schema="
dbo"
catalog="
zf"
>
用于配置实体类到表的映射。
idname="
uid"
type="
java.lang.Integer"
columnname="
/>
generatorclass="
native"
/id>
在<
中,如果配置为native,则Hibernate会自动根据数据库的类型选择相应数据库的主键自增方式,很具有灵活性(一般在大型项目中常常使用)。
如果设置为assigned,则由程序指定,而不是采用数据库自增的方式。
propertyname="
upass"
java.lang.String"
length="
50"
not-null="
true"
/property>
用于配置属性到字段的映射,type指定了String类型,length指定了长度,not-null为true表示在数据库中,此字段不能为空。
综上所述,使用Hibernate的三项准备工作可归结如下:
*添加Hibernate库
*添加Hibernate配置文件
*添加对应表的实体类和映射文件
Hibernate的使用要分为以下七个步骤,如图5..8所示。
图5.8Hibernate的使用步骤
5.3.3使用Hibernate实现用户添加
代码如下:
Hibernate的持久化操纵要放在try{}catch()语句块中,如果在对数据库进行操纵时出现了异常,则可将事务回滚。
关闭session的语句要放在finally{}中,以免发生异常时无法及时关闭session。
持久化以后,数据库中将插入新的记录,如图5.8所示:
图5.8持久化之后表的内容
到此为止,我们就完成了使用Hibernate向数据库中添加数据的任务。
通过示例,大家可以了解到,Hibernate并不那么难学,那么神秘,相反,它很易于学习,易于使用,极大的提高了开发效率。
以上的示例中涉及到了几个Hibernate的类,包括Configuration,SessionFactory,Session和Transaction,对比DataSource和JDBC的概念很容易理解和运用,图5.9展示了几个类之间的关系以及Hibernate执行的过程。
图5.9Hibernate类之间的关系
5.4使用Hibernate实现数据的删改
在上一节,着重向读者介绍了如何使用Hibernate向数据库添加数据,这一节则主要介绍如何使用Hibernate加载,删除和修改数据。
所谓加载数据,主要是通过表的主键进行数据索引。
相应的代码如下:
使用Hibernate加载数据时,仅仅需要一行代码,不需要繁琐的从ResultSet中取数据封装到实体的代码了。
只需要简单的调用session的update方法既可进行数据的更新。
值得注意的是,增删改操作一定要在事务环境中完成(session.beginTransaction())。
与修改数据相仿,删除数据也要先加载数据。
使用Hibernate编写持久化代码时,不再需要数据库表,字段等概念,而是采用面向对象的语义,因此删除操作方法的参数理所当然是将要删除的对象,而不是主键。
5.5使用工具简化Hibernate开发
通过前几节的学习,我们已经掌握了如何使用Hibernate完成持久化,但“3个准备,7个步骤”是不是有些麻烦?
有没有更简洁的方式来使用Hibernate呢?
这一节将着重讲解如何使用MyEclipse添加Hibernate支持,让编程效率事半功倍!
在5.3节,讲解了使用MyEclipse工具给项目添加Hibernate支持,自动添加了Hibernate配置文件。
使用MyEclipseHibernateConfigEditor打开Hibernate配置文件,如图5.10所示,单击DBConnectProfile旁边的“New...”按钮,使用向导配置数据库连接信息。
图5.10使用MyEclipseHibernateConfigEditor打开Hibernate配置文件
在弹出的DatabaseProfile对话框中,Profilename可以随意起名,URL一定要填写正确,单击“下一步”按钮,如图5.11所示。
图5.11DatabaseProfile
在SchemaDetails对话框中,选择正确的数据库,单击“完成”按钮,MyEclipse就会自动在Hibernate配置文件中配置好数据库相应的参数,如图5.12所示。
图5.12SchemaDetails
图5.10中Properties部分和Mappings部分也都有相应的向导,因此,我们完全可以充分利用相应的工具,而不必去手动编写Hibernate.cfg.xml文件。
那么,表的映射文件如何配置呢?
例如:
Person.hbm.xml,是不是也有相应的辅助呢?
答案是肯定的!
映射文件完全可以使用工具自动生成!
步骤如下:
在MyEclipse工作区右上角选择进入MyEclipseDatabaseExplorer透视图,如图5.13所示。
图5.13数据库浏览器
在DBBrowser(数据库浏览器)视窗中,依次打开结点,然后选择相应的表,在弹出菜单中选择“HibernateReverseEngineering”选项。
在弹出的对话框中选择生成实体类和映射文件的包名,选中“Hibernatemappingfile...”复选框,选择“JavaDataObject...”复选框表示要生成的实体类。
然后单击“下一步”,如图5.14所示。
图5.14配置生成项
在“Configtypemappingdetails”对话框中,IDGenerator选择“native”,继续单击“下一步”.
在“Configreverseengineeringdetails”中,保持所有复选框未选中,单击“完成按钮”,开始生成代码,完成后,返回Java透视图,发现已经生成了实体类和映射文件,如图5.15所示。
图生成的实体类和映射文件
现在,我们就可以不用手动的敲代码完成“3个准备”了,工作量是不是又简化了很多!
下面来总结一下,MyEclipse帮助我们完成了哪些工作:
1.给项目添加Hibernate支持(自动添加jar包)
2.自动生成hibernate.cfg.xml配置文件
3.生成实体类、映射文件
5.9在项目中使用Hibernate
通过前几节的学习,相信读者朋友们已经能使用Hibernate来取代JDBC完成对数据库的操作了,但是,仅仅了解这些是不够的,因为真正能让Hibernate有用武之地是在中大型Web项目中,那么,如何在项目中使用Hibernate框架呢?
这将是本节所要讨论的问题。
本节会通过重新实现租房系统FwxxDAO接口的示例来向大家演示如何在项目中使用Hibernate。
大体步骤如下:
1、在原项目基础上添加Hibernate支持
2、生成TBL_FWXX表对应的实体和映射文件
3、添加com.aptech.jb.dao.hibimpl.FwxxDAOHibImpl类,实现FwxxDAO接口
FwxxDAOHibImpl中add方法代码如下:
通过以上的代码,不难看出,在使用Hibernate进行数据库操作时总有几行代码是相同的,为了迎合面向对象的编程思想,有没有什么好的办法精简不必要的代码呢?
方法如下:
使用BaseHibernateDAO简化编码
通过以上两种方式的对比,不难看出第二种的好处。
使用DAO层的代码会得到无比的精简和起到很好的维护性,可读性。
这正是使用Hibernate的目的之所在。
通过本章的学习,想必读者已经了解到了使用Hibernate所带来的好处,下面一章将继续探讨Hibernate,主要会介绍有关Hibernate如何映射实体间的关联关系。
第七章则着重讲解Hibernate的数据查询。
本章总结
Hibernate是一个对JDBC进行包装的持久化解决方案,是一个优秀的,轻量级的“对象-关系映射”框架。
使用Hibernate的“3个准备,7个步骤”
使用什么方法可以简化“3个准备”?
1.添加需要的jar包。
2.配置Hibernate配置文件。
3.创建实体类和映射文件。
使用什么方法可以简化“7个步骤”?
1.读取并解析配置文件。
Configurationcfg=newConfiguration().configure()
2.读取并解析映射文件,创建SessionFactory对象。
factory=cfg.buildSessionFactory()
3.创建Session对象。
Session.Session=factory.openSession();
4.开启事务(查询操作不需要开启)。
如:
session.beginTransaction()
5.执行持久化方法。
(session.save(Object)).
6.提交事务(session.getTransaction().commit().).。
7.关闭session(session.close())
使用Hibernate实现DAO层,比单纯使用JDBC实现优越在哪儿?
使用提取重复代码到基类的技巧可以简化“7个步骤”。
本章单词
请先完成以下单词:
已学单词复习:
1.Hibernate:
2.Session:
3.Config:
4.Commit:
本章新单词:
1.
Transient:
2.Persistent:
3.Detached:
4.
Transaction:
5.Generator:
6.
Fetch:
7.
Capability:
本章作业
一选择题
1.下面不属于持久化的是()。
A.把对象转换为字符串的形式通过网络传输,在另一端接受到这个字符串后能把对象还原出来。
B.把程序从数据库中读出来
C.从XML配置文件中读取程序的配置信息
D.把程序数据保存为文件
2.下面()不属于关系-对象映射的映射信息。
A.程序包名到数据库库名的映射
B.程序类名到数据库表名的映射
C.实体属性到数据库表字段的映射
D.实体属性类型到数据库表字段类型的映射
3.下面()不是Hibernate映射文件中包含的内容。
(选两项)
A.数据库连接信息
B.Hibernate属性参数
C.主键生成策略
D.属性数据类型
二.简单题
1.举例说明什么是持久化。
2.以实例说明什么是“对象-关系映射”。
3.以与JDBC类比的方式简述使用Hibernate的几个步骤。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 Hibernate 完成 对象 持久