第5章Hibernate5框架技术入门 Hibernate创造性地使用对象-关系映射(Object-RelationMapping,ORM)模型,将 关系数据转换为对象,简化数据的操作方式。在软件项目开发中,要能够创造性地提出 问题的解决方案。 在JavaWeb项目开发中,有许多功能模块需要连接数据库系统,实现对数据库表的操 作。在Java程序设计和JSP程序设计技术中,使用JDBC(JavaDataBaseConnectivity)技 术连接数据库。为了实现与数据库的高效操作,提高JavaWeb的项目性能,可以使用 Hibernate5框架技术。本章主要介绍Hibernate5的基本内容。 本章主要内容如下 。 (1)Hibernate5的发展与特点 。 (2)Hibernate5软件包的下载与配置 。 (3)Hibernate5的工作原理 。 (4)Hibernate5的核心组件 。 (5)基于Struts2+Hibernate5的登录和注册系统。 5.1 Hibernate5的基础知识 Hibernate是封装了JDBC的一种开放源代码的对象-关系映射框架,使程序员可以使 用面向对象的思想操作数据库。Hibernate是一种对象-关系映射的解决方案,即将Java对 象与对象之间的关系映射到数据库表与表之间的关系。 Hibernate5 的基础知5.1 Hient5的发展与特点 识1.brae 目前,Hibernate是Java工程师招聘中要求必备的一门技能,也是JavaWeb三大经典 框架之一。 2001年,Hibernate1发布,即Hibernate的第一个版本;2003年,Hibernate2发布,并在 当年获得Jolt2003大奖(Jolt大奖素有“软件业界的奥斯卡”的美誉,共设通用类图书、技术 类图书、语言和开发环境、框架库和组件、开发者网站等十余个分类大奖),同年,Hibernate 被JBos 公司收购,成为该公司的子项目之一;2005年,JBos 公司发布Hibernate3;2006 年,o公司被Rdht公司收购;2012年11月,Hient1.2015年3月, JBs eabrae4.8发布; Hibrae5. ent0发布。 Hibernate是封装了JDBC与ORM技术的数据持久性解决方案。在Java世界中, Hibernate是众多ORM软件中获得关注最多、使用最广泛的框架。它成功地实现了透明持 久化,以面向对象的HQL语句封装SQL语句,为开发人员提供了一个简单灵活且面向对 象的数据访问接口。Hibernate是一个开源软件,开发人员可以很方便地获得软件源代码。 230 当遇到问题时,程序员可以深入源代码中查看究竟,甚至修改Hibernate内部错误并将修改 方案提供给JBos 公司,从而帮助Hibernate框架技术改进。 Hibernate自发布以来受到业界的欢迎,目前许多Java程序员学习和使用它来开发商 业应用软件。另外,网络上有大量介绍和讨论Hibernate应用的文章,JBos 网站也提供了 一个完善的社区,所以一旦在使用中遇到问题,开发者可以轻松地在网络上搜索到相应的解 决方法,这又进一步吸引了更多的程序员来学习Hibernate,吸引更多的公司采用Hibernate 开发软件。 Hibernate为使用者考虑得十分周全,对于一个普通的程序员来说,只需学习不到10个 类的用法就可以开发基于Hibernate框架的应用系统,实际使用起来十分方便。 Hibernate提供了透明持久化功能,支持第三方框架,即能与其他框架进行整合,如 Struts、Spring等,不但提供面向对象的HQL,而且支持传统的SQL语句。 在基于MVC设计模式的JavaWeb应用中,Hibernate可以作为应用的数据访问层或 持久层。它具有以下特点。 (1)Hibernate是一个开放源代码的对象-关系映射框架,它对JDBC进行了非常轻量级 的对象封装,使得Java工程师可以随心所欲地使用面向对象编程(ObjectOriented Programming,OOP)思维来操作数据库。Hibernate可以应用在任何使用JDBC的场合,既 可以在Java的客户端程序使用,也可以在Servlet、JSP的JavaWeb应用中使用,最具革命 意义的是,Hibernate可以在JavaEE框架中取代CMP,完成数据持久化的重任。 (2)Hibernate的目标是成为Java中处理数据持久性问题的一种完整解决方案。它协 调应用程序与关系数据库的交互,把开发者解放出来,专注于项目的业务逻辑问题。 (3)Hibernate是一种非强迫性的解决方案。开发者在写业务逻辑和持久化类时,不会 被要求遵循许多Hibernate特定的规则和设计模式。这样,Hibernate就可以与大多数新的 和现有的应用程序进行集成,而不需要对应用程序的其余部分做破坏性改动。 5.2 Hient5软件包的下载和配置 1.brae 本书的实例和项目使用的是Hibrae5.12版本, ent2.2017年10月发布,如需使用 Hibernate其他版本进行Web项目开发,可以在其官方网站下载。 1.软件包下载 由于Hibernate先被JBos 公司收购,后来JBos 公司被Redhat公司收购,所以 Hibernate5可以在以下3个网站下载:www.redhatcom 、www.bos.org和www. jhibernateorg。根据需要在上述3个网站下载自己要使用的(.) Hibernate版本。官方页面之 一如图5-1所(.) 示。 单击图5-1所示页面中的HibernateORM,出现图5-2。 单击图5-2所示页面中的选择点5.出现如图5-在该页面 2后,3所示的版本选择页面, 的下方单击5.12.nl区域中的Downod按钮进行下载。 2.Fiala 单击图5-3所示页面中Download按钮后,出现图5-4,选择下载路径后进行下载。 2.Hibernate5软件包中主要文件 解压缩hibraerlae5.12.iazp文件后得到一个名为hient-ees ent-ees-2.Fnlibraerlae 5.12.nl的文件夹,-示。 2.Fia该文件夹结构如图55所(.) 231 图5- 1 Hibernate官方页面 图5- 2 选择下载页面 图5- 3 版本选择页面 232 图5- 4 选择下载路径 图5- 5 Hibernate5文件夹结构 (1)documentation文件夹:存放Hibernate5的相关文档,包括Hibernate5的参考文档和 API 文档等。 (2)lib文件夹:存放Hibernate5框架的核心类库以及Hibernate5的第三方类库。该 文件夹下的required子目录存放运行Hibernate5项目时必需的核心类库。 (3)project文件夹:存放Hibernate5项目的源代码。 3.Hibernate5的配置 Hibernate5的lib文件夹有6个子目录,需要在项目的类库中添加required和jpametamodel-generate子目录下面的所有JAR 文件,其他目录中的JAR 文件可根据项目的 实际需求添加。例如,使用连接池需要添加lib\optional\c3p0下面的JAR 文件和使用缓存 功能需要使用lib\optional\chcache下面的JAR 文件。 由于Neten2和MyElpsbrae, Bas8.cie2017 中都集成了Hient所以可以使用工具中自 带的Hibernate。集成的Hibernate版本一般不是Hibernate的最新版本。由于Hibernate 各版本之间存在一些细节差异,有可能在配置文件和映射文件中存在差异导致项目无法运 行。使用本书进行项目开发时建议使用Hibrae5.12 。在Neten2、MyEcis ent2.Bas8.lpe 2017 和Eclpe中配置Hiberate与第1章中介绍的配置Stus2.10 的方法相似,这里不 isnrt5. 233 再介绍。 5.1.3Hibernate5的工作原理 Hibernate5的工作原理如图5-6所示。 图5- 6 Hibernate5的工作原理 Hibernate5的工作原理如下。 首先,Cofgrtobraeient.fxm niuain读取Hient5的配置文件hbraecg.l和映射文件 *.hbm.xml中的信息,即加载配置文件和映射文件,并通过Hibernate5配置文件生成一个 多线程的SesionFactory对象。然后,多线程SesionFactory对象生成一个线程Sesion对 象。Sesion对象生成Query对象或者Transaction对象。可通过Sesion对象的get()、 load()、save()、update()、delete()和saveOrUpdate()等方法对持久化对象(Persistent Objects,PO)进行加载、保存、更新、删除等;也可利用Query对象执行查询操作;如果没有 异常,Transaction对象将提交这些数据到数据库中。 5.brae5的核心组件 2 Hient 基于Hibernate5框架的项目开发的关键点就是使用Hibernate5的核心类和接口,即核 心组件。Hibernate5的核心组件位于业务层和持久化层之间。Hibernate5除核心组件外 还包括Hibraehbraecxmient.oris)、xx. ent5配置文件(ient.fg.l或hbraeprpete映射文件(xient5 hbm.l)和持久化对象。 Hbraexm 的核心组 件1.Configuration Configuration负责配置并启动Hibernate5,创建SesionFactory对象。在Hibernate5 的启动过程中,Configuration类的实例首先定位映射文件位置、读取配置,然后创建 SesionFactory对象。 2.SesionFaty SesionFactroy(c) 负(r) 责初始化Hibernate5。它充当数据存储源的代理,并负责创建 234 Sesion对象,这里用到了工厂模式。需要注意的是,SesionFactory并不是轻量级的,因为 一般情况下,一个项目通常只需要一个SesionFactory即可,当需要多次操作数据库时,可 以为每个数据库指定一个SesionFactory线程对象。SesionFactroy是产生Sesion实例 的工厂。 3.Sesin Sesion负(o) 责执行PO的操作,它用get()、load()、save()、update()和delete()等方法来 对PO进行加载、保存、更新及删除等操作。但需要注意的是,Sesion对象是非线程安全 的。同时,Hibernate5的Sesion不同于JSP应用中的HtpSesion。这里使用的Sesion 术语,其实指的是Hibernate5中的Sesion。 4.Transaction Transaction负责事务相关的操作,用来管理Hibernate5事务,它的主要方法有commit() 和rolback(),可以使用Sesion的beginTransaction()方法生成。它是可选的,开发人员也 可以设计编写自己的底层事务处理代码。 5.Qry Query(u) 负(e) 责执行各种数据库查询。它可以使用HQL对PO进行查询操作。Query对 象可以使用Sesion的createQuery()方法生成。 6.Hibet5的配置文件 Hibernate5(r) 的(a) 配置文件主要用来配置数据库连接参数,(e) 例如,数据库的驱动程序、URL 、用 户名和密码、数据库方言等。它有两种格式:hbraecg.l和hbraeprpete ient.fxmient.oris。两 者的配置内容基本相同,但前者比后者使用方便一些,如hibraecg.l可以在其 ent.fxm<maig>子元素中定义用到的映射文件(xx.xml)列表,而使用hbraepoetes时 ppnxhbm.ient.rpri 则需要在程序中以编码方式指明映射文件。一般情况下,hbraecgxmbrae ient.f.l是Hient5的默 认配置文件。 7.映射文件 映射文件(xxhbm.l)用来把PO与数据库中的表、PO之间的关系与表之间的关系 x.xm 及PO的属性与表字段一一映射起来,它是Hibernate5的核心文件。 8.持久化对象 PO可以是普通的JavaBean,唯一特殊的是它们与Sesion相关联。PO在Hibernate5 中存在3种状态:临时状态(Transient)、持久化状态(Persistent)和脱管状态(Detached)。 当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这 个JavaBean对象就称为临时对象(TransientObject);当它与一个Sesion相关联时,就变 成持久化对象;在Sesion被关闭的同时,对象也会脱离持久化状态,变成脱管对象 (DetachedObject),这时可以被应用程序的任何层自由使用,例如,可用作与表示层(V)打 交道的数据传输对象。 5.基于Srt2和Hient5的登录和注册系统 3 tusbrae 基于Struts2 trt5.benat2.和Hibernate5 下面使用Sus2.10和Hire5.12开发一个实现登录和注册功能的项目,该的登录和注 项目的文件结构如图5-tus2.10 、Hient2.册系统 7所示。将项目中使用到的Srt5.brae5.12以及 235 MySQL的JDBC驱动JAR文件添加到项目ch05的“库”中,如图5-8所示。 图5- 7 项目的文件结构图5- 8 项目所需的JAR 文件 1.项目介绍 本项目实现用户登录和用户注册功能。有一个登录页面(gn.sp),代码如例51所 loij 示;登录页面对应的业务控制器为LoginAction类,该Action中覆盖了validate()方法,使 用手工验证对登录页面进行验证,该业务控制器类代码如例5-4所示;如果输入的用户名和 密码都正确,进入登录成功页面(sus.sp),代码如例5-2所示;如果用户没有注册需先注 cej 册,注册页面(register.jsp)代码如例5-3所示;注册页面对应的业务控制器为 RegisterAction类,代码如例5-5所示,注册成功后返回登录页面。此外,还需要配置web. xml,代码如例1-3所示;在strutsxml中配置Action,代码如例5-6所示。 该项目使用MySQL数据库。数(.) 据库名为test,有一张名为info的表,表的字段名称、 类型以及长度如图5-9所示。 在基于Struts2+Hibernate5的项目开发中,连接数据库时需要Hibernate5的配置文 件hibraecg.l或者hient.rpris,本项目使用的是hbraecg.l,代码如 ent.fxmbraepoeteient.fxm 例5-7所示,配置文件主要用于加载数据库的驱动以及与数据库建立连接等,该配置文件一 般与strt.l文件放在同一位置,参考图5-7。该配置文件在项目运行时需要加载,本项 usxm 目编写一个加载该配置文件的类HibernateSesionFactory,该类封装了配置文件的加载方 法,即加载配置文件的JavaBean,代码如例5-8所示。 另外,在使用Hibernate5时,项目所用数据库中的每张表都对应一个PO 。通过PO把 236 图5- 9 数据库info表的结构 页面中的数据保存起来并把数据存到数据库中。为了简化开发,本项目的登录页面和注册 页面都使用同一张表,登录页面和注册页面中的数据都保存在UserInfoPO 中,代码如例5-9 rnhbm.-映 所示。每个PO 一般都会对应一个映射文件UseIfoPO.xml,代码如例510 所示, 射文件配置PO 与数据库中表之间的映射关系;映射文件一般都放在和其对应的PO 所在 包中。为了封装登录和注册功能对数据的操作,即登录和注册页面要实现的业务逻辑,本项 目编写一个名为LoginRegisterInfo的JavaBean,该类提供了登录和注册业务处理,可以实 现登录和注册的持久化业务操作,代码如例5-11 所示。 以上文件所在的路径可参考项目文件结构图5-7。 2. 在web.l中配置核心控制器StusrprAdEeueitr xmrtPeaenxctFle 参考1.1节中的例13。 3. 3. 编写视图组件(JSP 页面) 登录页面(gn.p)运行效果如图510 所示,代码如例5-1所示。 loijs 图5-10 登录页面 loijsp)。 gn. 237 【例51】登录页面( 2 38 <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="基于SH 的应用"></s:text></title> </head> <body bgcolor="#CCCCFF"> <s:form action="login" method="post"> <br><br><br><br><br><br> <table border="1" align="center" bgcolor="#AABBCCDD"> <tr> <td> <s:textfield name="userName" label="用户名字" size="16"/> </td> </tr> <tr> <td> <s:password name="password" label="用户密码" size="16"/> </td> </tr> <tr> <td colspan="2" align="center"> <s:submit value="登录"/> </td> </tr> <tr> <td colspan="2" align="center"> < s:a href="http://localhost:8084/ch05/register.jsp"> 注册 </s:a> </td> </tr> </table> </s:form> </body> </html> 登录成功页面(success.jsp),代码如例5-2所示。 【例5-2】 登录成功页面(success.jsp)。 <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="基于SH 的应用"></s:text></title> </head> <body bgcolor="#CCCCFF"> <hr> <table border="0" align="center" bgcolor="#AABBCCDD"> <tr> 2 39 <td> 欢迎${userName},登录成功! </td> </tr> </table> <hr> </body> </html> 注册页面(register.jsp)如图5-11所示,代码如例5-3所示。 图5-11 注册页面 【例5-3】 注册页面(register.jsp)。 <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><s:text name="基于SH 的应用"></s:text></title> </head> <body bgcolor="#CCCCFF"> <s:form action="register" method="post"> <br><br><br><br><br><br> <table border="1" align="center" bgcolor="#AABBCCDD"> <tr> <td> <s:textfield name="userName" label="用户名字" size="16"/> </td> </tr> <tr> <td> <s:password name="password1" label="用户密码" size="18"/> </td> </tr> <tr> <td>