武汉大学本科毕业论文
Hibernate持久化技术在网上购书系统中的
设计与实现
院(系)名 称:国际软件学院专 业 名 称 :软件工程学 生 姓 名 :皮攀指 导 教 师 :
二○○九年六月
BACHELOR'S DEGREE THESISOF WUHAN UNIVERSITY
The design and implement of Hibernate persistence in the Online Bookstore
College :Wuhan University
Subject :International Software EngineeringName
: PiPan
: Professor
Directed by
June 2009
郑 重 声 明
本人呈交的学位论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于培养单位。
本人签名: 日期:
摘 要
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
本论文主要研究Hibernate的ORM(Object Relationship Mapping)框架、持久化功能以及Hibernate中的六个核心接口 Session、SessionFactory、Transaction、Query、Criteria和
Configuration,并对其进行相关实践。熟悉Hibernate中的框架结构、工作原理。结合Hibernate在网上购书网站上的实践,体会和研究Hibernate的ORM框架和持久化。同时,本论文也将说明利用Hibernate的ORM框架和持久化功能来实现网上购书网站的业务层的基本功能。利用Hibernate的相关技术来对其功能进行优化,达到高性能。
关键词:ORM;持久化;Hibernate的核心接口
ABSTRACT
Hibernate is a open source object-relation mapping framework, who encapsulates JDBC in a light-weight-object way, and this makes Java programmers operate database in the Object-Oriented way arbitrarily. The Hibernate could user in the place where the JDBC could use, both using in the client, and in the the application of Servlet/JSP, the most revolutionary mean is that, the Hibernate could be used in the J2EE with EJB instead of CMP, to accomplish the persistence.
The aim of this the paper is to study the ORM framework of the Hibernate, persistence and the six core interfaces in the Hibernate: Session, SessionFactory, Transaction, Query,Criteria and Configuration, and implement them in the project. Understanding the framework of the Hibernate, the principle and the API of the Hibernate. With the implement of the Hibernate in the Online Bookstore, experience and study the framework and persistence of the Hibernate. Achievement: With the Hibernate to implementing the base functions of the business level of the Online Bookstore. Use the other technologies of the Hibernate to optimize the functions, reaching higher efficiency.
Keywords:ORM;Persistence;Hibernate Core
Interface(Session,SessionFactory,Transaction,Query ,Criteria and Configuration)
目 录
第1章
1.11.21.3
绪论.............................................................................................1
本章内容介绍..................................................................................................1研究背景..........................................................................................................1研究现状及发展趋势......................................................................................21.3.11.3.2
研究现状...............................................................................................2发展趋势...............................................................................................3
1.4项目研究的目的和意义..................................................................................31.4.11.4.2
研究目的...............................................................................................3研究意义...............................................................................................4
1.51.6
论文的主要内容..............................................................................................4本章小结..........................................................................................................4
第2章
2.12.2
网上购书系统方案设计.............................................................5
本章内容介绍..................................................................................................5系统简单介绍..................................................................................................52.2.12.2.2
系统的定位以及系统开发软件...........................................................5系统的框架...........................................................................................5
2.3系统总体方案设计..........................................................................................62.3.12.3.22.3.3
用户模块设计.......................................................................................7管理员模块设计...................................................................................9系统模块设计.....................................................................................12
2.4本章小结........................................................................................................12
第3章
3.13.23.3
Hibernate基本技术介绍..........................................................13
本章内容介绍................................................................................................13Hibernate是什么............................................................................................13Hibernate的主要内容....................................................................................143.3.1Hibernate的框架.....................................................................................14
3.3.2Hibernate的工作原理.............................................................................143.3.3Hibernate的核心接口.............................................................................163.3.4Hibernate API中的主要部分.................................................................183.43.5
Hibernate的优势和劣势................................................................................18本章小结........................................................................................................18
第4章
4.14.24.34.4
数据库设计...............................................................................19
本章内容介绍................................................................................................19数据库需求分析............................................................................................19数据库详细设计............................................................................................20本章小结........................................................................................................24
第5章
5.15.2
系统实现与验证.......................................................................25
本章内容介绍................................................................................................25系统实现........................................................................................................255.2.15.2.25.2.35.2.4
基本类.................................................................................................25用户模块的实现.................................................................................27管理员模块的实现.............................................................................35系统模块实现.....................................................................................45
5.3系统验证........................................................................................................455.3.15.3.25.3.3
用户模块的验证.................................................................................45管理员模块的验证.............................................................................47系统模块的验证.................................................................................51
5.4本章小结........................................................................................................51
第6章全文总结...................................................................................52
参考文献.....................................................................................................53致 谢...........................................................................................................54附录A..........................................................................................................55
第1章 绪论
1.1 本章内容介绍在本章,将会涉及到以下这些内容:
研究背景,它将商业发展中的网站以及企业开发中的情况。研究现状及发展趋势,它将把万维网和Hibernate作为研究对象。
项目研究的目的和意义,它将介绍本论文的研究的目的、意义和主要内容。
1.2 研究背景随着全球经济一体化的逐步深入,购书网站已是现代传统书店必不可少的经营策略,像卓越、当当网等等这些购书网站在互联网时代取得了巨大的成功。目前,购书网站在国际互联网上可以实现的商务功能已经多样化,可以说从最基本的对外沟通展示功能、信息发布功能,在线图书展示功能、在线洽谈功能、在线交易功能、在线采购功能、在线客户服务功能、在线网站管理功能等等,几乎以往传统书店功能都可以在互联网上进行电子化的高效运作。除了购书网站,还有B/B网站,例如阿里巴巴,这些网站已经不是一个简单的出售或者交易网站,它们的存在和发展,能够促进Web开发的发展,使开发技术更快的发展。
在如今的企业级应用开发环境中,面向对象的开发方法已成为主流。众所周知,对象只能存在于内存中,而内存不能永久保存数据。如果要永久保存对象的状态,需要进行对象的持久化(数据持久化顾名思义就是把程序中的数据以某种形式保存到
某存贮介质中,以达到持久化的目的。当程序运行时,一些数据是临时保存在内存中,一旦退出系统,这些数据就丢失了。那么,使用某种手段将数据保存在硬盘上或者数据库中,这样即使退出系统后又重新启动系统,那么这些数据仍然可以重新找回来。),即把对象存储到专门的数据存储库中。目前,关系数据库仍然是使用最广泛的数据存储库。关系数据库中存放的是关系数据,它是非面向对象的。所以对于对象数据与关系数据交互技术成为未来开发的一种潮流。而Hibernate就是这种发展趋势的成果,它的产生解决了对象的持久化问题。同时它能够配合Struts和Spri
1
ng框架,形成SSH的主流开发框架。如今它已经在现代企业开发中占有非常重要的地位。
1.3研究现状及发展趋势1.3.1研究现状
在万维网的最初阶段,网页都是用静态的HTML语言进行编写,所以要使页面内容改变,必须手动修改脚本语言,而且那个时候网页都是静态的,所以页面单一。而发展到现在,万维网采用了更多更先进的技术,例如CSS、JavaScript、Ajax等等,使网页更加漂亮,更加容易维护,并且具有动态的效果。而网页的内容已经不是简单的靠手动来将内容嵌入到脚本语言中,这些内容都是从数据库中提取,利用相关技术在网页中进行显示。就现在的交易网站而言,大部分是两种类型:一种是ASP.NET网站,一种是JSP网站。ASP.NET是是微软公司的一套网站开发系统,而JSP是用JAVA语言开发的网站,这两种网站解决方案是现在网站开发的主流。
相对于万维网发展而言,Hibernate虽然产生时间比较短,但Hibernate版本更新速度非常快,到目前为止有两个阶段性的版本:Hibernate2和Hibernate3。
Hibernate2系列的最高版本是
Hibernate2.1.8,Hibernate3系列在编写本书时的荐广泛使用的版本,但目前使用较多且较稳定的版本是Hibernate 3.1.3或Hibernate 3.1.2。
另外,自Hibernate3发布以来,其产品线愈加成熟,相继出现了
Hibernate注释、Hibernate实体管理器、Hibernate插件工具等一系列产品套件。在方便程序员使用Hibernate进行应用程序
的开发的同时,也逐渐增强了Hibernate产品线的实力。
Hibernate3在产品的应用性上有了极大提高,并且基于Java1.5进行了改进,且与EJB3.0进行了集成,在功能上有了很大的提升。同时,Hibernate除了Java主流开发平台上(例如MyEclipse)有广泛的应用外,还对当今另一主流开发平台——微软的.NET平台进行了支持,因此具有更加强大的生命力。相对于Hibernate2,Hibernate3版本的变化包括三个方面:
API的变化:API
的变化中比较重大的变化是包名的变化,主要是包的根路径发生了改变。
2
元数据:元数据主要是指Hibernate映射文件中各种元素和属性的用法的变化。
HQL查询语句:Hibernate3
采用新的基于ANTLR的HQL/SQL查询翻译器,不过,Hibernate2的查询翻译器也依然存在。(HQL是Hibernate独特的SQL语言,通过它,能够跨越不同数据库SQL的差异性。)
1.3.2发展趋势
随着购书网站等交易平台的发展,这些网站已经不仅用来交易,同时它们形成了一个小的模拟社区,人们可以在网站里进行交流,彼此讨论,并且相互交互物品。而对于以后的发展情况,它们将会加入更多元素,例如博客、游戏等等,使其成为一个更加真正的社区。
而Hibernate它作为一种技术,它是一个非常优秀的持久层解决方案。具有以下发展趋势:
与其他开发框架的集成将越来越成熟:如与struts、spring、jbpm的集成,充分发挥Hibernate自身的优势,也吸取了对方框架的优势,在软件系统的各个层各司其职。
产品线的逐渐完善:通过增加若干的工具套件,并支持。net平台,使Hibernate具有更强大的生命力。
与EJB更好的集成:集成EJB,开始将重点转向重量级应用,使得Hibernate在企业级应用中必将占据一席之地。Hibernate的轻量级 ORM 模型逐步确立了在Java
ORM架构中领导地位,甚至取代复杂而又繁琐的EJB模型而成为事实上的Java ORM工业标准。而且其中的许多设计均被J2EE 标准组织吸纳而成为最新EJB3.0规范的标准。
随着Hibernate的广泛应用,越来越多的Java中间件厂商和Java项目(如JBoss、JBPM等)开始把目光集中到Hibernate上并将其纳入自身的体系,使Hibernate具有了越来越广阔的发展前景。
3
1.4 项目研究的目的和意义1.4.1研究目的
由于技术发展的背景,Hibernate应运而生,它是轻量ORM(Object Relationship Mapping对象关系映射)框架,能够实现对对象和关系数据之间的交互,实现了对象持久化的需求,顺应了现代企业开发中的面向对象的开发需求。
同时相对于JDBC,
Hibernate有诸多优点,它不断能够提供持久化支持,同时它在业务代码量上也减少许多,同时它还能够和现代开发中非常流行的框架Struts, Spring进行结合,为现代企业级开发带来诸多好处。
本论文的研究目的就是将是在网上购书网站上开发中使用Hibernate技术,利用它实现网上购书网站的持久化功能。1.4.2研究意义
Hibernate是一个开放源代码的对象关系映射框架,有专门的开发人员对于它的维护和研究,同时在全世界范围内,也有数以万计的开发人在对Hibernate进行研究。
研究Hibernate不但顺应了技术的发展,同时也能够参与Hibernate的研究的讨论,对推动技术的发展能够做出自己的贡献。
1.5 论文的主要内容本论文研究的主要内容分为技术方面和实践方面。在技术方面的研究内容有:
Hibernate的ORM(Object Relationship Mapping)框架。持久化功能
Hibernate中的五个核心接口
Session、SessionFactory、Transaction、Query、Criteria和Configuration
在实践方面,利用SH(Struts +
Hibernate)框架建造一个网上购书网站,实践Hibernate持久化应用。
4
1.6 本章小结本章主要是介绍了Hibernate的研究背景、意义、目的,以及Hibernate的发展趋势,从宏观方面介绍了Hibernate,同时也说明了本论文的主要内容。
接下来,在下一章,将详细的介绍下Hibernate,介绍它是什么,它的内容是什么,以及它所具有的优势和劣势。
5
第2章 网上购书系统方案设计
2.1 本章内容介绍在本章将会涉及以下内容:
介绍网上购书系统的定位和开发软件,同时也会利用图文形式对本系统的
框架结构进行介绍。
系统总体方案设计,从网上购书网站中的各个模块入手,介绍如何利用Hibe
rnate来实现持久化。
2.2 系统简单介绍2.2.1系统的定位以及系统开发软件
网上购书网站是一个B/C(Business to
Client)网站,售书公司可以通过购书网站作为平台来展示自己的产品,同时和客户进行网上交易。
在本系统的中使用这些软件:开发平台MyEclipse7.0、数据库MySQL5.0、项目管理SVN2.2.2系统的框架
本系统是采用SH(Struts1.3+Hibernate)框架。Struts负责View层和Control层,Hibernate负责持久层。系统框架如图2.1所示
View是由JSP组成View回复请求Control由servlet、action和form组成调用Control调用调用调用Model层由Hibernate实现Adding ModelUpdate ModelDelete ModelQuery ModelDeleteUpdateAdd6数据库Query图 2.1 系统的框架图
用户通过浏览器发送请求到系统,系统的控制层通过调用业务层,业务层主要由Hibernate实现来实现特定的业务。系统的简单用例如图2.2所示。
< 2.3 系统总体方案设计网上购书系统它有三个模块:用户模块,管理员模块,系统模块。系统结构图如图2.3。 网上购书网站系统 用户模块 管理员模块 系统模块 用户注册 用户登陆 用户评论 用户信息管理 购物车 增加图书更新图书修改用户状态新增图书类别修改图书类别管理员登陆超级管理员增加管理员超级管理员修改管理员RSS系统图 2.3 系统结构图 1)用户模块,主要是涉及到用户方面的功能,它有以下内容: 用户注册与登陆:用户注册登陆。 7 用户评论发布:用户发布图书评价信息。用户信息:用户修改个人信息。 购书车:用户选择选购图书,存入购书车等待结账,下次进入购书车时,购物车里上次购物的信息不会丢失。 2)管理员模块: 图书类别管理:新增图书类别,修改类别。图书信息管理:对图书信息进行修改,增加。用户管理:设置用户状态。管理员的登录功能。 超级管理员功能:增加管理员,修改管理员信息。 3)系统模块: RSS系统,用于定制特定内容。 用户模块和管理员模块,是负责对于系统的参与者的功能支持,系统模块是负责对于系统中的一些特定的功能的完成,是对于系统的支持。2.3.1用户模块设计 用户模块是用来负责对于用户的功能的支持。用户模块中有四个功能,下面是这些的详细设计:2.3.1.1 用户注册功能:用于用户注册。模块的简单流程: 用户首先填写相关注册信息,当这些注册信息通过验证以后,就会被插入到数据库中。 Hibernate实现过程设计: 1)底层模块会将用户的注册信息封装到一个Entity对象中。2)然后底层会调用Hibernate API中的save()来将Entity对象插入数据库的表中。 3)插入成功,底层会返回boolean=true;插入失败,底层会返回boolean=false。2.3.1.2 用户登陆功能:用于实现用户登陆。模块的简单流程: 8 用户输入用户名和密码,然后提交,用户登陆模块就会进行验证。Hibernate实现过程设计: 1)用户提交以后,底层首先通过Hibernate API中的Criteria的查询功能,利用用户名来获取用户的Entity对象,Entity对象中封装好了用户的所有信息。如果用户不存在,返回的Entity为Null。2)从Entity中提取出用户密码、用户状态以及其他信息。3)用户登陆模块使用2中的信息和用户输入的信息进行验证。2.3.1.3 用户评论发布 功能:用户对于某一本书发表评论。模块的简单流程: 用户在登陆以后,对于某一本书发表自己的评论,模块将用户发表的评论插入到数据库的表中。Hibernate实现过程设计: 1)用户在发布评论后,用户评论模块首先将用户的用户ID、书籍ID、评论内容 以及发表评论的时间都封装到一个Entity对象中。 2)然后调用Hibernate API中的save()来将这些信息保存到数据库的表中。3)保存成功,用户评论模块会返回一个boolean=true,否则会返回boolean=false 。 2.3.1.4 用户信息管理 功能:实现用户对于自己的信息的管理。模块的简单流程: 用户可以修改用户名以外的其他个人注册信息,模块将会更新用户在数据库中的信息。 Hibernate实现过程设计: 1)当用户进入修改页面的时候,模块会调用Hibernate API中的Criteria根据用户名来查询出用户Entity,并将用户的当前信息显示在一个页面上。 2)用户可以修改用户能够修改的信息。 3)修改以后,更新模块会重新生成一个新的Entity将所有的信息封装进去,然 后,模块调用Hibernate的update()更新用户的信息。 9 4)修改成功,模块会返回一个boolean=true,否则会返回boolean=false。2.3.1.5 购物车 功能:用于记录用户的购书记录,同时用于结算。模块的简单流程: 每当用户打开自己的购物车的时候,模块会将数据库中用户最近的购物记录显示出来。同时用户也可以通过它购买书籍。Hibernate实现过程设计: 1)用户打开自己的购物车的时候,模块会调用Hibernate API中的Criteria,根据用户名来调用获取Entity对象,在Entity中除了封装了用户的个人信息外,还有订单信息。如果用户是新用户,那么订单信息为Null。 2)模块调用最近的订单信息,将其显示给用户。 3)同时用户可以通过购买书籍,在这里生成订单,并将订单存入数据库中。2.3.2管理员模块设计2.3.2.1 增加图书 功能:用于增加新图书信息。模块的简单流程: 当有新书时,管理员在管理员的增加图书界面将新图书的信息添加到表格中,模块将书籍的消息添加到数据库中。Hibernate的实现过程设计: 1)管理员首先将新图书的信息按照页面要求添加到页面。然后提交。2)模块首先会将添加的信息进行验证。验证通过的信息将会被封装到Entity中 ,然后模块调用Hibernate API的save()方法。将所有信息添加到数据库的表中。3)添加成功,模块返回一个boolean=true,否则返回boolean=false。2.3.2.2 更新图书功能:用于更新图书信息。模块的简单流程: 当有的书籍需要修改信息时,管理员首先根据书籍ID寻找出要更新的图书,然后修改图书的信息,提交以后,系统调用更新图书模块来更新图书信息。 10 Hibernate的实现过程设计: 1)管理员首先根据书籍ID来查询到书籍。 2)模块会根据书籍ID调用Hibernate的Criteria将所有的书籍信息Entity中,并将 Entity中各项信息显示在网页上,管理员可以在网页上修改除了ID以外的信息。 3)管理员提交以后,书籍更新的信息被封装到一个新的Entity中,模块调用Hib ernate API的update()来更新书籍信息。 4)更新成功,模块返回boolean=true,否则返回boolean=false。2.3.2.3 修改用户状态功能:管理员修改用户的状态。模块的简单流程: 当管理员需要修改某一个用户的状态的时候,管理员利用此功能,首先搜索出该用户,得到该用户的当前状态,然后修改该用户的状态。Hibernate的实现过程设计: 1)管理员首先进入搜索页面,输入用户的用户名,搜索出用户的状态信息。2)然后管理员选择用户的新状态。提交。 3)提交以后,模块掉用Hibernate API的Update方法来修改用户的状态。4)修改成功,返回boolean=true,否则boolean=false。2.3.2.4 新增图书类别 功能:向数据库的类别表中增加新的图书类别。模块的简单流程: 当图书类别表中的数据缺失的时候,通过此模块,管理员向表中添加相关新图书类别信息。 Hibernate的实现过程设计: 1)管理员首先填写好新图书类别信息。然后提交。 2)提交后,模块会将图书类别信息封装到一个Entity中,然后模块调用Hibernat e API中的save()方法,将图书类别信息出入数据库。3)插入成功,模块返回boolean=true,否则boolean=false。2.3.2.5 修改图书类别 功能:修改图书类别表中已经存在的图书类别信息。 11 模块的简单流程: 当图书类别表中的数据有问题时,管理员使用该模块。模块首先搜索出要修改的图书类别,搜索出来的信息都显示在网页上,管理员可以在上面进行修改,然后提交,模块会使用新的图书类别信息更新图书类别表中的过时信息。Hibernate的实现过程设计: 1)管理员通过图书类别名称搜索图书类别,模块会调用Hibernate API中的Criteria来寻找出管理员寻找的图书类别,然后将这个图书类别的所有信息封装到一个Entity中。 2)模块将这个图书类别Entity的信息,显示在网页上,管理员可以进行修改。3)修改以后,提交。模块会将新的图书类别信息封装到一个新的Entity中,将 调用Hibernate API中的update()来对数据库中的图书类别进行更新。4)修改成功,模块返回boolean=true,否则boolean=false。2.3.2.6 管理员登陆功能:管理员进行登陆。模块的简单流程: 管理员进入管理员登陆界面,然后输入相关登陆信息,模块从数据库中提取出管理员的信息,并将其封装到一个Entity实体中,然后与管理员输入的信息进行比对。 Hibernate的实现过程设计: 1)管理员输入登录信息。模块根据用户的用户名获取出用户的信息,这些封 装到一个Entity实体中。 2)然后将实体中的数据与管理员输入的信息进行比对。2.3.2.7 超级管理员增加管理员功能:超级管理员增加系统新的管理员。模块的简单流程: 超级管理员进入添加管理员页面,添加管理员相关信息,提交,模块将管理员的信息插入到数据库中。Hibernate的实现过程设计: 1)超级管理员进入添加管理员的页面,添加新增管理员的信息,提交。 12 2)提交以后,模块将管理员的信息封装到一个Entity中,然后调用Hibernate API中的save()方法将新增管理员的信息插入到数据库中。3)插入成功,模块返回一个boolean=true,否则boolean=false。2.3.2.8 超级管理员修改管理员信息 功能:超级管理员通过此模块修改管理员的相关信息。模块的简单流程: 超级管理员首先搜索出要修改的管理员,系统返回给超级管理员的是该管理员的信息页面,超级管理员可以再上面修改信息,提交,模块将更新该管理员的信息。 Hibernate的实现过程设计: 1)超级管理员搜索管理员,模块通过搜索信息调用Hibernate API的Criteria来获取该管理员的Entity,该实体封装了该管理员的所有信息。 2)系统以页面形式返回给超级管理员,超级管理员通过该网页进行修改该管 理员的信息。然后提交。 3)提交以后,模块会将管理员的新信息封装到一个新的Entity中,然后调用Hib ernate API中的update(),将管理员的信息进行更新。4)更新成功,返回结果为boolean=true,否则boolean=false。2.3.3系统模块设计2.3.3.1 RSS系统 功能:用户可以通过RSS系统来定制购书网站里的特定信息。模块的简单流程: RSS系统能够获取特定定制特定信息,将其反馈给用户。Hibernate的实现过程设计: RSS系统调用DAO中的子模块,通过此子模块,RSS能够获得特定信息。 2.4 本章小结本章主要简单的介绍了网上购书系统的结构,以及全面的介绍了使用Hibernate设计对于每个功能的实现。本章从宏观和微观的角度介绍了本系统。 13 在下一节,将会介绍下Hibernate:Hibernate的ORM模型,Hibernate的工作原理,Hibernate的核心接口,Hibernate的API中的主要部分,以及Hibernate的优势和劣势。 14 第3章 Hibernate基本技术介绍 3.1 本章内容介绍在本章将会涉及以下内容: Hibernate是什么,将会从Hibernate的定义, Hibernate的使用场合,和为什么要使用Hibernate。 的主要内容,将会介绍Hibernate的框架,工作原理,核心接口以及Hibernate API中的主要部分。 Hibernate的优势劣势,将会用Hibernate和JDBC进行对比,来说明Hibernate 的优势和劣势。 3.2 Hibernate是什么在这一节里,我将从三个方面:Hibernate的定义?Hibernate用在什么场合?为什么要使用Hibernate? Hibernate简单的说,就是和数据库建立会话,然后和数据库进行交互的一种框架。它的定义是Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库[1]。 Hibernate的使用场合是可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 对于为什么要使用Hibernate?主要有以下几点: Hibernate支持了企业级开发中数据对象的持久化。它是轻量级模型,占用资源小。 它能够让开发人员从繁琐的SQL语言中解脱出来,减轻开发人员的负担。Hibernate是J2EE标准中的一部分,它的架构已经被融进现代开发中,并且得到了广泛的应用和实践。所以从市场份额来说,它有着非常大的优势。 最后一点就是,Hibernate是开源框架,并且有专门的维护人员进行维护和更新,所以在未来的发展中,Hibernate的价值将会被不断地扩大。 15 3.3Hibernate的主要内容3.3.1Hibernate的框架 如Hibernate的定义一样,Hibernate是一个ORM(对象关系映射)框架。在这个框架中,用三个部分:关系数据库、映射文件(.xml)、实体(类似JavaBean结构的对象),通过映射文件,关系数据库中的数据可以和实体进行交互,实体数据通过映射文件将数据存入数据库,从而实现数据的持久化。通过以上可以看出,Hibernate的操作对象是Entity对象,而不是直接的数据。ORM结构如图3.1所示。 Entity关系数据库XML文件*11*-...+get()+set()更改数据显示数据{页面}图3.1 ORM结构图 3.3.2Hibernate的工作原理 Hibernate实现ORM映射,必须完成两个配置文件:hibernate.cfg.xml,这个是Hibernate中的主配置文件;同时还有以hbm.xml结尾的配置文件,它里面记录了关系数据库中的哪个表应该和哪个实体进行映射,为了使整个文件能够工作,它还必须在hibernate.cfg.xml中注册。下面我将详细介绍下这两个配置文件中的主要属性。3.3.2.1 hibernate.cfg.xml文件 它是Hibernate中的核心文件,由于Hibernate是JDBC的轻量级封装。所以Hibernate的在底层实现过程中使用了JDBC中的API。在hibernate.cfg.xml中,正是配置了相关JDBC的配置。内容如下: ① 16 ④ ④是表示JDBC连接数据库的协议方式,不同的数据库使用的协议不一样,例如MySQL的协议方式为:jdbc:mysql://主机名:端口号(一般为3306)//数据库名。⑤是表示访问数据库所使用的JDBC驱动。JDBC驱动是Java程序访问数据库的接口驱动程序。Java程序通过JDBC驱动提供的接口进行数据库的访问操作。⑥是表示Hibernate所使用的方言。Hibernate使用方言可以实现数据库的跨平台操作。 ⑦是注册hbm.xml文件。 这些是hibernate.cfg.xml中最重要的配置属性。实现了数据库的会话设置,跨平台操作设置以及映射的注册。3.3.2.2 hbm.xml配置文件 hbm.xml配置文件是Hibernate中用于Entity和关系数据库映射的文件,它的主要属性如下: ① ② ③ ⑤ ⑥ 17 ④ ⑦ ⑧ ①中name中是设置映射的实体名称,table表示映射的数据库中的表明,catalog表示映射的数据库名。 ②中name表示实体中主键属性的名字,type表示数据类型。③中name表示数据库表中所对应的主键属性名。 ④中class表示所采用生成主键的生成器,比如有native为自动生成,assigned为手动生成。 ⑤中name表示实体中属性的名字,type表示数据类型。⑥中name表示数据库表中所对应的属性名,type表示数据类型。⑦和⑧中many-to-one、one-to-many都是Hibernate中最常用的用来表示表之间关系的内容。class是指对应的表的实体的对象名,set是数据结构是用来表示一对多的映射。key之间的属性是表示表之间对应的属性。 hbm.xml配置文件必须要hibernate.cfg.xml中注册才能生效。3.3.3Hibernate的核心接口 Hibernate的核心接口一共有六个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。各个接口在框架中有不同的作用,不同的位置,具体如图3.2所示。 18 图3.2 Hibernate核心接口结构图 下面对这六个核心接口分别加以介绍。 Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的 SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的 HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称 为用户session。 SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个 SessionFactory。 Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。 Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 19 Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。3.3.4Hibernate API中的主要部分 在Hibernate API中最主要的部分是用来实现增、删、查、改。相对于JDBC对于数据的操作,Hibernate里是主要是对于对象进行操作。下面将具体介绍下增、删、查、改中所使用的方法。 1)增:save(Entity),将封装有数据的实体插入到数据库中。 2)删:delete(Entity),将数据库中与Entity中封装数据相同数据删除。3)改:update(Entity),用封装有数据的实体来更新数据库中的数据。 4)查:Criteria和Query,是都能够用于进行查询,但是Criteria是利用对象进行查询 ;而Query是利用hql(类似于sql语句,是Hibernate中独有的关系数据库语言)语句进行查询。 3.4 Hibernate的优势和劣势Hibernate作为JDBC的非常轻量级封装,相对于JDBC,它有诸多优势,例如:Hibernate能够减少大量的sql语句的代码编写,减轻了开发人员的任务量;同时Hibernate是是一个轻量级封装,所以它占用的空间、内存是非常小的。 相对于优势,Hibernate也有劣势,Hibernate不适合要直接处理大量数据的系统,而JDBC却能够符合这样的条件。 3.5 本章小结本章详细的介绍了Hibernate,Hibernate主要是对于实体对象的操作,在Hibernate中有大量的API供开发人员使用。同时相对于JDBC而言,它有优势,也有劣势。 在下一章,将介绍网上购书网站的数据库设计。 20 第4章 数据库设计 4.1 本章内容介绍在本章中将会涉及到以下内容: 数据库需求分析,从基本设计角度来分析数据库中表的确定。 数据库详细设计,将会从数据库中表的角度介绍网上购书网站数据库表中 的详细内容。 4.2 数据库需求分析由于网上购书网站是一个B/C系统,所以在数据库的需求方面,需要为用户、管理员、书籍建立表。 同时对于每本书,用户可以进行评论,用户也可以进行购买图书,所以在系统的数据库中必须为评论和订单必须建立表。同时书籍有种类,所以必须建立书籍种类表。 对于网上购书系统还有管理员,所以为管理员必须建立一个表。 同时对于用户的一些信息,例如工作、城市、省份这些信息都是现有的信息,所以需要建立单独的表。这样就能够减少数据库中数据的冗余。 所以总结上述原因,可以初步得出以下表: 表单USERCOMMENTBOOK BOOK_CATEGORYORDERINFORJOBCITYPROVINCEADMIN 21 表单名称用户表评论表书籍信息表书籍类型表订单表工作信息表城市信息表省份表管理员表 4.3 数据库详细设计通过数据库的需求,可以的得出相关表,但是这些还不够,还要设计出表的属性,以及彼此之间的关系。图4.1就是数据库的视图。(由于空间有限,附录中给出了一张清晰的视图) JOBJOB_IDint(4) 下面是各个表的详细内容:Admin表如表4.1: 表4.1 Admin表 属性名ADMIN_ID 类型int 长度44032400 22 是否为null否否否否否 主键是否否否否 外键否否否否否 ADMIN_NAMEvarcharPASSWORDEMAIL varcharvarchar CREATE_TIMEdatetime ADMIN_TYPESTATUS intint 11 否否 否否 否否 BOOK表如表4.2: 表4.2 BOOK表 属性名CATEGORY_IDBOOK_IDAUTHORPUBLISHERPUBLISH_DATEVERSIONISBNPAGEPRICEDISCOUNTIMAGEBOOK_NUMADDTIMEDESCRIBTIONBOOK_NAME intvarcharintfloatfloatvarcharintdatetimevarcharvarchar 3135552259022550 是否是否是是否否是否 否否否否否否否否否否 否否否否否否否否否否 类型int9Varcharvarchardate 长度44040500 是否为null否否否否是 主键否是否否否 外键是否否否否 BOOK_CATEGORY表如表4.3: 表4.3 BOOK_CATEGORY表 属性名 类型 长度 是否为nul主键l CATEGORY_IDCATEGORY_NAMEPARENT_CATEGORY 23 外键否否否 intvarcharint 4204 否否是 是否否 LEVEL CITY表如表4.4: int 1 否否否 表4.4 CITY表 属性名 类型 长度 是否为nul主键l CITY_IDDESC_CHDESC_ENABBR_CHABBR_ENPROVINCE_IDSTATUS intvarcharvarcharvarcharvarcharintint 46060404041 是是否是是否是 是否否否否否否 否否否否否是否外键 COMMENT表如表4.5: 表4.5 COMMENT表 属性名 类型intintintvarchardatetime 长度 是否为nul主键l COMMENT_IDBOOK_IDUSER_IDCONTENTTIME JOB表如表4.6: 表4.6 JOB表 属性名 类型intvarchar 长度 是否为nul主键l JOB_IDJOB_NAME 430 否否 是否 否否外键 4992250 否否否否否 是否否否否 否是是否否外键 ORDER_DETAIL表如表4.7: 表4.7 ORDER_DETAIL表 24 属性名类型intintintintfloatfloat 长度999555 是否为nu主键ll 外键否是否否否否 DETAIL_IDORDER_IDBOOK_IDBOOK_NUMPURCHASE_PRICEPURCHASE_DISCOUNTORDERINFOR表如表4.8: 否否否否否否 否是否否否是 表4.8 ORDERINFOR表 属性名 类型intvarcharvarcharvarcharintfloatdatetimeintintintintintdatetimeint 长度940150116801111109 是否为nu主键ll否否否否否否是否否否否否是否 外键否否否否否否否否否否否否否是 ORDER_IDACCEPTERADDRESSPHONEPOSTCODEORDER_SUMDILIVER_TIMEORDER_STATEDELIVER_DAYDELIVER_MODEPAY_MODEIS_PAYRECEIVE_TIMEuser_id PROVINCE表如表4.9: 是否否否否否否否否否否否否否 表4.9 PROVINCE表 属性名 类型 长度 25 是否为nu主键外键 ll PROVINCE_IDDESC_CHDESC_ENABBR_CHABBR_ENSTATUS USER表如表4.10: 表4.10 USER表 属性名 类型intintintvarcharvarcharvarcharvarcharvarcharintdatevarchardatetimeint 长度94450402040101020001 是否为nu主键ll USER_IDJOB_IDCITY_IDOPEN_IDUSER_NAMEPASSWORDEMAILNICKNAMEGENDERBIRTHDAY SELF_INTRODUCATIONCREATE_TIMEUSER_STATE 否是是是否否否是是是是否是 是否否否否否否否否否否否否 否是是否否否否否否否否否否外键 intvarcharvarcharvarcharvarcharint 4404020201 否是是否是是 是否否否否否 否否否否否否 4.4 本章小结本章主要介绍了数据库的需求,以及数据库的详细设计。数据库支持了本系统的数据的持久性。从数据库的需求、设计到实现过程,以及在系统的实现过程中,数据库经过数次修改,使其更加完善,更能适合网上购书网站的需求。 26 在下一章,将会详细说明利用Hibernate实现系统的相关功能。 27 第5章 系统实现与验证 5.1 本章内容介绍本章中将会涉及以下内容: 系统实现,介绍Hibernate实现本系统的功能,利用详细代码图片来说明实现 过程,同时利用系统界面来说明实现过程。系统验证,介绍对系统测试进行黑河测试的过程。 5.2 系统实现5.2.1系统实现模块图 在网上购书系统中,Hibernate实现的各个类的关系如图5.1所示: HibernateSessionFactory-configuration-sessionFactory+getSession()提供建立会话getSession()调用关系数据库BaseHibernateDAO+Session+getSession()+closeSession()继承具体业务类-...+...()图5.1 Hibernate实现系统中各个类之间的关系图 在利用Hibernate实现系统的持久化时,提供了HibernateSessionFactory和BaseHibernateDAO两个基本类。类HibernateSessionFactor提供configuration和sessionFactory两个接口,并且提供了获取会话的方法getSession(),类BaseHibernateDAO则调用了getSession(),并且提供了关闭会话的方法closeSession(),而具体的业务实现其他类继承BaseHibernateDAO,从而能够得到获取会话和关闭会话的对象。 28 5.2.2基本类 在整个系统中,有两个基本类HibernateSessionFactory和BaseHibernateDAO。5.2.2.1 HibernateSessionFactory类 HibernateSessionFactory内部封装了Configuration、SessionFactory以及Session的实现,对于这些部分的实现的代码如下。 下面的代码为Configuration、SessionFactory的实现过程,如下所示: private static String CONFIG_FILE_LOCATION = \"/hibernate.cfg.xml\";private static final ThreadLocal private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory;private static String configFile = CONFIG_FILE_LOCATION; static { try { configuration.configure(configFile); sessionFactory = configuration.buildSessionFactory();} catch (Exception e) { System.err.println(\"Error Creating SessionFactory \");e.printStackTrace();} } 下面的代码为Session的实现过程,通过它可以获得与数据库的会话,代码如下 所示: public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get();if (session == null || !session.isOpen()) { if (sessionFactory == null) { rebuildSessionFactory();} 29 session = (sessionFactory != null) ? sessionFactory.openSession(): null; threadLocal.set(session);} return session;} 5.2.2.2BaseHibernateDAO BaseHibernateDAO类是DAO的基本类,通过继承它,其他DAO(全称Datebase Access Object,是用于访问数据库,并进行相关操作)类可以获取相关会话,以及关闭会话。在它的内部有两个方法:getSession()和closeSession()。 getSession()是获取会话,以下为它的代码:public Session getSession() { session=HibernateSessionFactory.getSession(); return session;} closeSession()是用于关闭会话,以下为它的代码: public void closeSession(){ if(session!=null){ session.close();session=null;}} 5.2.3用户模块的实现 在用户模块中有这些功能:用户注册、用户登陆、用户评论发布、用户信息、购物车。以下是这些子模块的Hibernate实现,以及部分代码。5.2.3.1 用户注册 用户注册就是将用户的信息加入到数据库中,此子模块调用了Hibernate API的save()方法,以及Transaction事务处理,实现代码如下: public boolean addUser(User user){ 30 boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(user);tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 用户注册界面如图5.2,通过这个界面,数据被封装到User中,然后系统调用addUser()来增加用户。 31 图5.2 用户注册界面 5.2.3.2 用户登陆 用户登陆就是将用户的登录信息与数据库中存储的信息进行比对,通过的可以通过。在此子模块中调用了Hibernate API中的Criteria接口,实现代码如下所示: public User getUserbyName(String username){ User user=null; if(super.getSession()!=null){ try { Criteria cri=super.session.createCriteria(User.class); cri.add(Restrictions.eq(\"userName\user=(User)cri.uniqueResult();} catch (HibernateException e) { throw e;}finally{ super.closeSession();return user; 32 }}else{ return user;}} 用户登陆要输入验证信息,验证信息从如图5.3界面获取,传到getUserbyName(),然后获取登陆用户的所有信息,将其封装到一个User对象中。 图5.3 用户登陆界面 5.2.3.3 用户评论发布 用户发表评论是将用户评论加入到数据库中,在此子模块的实现中同样也调用了Hibernate API中的Transation事务管理,以及save()方法,实现代码如下所示: public boolean addComments(Comment comment){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(comment);tr.commit();result=true; } catch (HibernateException e) { 33 e.printStackTrace();if(tr!=null){tr.rollback();} throw e;}finally{ return result;}}else{ return result;}} 用户评论发布界面如图5.4,用户通过发表评论界面发表评论,然后系统调用addComment(),将评论添加到是数据库中。 图5.4 用户发表评论界面 5.2.3.4 用户信息管理 用户信息管理就是用户管理自己的信息,主要是用户更新自己的信息,在此模块中调用Hibernate API中的update()方法,以及Transation事务管理,具体实现代码如下所示: public boolean updateUser(User user){ 34 boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.update(user);tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}}finally{ super.closeSession();return result;}}else{ return result;}} 用户在如图5.5的修改用户信息界面,修改自己的信息,系统将用他新的信息封装到User对象中,并调用updateUser()的方法来修改数据库中的信息。 35 图5.5 用户修改个人信息界面 5.2.3.5 购物车 购物车中主要是记录用户的最近一次购物记录,它调用了Hibernate API中的Criteria接口,具体实现代码如下所示: public List getOrderByUsername(String username){ List orders=null; if(super.getSession()!=null){ try { Criteria cri=super.session.createCriteria(User.class); cri.add(Restrictions.eq(\"userName\User user=(User)cri.uniqueResult();if(user!=null){ orders=user.getOrderinfors();} } catch (HibernateException e) { throw e;}finally{ super.closeSession();return orders;}}else{ return orders;}} 图5.6就是网上购书系统调用getOrderByUsername()使购物车显示购书记录。 36 图5.6 购物车中的购书记录 同时,购物车用来生成订单,它调用了Hibernate API中的add()方法,以及Transaction接口,具体实现代码如下所示: public boolean addOrder(Orderinfor order,List details){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(order);Iterator iterator=details.iterator();while(iterator.hasNext()){ OrderDetail detail=(OrderDetail)iterator.next(); super.session.save(detail); } tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result; 37 }} 图5.7就是系统形成的订单,系统会调用addOrder()来将订单的信息添加进数据库中。 图5.7 生成的订单 5.2.4管理员模块的实现 在管理员中有这些功能:增加图书、更新图书、删除图书、修改用户状态、新增图书类别、修改图书类别、超级管理员增加管理员和超级管理员修改管理员信息。具体的实现过程如下。5.2.4.1 增加图书 增加图书中就是用来增加新的图书信息,在此子模块中调用Hibernate API的save()方法,以及Transaction事务管理,实现代码如下所示: /* * addBook(Book book)用于增加图书.*/ public boolean addBook(Book book){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(book); 38 tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 图5.8就是增加图书的界面,新书的信息在增加书籍的界面上添加进去,然后被封装到Book对象中,然后系统调用addBook()方法进行进行将书籍信息添加到数据库中。 39 图5.8 增加书籍的界面 5.2.4.2 更新图书 就是更新数据库中已经存在的图书信息,此子模块中调用了Hibernate API中的update(),以及Transaction事务管理,具体实现代码如下所示: public boolean updateBook(Book book){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.update(book);tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ return result;}}else{ return result;}} 图5.9为更新图书的界面,通过这里管理员将图书的信息填入,系统将其封装到Book对象中,然后调用updateBook(),用来更新数据库中的图书信息。在这里有红星的地方是表示必填内容,更新书籍前,需要查询出图书,然后旧的图书信息就会生成在页面上,管理员可以自己在上面修改图书信息,提交以后,系统开始执行。 40 图 5.9 更新图书信息界面 5.2.4.3 修改用户状态 修改用户状态,就是更新用户的状态。此模块中调用Hibernate API的update()方法,以及Transaction事务管理,具体实现代码如下所示: public boolean updateUser(User user){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.update(user);tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ 41 tr.rollback();}}finally{ super.closeSession();return result;}}else{ return result;}} 图5.10是用来修改用户状态的界面,首先管理员查询出要修改状态的用户,然后在这个界面来修改用户状态。系统会调用updateUser()来修改用户状态。 图5.10 修改用户状态界面 5.2.4.4 新增图书类别 新增图书类别,就是增加图书的类别,此子模块中调用了Hibernate API中的save()方法,以及Transaction事务管理,具体实现代码如下所示: public boolean addCategory(BookCategory category){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(category);tr.commit();result=true; 42 } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 图5.11是增加图书类别的界面,通过这个界面,管理员用来增加图书类别。系统会调用addCategory()来增加图书类型。 图5.11 增加图书类别界面 5.2.4.5 修改图书类别 修改图书类别就是修改已经存在的图书类别信息,此子模块中调用了Hibernate API的update()方法,以及Transaction事务管理,具体实现代码如下所示: public boolean updateCategory(BookCategory category){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction(); 43 super.session.update(category);tr.commit();result=true; } catch (HibernateException e) { System.out.println(e);if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 图5.12为修改图书类别界面,通过这个界面,管理员可以用来修改图书类别。系统会调用updateCategory()来修改图书类型。 图5.12 修改书籍类别界面 5.2.4.6 管理员登陆 管理员登陆进入管理员界面,从而实现管理员的职能,在此子模块中,调用了Hibernate API中的Criteria接口,具体实现代码如下所示: public Admin getAdminByName(String adminName){ Admin admin=null;if(super.getSession()!=null){ 44 try { Criteria cri=super.session.createCriteria(Admin.class); cri.add(Restrictions.eq(\"adminName\ admin=(Admin)cri.uniqueResult();} catch (HibernateException e) { System.out.println(e);throw e;}finally{ super.closeSession();return admin;}}else{ System.out.println(\"connectin wrong!\");return admin;}} 图5.13为管理员登陆的界面,通过这个界面管理员进行登陆。系统会调用getAdminbyName()来执行管理员的登陆功能。 图5.13 管理员登陆界面 45 5.2.4.7 超级管理员增加管理员 超级管理员用来增加管理员,在此子模块中,调用了Hibernate API中的save()方法,以及Transaction事务管理,具体实现代码如下所示: public boolean addAdmin(Admin admin){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.save(admin);tr.commit();result=true; } catch (HibernateException e) { if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 图5.14为增加管理员的界面,超级管理员通过这里进行来增加管理员,系统会调用addAdmin()来增加管理员。 46 图5.14 增加管理员界面 5.2.4.8超级管理员修改管理员信息 超级管理员通过此子模块来修改管理员的信息,在此子模块中调用了Hibernate API中的update()方法,以及Transaction事务管理,具体实现代码如下所示: public boolean updateAdmin(Admin admin){ boolean result=false;if(super.getSession()!=null){ Transaction tr=null;try { tr=super.session.beginTransaction();super.session.update(admin);tr.commit();result=true; } catch (HibernateException e) { e.printStackTrace();if(tr!=null){ tr.rollback();}throw e;}finally{ super.closeSession();return result;}}else{ return result;}} 47 图5.15为超级管理员修改管理员信息的界面,在这里系统会调用updateAdmin()来修改管理员信息。 图5.15 超级管理员修改管理员信息界面 5.2.5系统模块实现 在此模块中有一个功能:RSS系统。具体的实现方式如下。5.2.5.1 RSS系统 RSS系统是用于定制特定类别图书信息,在此模块中调用了Hibernate API的Criteria接口,具体实现代码如下所示: public Book getBookbyBookID(Integer bookid){ Book book=null; if(super.getSession()!=null){ try { Criteria cri=super.session.createCriteria(Book.class); cri.add(Restrictions.eq(\"bookId\book=(Book)cri.uniqueResult();} catch (HibernateException e) { throw e;}finally{ super.closeSession(); return book;}}else{ 48 return book;}} 5.3 系统验证系统验证采用了黑盒测试来对系统进行测试。5.3.1用户模块的验证5.3.1.1 用户注册测试用例及结果如表5.1: 表5.1 用户注册测试表 用例类型正面用例 用例 User对象中封装的数据正确 反面用例 用户输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 用例结果 User对象成功被插入到数据库 User没有被插入到数据库,并且会报异常。1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.1.2 用户登陆测试用例及结果如表5.2: 表5.2 用户登陆测试表 用例类型正面用例 用例 用户输入正确用户名和密码。 反面用例 错误用例有以下情况:1)错误用户名2)错误密码3)使用被冻结的用户 49 用例结果 用户能够正确的登录。 用户无法登陆。 1)、4)中模块无法获User 实体。 2)、3)中模块可以获取Us 4)用户什么也不输入er实体。 5.3.1.3 用户评论发布测试用例及结果如表5.3: 表5.3 用户评论测试表 用例类型正面用例 用例 用户发表评论。 用例结果 评论能够被加入得到数据库中。 反面用例 用户在评论栏不输入任何内容。 评论无法被加入到数据库中,并且系统会提示用户要在评论栏中输入内容。 5.3.1.4 用户信息管理测试用例及结果如表5.4: 表5.4 用户信息管理测试表 用例类型正面用例反面用例 用例 用户修改自己的信息。用户输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 用例结果 用户的信息被成功修改。用户没用成功更新数据,并且会出现以下异常:1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.1.5 购物车 测试用例及结果如表5.5: 表5.5 购物车测试表 用例类型正面用例 用例 用户进入购物车。 50用例结果 购物车里能够显示用户最新的一次购物信息。 反面用例无购物进路的用户进入购物车。 购物车内没有用户的购物记录。 5.3.2管理员模块的验证5.3.2.1 增加图书测试用例及结果如表5.6: 表5.6 增加图书测试表 用例类型正面用例 用例 管理员填写正确的图书信息。 反面用例 管理员输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 用例结果 增加的图书信息被成功加入到数据库中。管理员没用成功插入数据,并且会出现以下异常: 1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.2.2 更新图书测试用例及结果如表5.7: 表5.7 更新图书测试表 用例类型正面用例 用例 管理员填写正确的图书信息。 反面用例 管理员输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 管理员没用成功更新数据,并且会出现以下异常: 1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予 51 用例结果 图书信息被成功更新。 用户提示:“输入错误”。 5.3.2.3 修改用户状态测试用例及结果如表5.8: 表5.8 修改用户状态测试表 用例类型正面用例 用例 管理员填写成功找到用户,并修改状态。 反面用例 无 无用例结果 用户状态被成功修改。 5.3.2.4 新增图书类别测试用例及结果如表5.9: 表5.9 新增图书类别测试表 用例类型正面用例 用例 管理员填写正确的图书类别信息。 反面用例 管理员输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 用例结果 图书类别信息被成功增加。 管理员没用成功增加数据,并且会出现以下异常: 1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.2.5 修改图书类别测试用例及结果如表5.10: 表5.10 修改图书类别测试表 用例类型正面用例 用例 管理员填写正确的图书 52 用例结果 图书类别信息被成功更 类别信息。 反面用例 管理员输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 新。 管理员没用成功更新数据,并且会出现以下异常: 1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.2.6 管理员登陆测试用例及结果如表5.11: 表5.11 管理员测试表 用例类型正面用例 用例 管理员输入正确用户名和密码。 反面用例 错误用例有以下情况:1)错误管理员名2)错误密码 管理员无法登陆。1)、4)中模块无法获Admin 实体。用例结果 管理员能够正确的登录。 3)使用被冻结的管理员2)、3)中模块可以获取Us4)用户什么也不输入 5.3.2.7 超级管理员增加管理员测试用例及结果如表5.12: 表5.12 超级管理员增加管理员测试表 用例类型正面用例 用例 超级管理员填写正确的管理员信息。 反面用例 超级管理员输入的数据有以下错误情况:4)格式不对。5)数据类型。 53 er实体。 用例结果 新管理员信息被成功加入到数据库中。超级管理员没用成功插入数据,并且会出现以下异常: 4)出现转化异常。 6)某些属性为null。5)出现转化异常。6)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.2.8 超级管理员修改管理员信息测试用例及结果如表5.13: 表5.13 超级管理员修改管理员测试表 用例类型正面用例 用例 超级管理员修改管理员的信息。 反面用例 超级管理员输入的数据有以下错误情况:1)格式不对。2)数据类型。3)某些属性为null。 用例结果 超级管理员的信息成功修改管理员信息。超级管理员没用成功更新数据,并且会出现以下异常: 1)出现转化异常。2)出现转化异常。3)出现null异常。系统会扑捉到异常,给予用户提示:“输入错误”。 5.3.3系统模块的验证5.3.3.1 RSS系统 测试用例及结果如表5.14: 表5.14 RSS系统测试表 用例类型正面用例 用例 用户定制特定类的图书。 用例结果 用户可以通过RSS系统观看特定类别图书信息。 反面用例 用户没有定制特定类的图书。 没有任何图书信息出现。RSS会提示用户定制特定类的图书。 54 5.4 本章小结本章将第二章中的设计变为现实的代码,成功实现各项功能,并且在实现以后,利用了黑盒测试对各项功能进行了测试,虽然当中会出现了很多问题,但是经过修改,各个问题都得到了解决。 下一章,将对全文作一个总结,总结自己在实践Hibernate技术中对于Hibernate的认识。 55 第6章 全文总结 在本项目开始前,我对于Hibernate技术没有任何认识,只是对于JDBC有所理解,通过三个月的学习,我逐渐认识、熟悉、理解了Hibernate的是如何一个框架。本文主要是通过一个项目从理论到实践研究了Hibernate的工作情况。 在第二、四、五章,介绍了网上购书系统从设计到实现,数据库从需求分析到实现的过程。 在第一章,详细介绍了Hibernate的内容,这个也是我对于Hibernate的认识的所得。 三个月的项目实践过程中,我们的组员在一直都积极配合,每个人都按时按量完成自己的任务。虽然我们的过程和企业开发相比,依旧是十分原始,但是经过毕业设计,我们促进了我们的对于企业级项目开发的理解。 对于网上购书系统,经过我们团队的努力,我们完成了各项基本功能,虽然当中的一些功能和当当网等网站相比非常粗糙。并且在效率上依旧需要投入一些时间来进行提升,由于时间上的原因,这些优化没有实现。在以后的时间里,我想利用自己的一些空余时间来修补这些方面的空白,同时将其他功能进行完善,使本项目更加完美。 最后对于Hibernate而言,经过学习,自己虽然能够利用它来完成本次项目,但是我也发觉自己依旧需要对Hibernate进行深入研究。我也将弥补自己在J2EE其他框架(Struts + Spring)的知识。 56 参考文献 [1]百度百科Hibernate文献. Hibernate. 网址:http://baike.baidu.com/view/7291.htm,2008.10.20.[2]孙卫琴 编著. 精通Hibernate:Java对象持久化技术详解[M] . 第1版.电子工业出版社,2005.5. [3](美)PaulJ.Perrone,etal.著,张志伟等译. J2EE构建企业系统 [M] .第1版.清华大学出版社,2001.10.[4][美]BrettMcLaughlin著,孙兆林等译. 第1版.中国电力出版社,2001.5. [5](美)BruceEckel著,侯捷译. Java编程思想[M]. 第1版. 机械工业出版社,2002。[6]玛丽·萨姆纳(Mary 企业资源计划=Enterprise 北京机械工业出版社,2003.5.6. [7]林胜利,王坤茹编著.Java优化编程[M]. 第1版.北京电子工业出版社,2007.9.10.[8]James 第1版.北京:东南大学出版社.2005.4.15.[9](美)拉曼(Larman,C.)著,李洋 机械工业出版社, 2006.5.1. [10]孙鑫 著.Servlet/JSP深入详解[M]. 第1版. 电子工业出版社.,2008.8.1.[11]Hibernate-reference. http://www.hibernate.org. 2008.10.20. [12]Rod Johnson. Expert One-on-One J2EE Development Without EJB[M]. First Version.2004.7.9. [13]Rod Johnson. Expert One-on-One J2EE Design and Development[M]. First Version.Wrox Press. 2003.21.30. 57 JAVA与XML [M]. Sumner)著,张玉亭,杨晓云译.ERP——resourceplanning[M]. 第1版. Elliott编著.Hibernate程序高级秘笈[M]. 等译.UML和模式应用[M]. 第3版. 58 致 谢 网上购书系统作为我们的毕业设计,通过三个月的学习和工作,终于完成。在这期间,我首先要感谢武汉大学国际软件学院,学院通过请公司进行实地培训,让我们实践正真的项目来完成毕业设计以及毕业论文,我们的学到的已经不是理论、专业知识,同时我们还进一步认识到公司的项目开发过程。 其次我要感谢易思博公司,感谢项目经理——廖广志、现场经理——杜刚正是由于他们给予我们的指导我们才得以非常顺利的完成毕业设计以及论文,同时也学习到了现代企业在项目开发过程中所用到的技术以及经验。 同时我也要感谢我的论文导师杨宗亮老师,在项目以及论文的开始阶段,他给予了我大量的帮助,在项目中他帮助我解决了很多的困难,在论文中他也给我提出了许多意见,提供了许多帮助。 最后我想感谢自己。已经到了大学的末尾,自己依旧没有让自己放松下来,依旧使充满学习的欲望,使自己收获了许多知识。 59 JOBJOB_IDint(4) FK_USER_IDFK_USER_IDORDERINFORCOMMENT_IDBOOK_IDUSER_IDCONTENTTIMEORDER_IDACCEPTERADDRESSPHONEPOSTCODEORDER_SUMDILIVER_TIMEORDER_STATEDELIVER_DAYDELIVER_MODEPAY_MODEIS_PAYRECEIVE_TIMEUSER_IDint(9) 因篇幅问题不能全部显示,请点此查看更多更全内容