1、.学号 200532580294 密级 武汉大学本科毕业论文Asset Management System多级查询在资产管理系统中的设计与实现院(系)名 称:国际软件学院专 业 名 称 :软件工程学 生 姓 名 :董李曦指 导 教 师 :熊庆文 廖广志教授二九年五月.BACHELORS DEGREE THESISOF WUHAN UNIVERSITYMulti-level inquiry in the Asset Management System Design and ImplementationCollege : International School of SoftwareSubjec
2、t : Software EngineeringName : DongLixiDirected by : XiongQingwen,LiaoGuangzhi ProfessorMay 2009.郑 重 声 明本人呈交的学位论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于培养单位。本人签名: 董李曦 日期: .摘 要固定资产管理(以下简称资产管理)是企业重要的经济资源和赖以生
3、存发展的物质基础。如何确保对企业固定资产进行科学管理,健全各项资产管理制度,提高企业的市场竞争力,构建一套企业资产管理系统是十分必要的。目前管理信息系统的开发与设计主要采用面向对象的方法。第一章主要讲的是研究背景;第二章主要讲的是多级查询的实现方法,包括 AJAX 技术和 Hibernate 技术。第三章主要讲的是多级查询在资产管理中的实现,主要采用的是 AJAX 技术。关键词:资产管理;多级查询;数据库.ABSTRACTEnterprise Assets Management (hereinafter referred to as asset management) is an import
4、ant economic resources and rely on the material basis for survival and development. How to ensure that the fixed assets of enterprises to carry out scientific management, improve the asset management system to improve the market competitiveness of enterprises, to build an enterprise asset management
5、 system is essential. Current management information system development and design almost use the main object-oriented method.The first chapter is mainly about research background; The second chapter is mainly about the realization of multi-level inquiries, including technical and Hibernate technolo
6、gy AJAX. The third chapter consists mainly of talking about multi-level inquiry in the asset management in the realization of the main uses AJAX technology. Key words: EAM; Multi-level query; Database.目 录第 1 章 引言 11.1 概述 11.1.1 EAM 的流程和原理 .11.1.2 EAM 的经济效益 .21.1.3 EAM 的构成及特点 .31.2 企业资产管理的研究现状和发展趋势 4
7、第 2 章 多级查询的实现 52.1 多级查询的实现方法 52.2 Ajax 开发 .52.2.1 AJAX 的定义 52.2.2 现状与需要解决的问题 52.2.3 为什么使用 AJAX62.2.4 用 AJAX 改进你的设计 .72.2.5 AJAX 的缺陷 72.3 Hibernate 开发 82.3.1 Hibernate 概述 .82.3.2 Hibernate 原理及接口 .92.3.3 Hibernate 接口 .92.3.4 映射机制 .122.3.5 查询机制 .152.3.6 Hibernate 的优点 17第 3 章 多级查询在资产管理中的应用 .183.1 企业资产管理
8、系统项目介绍 .183.1.1 产品环境介绍 .183.2 多级查询的实现 .203.3 本章小节 .28结 论 29参考文献 30致 谢 31.第 1 章 引言1.1 概述EAM (Enterprise Assets Management)就是企业资产管理。随着管理信息化程度的不断提高,企业资产管理的内容和范畴也在不断丰富和深化。不仅设备是企业的重要资源,企业的生产环境、设备维护工人的劳动技能和劳动 热情也是企业重要的资源。EAM(企业资产管理)是实现企业资产管理信息化的重要手段。通过使用 EAM 系统,除了可以提高设备利用率、获得高产出以外,还可以在更广泛的意义上,对企业的产品品质、生产安
9、全性、节约能源、环境保护提供重要的保障。应用 EAM 系统的目的,就是让企业资产管理不再成为企业发展的瓶颈。由于企业资产是一个涉及设备、人员、生产工艺、技术诀窍的综合概念,所以EAM 的应用范围是很广泛的。特别对那些设备品种多、价格高、对设备完好率及连续运转可利用率要求较高的资产密集型企业,更离不开 EAM 系统的应用。1.1.1 EAM 的流程和原理与其他企业信息化系统不同的是,EAM 是以资产、设备台帐为基础,以工作单的提交、审批、执行为主线,按照缺陷处理、计划检修、预防性维修、预测性维修几 种可能模式,以提高维修效率、降低总体维护成本为目标,将采购管理、库存管理、人力资源管理集成在一个数
10、据充分共享的信息系统中。EAM 是个集成系统。虽然可以分为多个模块,但模块之间是密切相关的。设备、维修、库存、采购、分析等一环套一环,有关信息“一处录入、多处共享” ,保证了资产信息的及时性和准确性。EAM 是个闭环系统,如果单从设备维护的角度看,系统可以分为三个层次:维修规划、维修处理、维修分析。维修规划,根据设备基础数据和维修历史制定设备维修目标和计划;维修处理完成计划的执行、收集各类维修历史数据;维修分析则分析维修历史数据,把分析结果反馈给维修计划。通过这一次次的闭环,使得维修计划越来越准确可行,.从而减少非计划性的维修和抢修,达到降低维修成本的目的。EAM 的执行,离不开基础数据准备。
11、EAM 是一种管理信息系统,要进行大量的数据处理。因此要求基础数据的规范化,或者说必须有统一的标准。同时,EAM 也要求数据的准确性,这就需要管理制度的配合。通常,EAM 的数据可以分为三类:静态数据(包括设备和备件的分类信息、属性信息、技术说明、定额指标、位置信息、供应商信息、工具信息、维修人力资源信息等方面) ,动态数据(设备运行数据、维修数据、移动数据、备件库存数据、采购合同数据、维修工作单数据等方面)以及中间数据(各类查询结果、统计报 表、分析结果等数据) 。EAM 的管理,遵循的是“统一管理,分部执行” 原则领导指定维修管理目标、规划、财务预算,通过 EAM 下达给具体维修执行部门;
12、维修部门反馈执行结果,集成、汇总信息。作为管理信息系统,EAM 不属于生产过程控制系统,也不完全是一个维修专家系统,它提供信息的价值在于人们能利用这些信息做出正确的决策或作为优化的依据,来指导管理工作。1.1.2 EAM 的经济效益EAM 能集成设备管理中各个业务层面的信息,满足先进的生产设备对现代生产组织保障的要求,使企业更好地适应瞬息万变的市场竞争。使用 EAM,能让企业达到以下目标: 量化 TPM、固化 TPM 流程 实现资产管理信息化 更有效地配置生产设备、人员及其他资源 借助 EAM 系统的帮助,每位维修管理人员可以管理更多的设备 改善工人的安全保障,促进规程的执行,减少停产时间 建
13、立清晰的、动态的设备数据库,提高设备可利用率及可靠性,控制维护及维修费用,延长设备生命周期 降低备件库存及备件成本 帮助企业更好地贯彻 ISO9000,符合行业和政府部门的法规 根据 Gartner Group 对已经实施过 EAM 企业的调查,在以下几个方面企业获.得了经济效益: 提高有效工作时间 10-20% 降低库存成本 10-25% 减少设备停机时间 10-20% 增加设备使用效率 20-30% 延长设备生命周期 超过 10% 备件库存准确率 超过 95% 1.1.3 EAM 的构成及特点EAM 是一个集成的设备维护系统,EAM 基本成分有以下一些功能:设备资产public int i
14、d ;public String getCourseName()(return this.courseName;)public void setCourseName(String name)(courseName = name;)public int getId().(return this.id ;)Hibernate不要求持久对象实现 Seiralizable(序列化)接口,但是当对象存储在HttpSession中或者用 RMI进行值传递时,序列化是必须的。属性通常作为实例变量与属性访问方法一起执行。访问方法是用来检索实例变量的值和改变其值的方法,分别称为geter和seter方法。Hib
15、ernate不要求访问方法声明为公有的,它可以很容易的使用私有访问方法来管理属性。2.3.4.2 继承映射最简单的类到数据库表的映射策略是“一个类一张表”。这个方法确实听起来很简单,但是在遇到继承问题的时候就不能有效的起作用了。继承是面向对象结构中最明显的特征。继承关系有三种不同的映射方法:1) 每个具体的类映射为一个表。这跟前面讲的最简单的映射方法是一样的,一个类的所有属性,包括从超类继承过来的属性,都一一映射为数据库表的列。即超类superclass映射为一个表,子类subclass:映射为单独的表,在数据库中,它们之间的关系通过外键 (Foreign Key)表示。这种映射策略不需要任何
16、Hibernate的特殊映射声明,只需要把每一个类的映射包含在声明中,并且为每个类定义一个表属性。这种方法的主要问题是它不能很好的支持多态关系。还有就是在这些表中,不同表的不同列属性有共同的语意,如子类继承超类的属性,这使关系的维护更复杂了。例如对超类属性的改变会导致很多列的改变,这也使在子类上执行数据完整性约束更加困难。2) 整个类层次关系映射为一个表。作为对“一个类一个表”策略的替代,我们可以把整个类层次关系映射为一个表,这个表的列包括类层次关系中所有类的属性。每一个具体的子类用特定的行来表示,它可以通过列discriminator 的值来识别,如下所示: 父类的映射增加一个discrim
17、inator-value属性,它的值用来标志父类,同时增加一discriminator:.在子类的映射中也增加一个discriminator-value 属性,它的值用来标志该子类:discriminator-value的值在分别查询父类和子类时做查询条件:新增加的 discriminator列用来区分持久类,它不是类的属性,由Hibernate内部使用,它的值,即discriminator-value 。给出的值会被 Hibernate自动设置和检索。整个层次关系,超类和子类都被映射在了同一张表中,超类用声明,子类用声明,当然,子类中又可以包括子类。这种映射策略进行多态查询时可以一次执行,在
18、分别进行超类和子类查询时,可以用discriminator列的值做条件,因为超类和子类有不同的discriminator 值。3) 子类和超类映射为不同的表。即每一个在持久关系中定义的子类都映射为单独的一个表。与第一种策略不同的是,子类对应的表只包括非继承属性,即每一个属性都是子类特有的。每一个子类的表有一个主键与超类相关联。映射文件中子类的声明用表示,嵌套在中,并且要声明一个主键key 。这种策略的主要好处是关系模型完全规格化,完整性约束的定义也直截了当。对特定子类的多态联结是通过指向该子类的表的外键来表示的。Hibernate在执行多态查询的时候,自动把超类和子类的表外联接(outer j
19、oin)查询,如果只限制在对子类查询时,Hibernate 使用内联接(inner join)。根据经验来看,复杂的类层次执行效率让人无法接受,查询需要联接多个表或者许多顺序读操作。因此,针对应用程序中的类层次,必须选择一种合适的映射策略或者对映射策略做一个适当的组合。一般有以下原则:在不要求多态关联和查询时,倾向于使用一个类一个表的映射策略;如果要使用多态关联并且子类中声明的属性相对较少,则倾向于使用一个类层次一个表的映射策略:如果要求多态关联和查询,并且子类声明的属性比较多,则使用一个子类一个表的映射策略。.2.3.5 查询机制2.3.5.1 查询方法检索持久对象是Hibernate 的另
20、一项重要功能。Hibernate提供了以下几种从数据库中得到对象的方法:1)通过对对象图的导航,从一个已经装载的对象开始,由它的属性访问方法来访问相关联的对象。当用户导航对象图的时候,如果Session处于打开状态,Hibernate会自动装载或者预装载对象图中的结点。2)通过标志符检索。当已知对象的唯一标志符时,这种方法是最方便性能最好的。用标志符检索对象可以用loads和geto两种方法。3)使用 Hibernate提供的查询语言(HQL) ,它是一个完全面向对象的查询语言。HQL是 SQL的一个面向对象的方言,它与ODMG OQL(对象数据库查询语言)和EJB-QL有非常类似,但是与OQ
21、L不同的是它适用于使用 SQL的数据库,并且比EJB-QL功能更强大更优雅。HQL不是一个数据操纵语言,它只用来检索对象,而不是更新删除数据。对象状态的同步是持久化管理器的工作而不是开发者的工作。HQL有以下高级特性: 把数据约束应用到关联对象的属性: 在事务范围内不装载实体本身而检索实体的属性,这也被称为报告查(report query)或更确切的叫做注射(projection); 对查询结果排序; 对查询结果分页; 通过groupby, having 或者sum, max等函数对结果集进行分类; 当检索一行多对象时使用外联接; 调用用户定义的SQL函数; 子查询(嵌套查询) 。4)使用 H
22、ibernate提供的Criteria API查询。Criteria API提供了一个类型安全的、面向对象的方法来执行查询,而不需要字符串操纵。它包括了基于实例对象的查询。5) 使用本地 SQL语言查询.Hibernate支持16种数据库方言,几乎所有流行的数据库它都支持,因此,用户也可以直接使用自己熟悉的数据库语言进行查询。.在实际的Hibernate应用程序中,各种检索方法可以联合使用,每一种检索方法可以使用不同的数据获取策略。这样可以为应用程序中的用例找到最好的检索方法和数据获取策略,同时最小化SQL查询语句的数量,获得最佳性能 .在传统的关系数据访问中,利用内联接和外联接检索关联实体,
23、可以用一条SQL语句获取特定计算要求的数据。ORM中最难的问题之一是为关系数据提供有效的访问。2.3.5.2 数据获取策略Hibernate为每一种关联提供了四种获取策略以供选择:立即获取使用连续的数据库读操作或缓存查找,关联的对象被立即获取。立即获取通常不是有效的获取策略,除非想让关联的实体总是被保存在高速缓存中。延迟获取当用户不希望数据在第一次就全部装载到内存中时,关联的对象或集合在第一次访问时被延迟获取,这导致对数据库的一次新的请求,除非关联对象被保存在高速缓存中。延迟获取可以让用户决定第一次访问数据库时有多少对象要被装载、哪些关联要被装载。延迟获取是对象持久化中一个基本的概念,也是达到
24、满意性能的第一步。在映射文件中,对关联的获取策略开始都设为延迟获取。延迟获取有助于减少数据库装载,但对于性能最优化来说,它是一个盲目的猜测。渴望获取明确的说明了哪些关联对象应该和参照对象一起装载Hibernate利用外联接SQL查询在一次数据库请求中返回关联对象。 Hibernate中的性能优化通常包括为特定的事务明智的使用渴望获取。一种普遍的做法是在运行时为一个特定的HQL 或者标准查询说明使用这种获取策略。批量获取批量获取不是一种严格的关联获取策略,它是一种改善延迟获取或立即获取性能的技术。2.3.6 Hibernate 的优点Hibernate 作为一个开源的 ORM 框架,它基于 JD
25、BC 提供了一种持久性数据管理的方案,可以将每一个物理表格(Table)映射成为对象( Object) 。由于.Hibernate 是基于 JDBC 的,而且相对于实体 Bean 来说是相当轻量级的,所以它的数据库查询的能力非常强大且其自身也提供了 HQL 查询语句。目前,Hibernate 可以和多种 Web 服务器或者应用服务器进行良好的集成,支持几乎所有的流行的数据库服务器。(1) Hibernate 使用 Java 反射机制而不是字节码增强程序来实现透明性,构造过程简单、明了。(2) 因为 Hibernate 是个轻量级框架,所以它的运行性能非常高,访问持久层数据的速度也很快。(3)
26、Hibernate 的对象关系映射具有很强的灵活性,支持各种关系数据库,从一对多到多对多的各种复杂关系。(4) Hibernate 各种配置文件只需一次编写,部署简单方便,具有较强的可移植性。(5) Hibernate 的设计与构建过程简单、易学。 Hibernate 的开放文档资源更新速度很快,开发人员可以及时了解其发展变化动态。.第 3 章 多级查询在资产管理中的应用3.1 企业资产管理系统项目介绍企业资产管理在我国企事业单位的资产管理中是一个薄弱环节,也是一个必须要加强的环节。企业资产的流失、闲置、重复采购及责任的不明确等,都导致了企业资产的严重浪费。为了使企业资产能够充分有效的利用,必
27、须对企业资产进行有效的管理。企业资产管理系统是立足企事业单位后勤发展,集数据集成、电子报表、分类汇总、自动生成、网络传递、多极查询于一体的企业资产管理系统,是与现行住房档案管理信息系统和企业资产上报系统相互支持,配套的智能化技术平台,整体上建成运作简便、管理科学、效率很高、最终能实现无纸化办公的品牌服务窗口。系统为集中采购提供了技术手段,从资产采购选型开始,提交采购申报,分配到责任人管理维护维修,最后的报废处理的全过程进行管理。记录资产的各种属性,记录资产的变更、报废的情况,提供个人查询、领导查询等多级查询功能。将资产的登记与财务报账连接、资产与责任人挂钩,并与人事部门连接,实现动态实时的查询
28、功能,防止企业资产的流失和浪费。系统还提供耗材管理功能,供网上耗材申领和核发,统计耗材领用情况。3.1.1 产品环境介绍采用 J2EE 的体系结构,采用 Spring+Struts+Hibernate 框架结合的方式来开发应用系统。.Struts(MVC 框架)WEB层页 面 .jsp用户请求处理组件控制 用户控制 页面数据封装业务层业务接口 业务实现数据访问层Hibernate数据读取接口 数据读取实现SPRING文件配置.图 3.1 MVC 框架(1) Spring 框架Spring 是一个开源框架,专门用户解决复杂的企业应用程序开发,框架的主要优势之一就是其分层架构,分层架构允许定制使用
29、相关的组件服务,为 J2EE 应用程序开发提供集成的框架。Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境,支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象,对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。(2) Struts 框架Struts 是 Apache 基金会的一个 Open Source 项目,基于 Sun J2EE 平台的MVC 框架,主要采用 Servlet 和 JSP 技术来实现,能够很好地帮助 Java 开发者利用 J2EE 开发 Web 应用,也是面向对象设计。实 现重点在 C(C
30、ontroller),包括ActionServlet/RequestProcessor 和我们定制的 Action,也为 V(View) 提供了一系.列定制标签(Custom Tag)。(3) Hibernate 框架Hibernate 是一种 Java 语言下的对象关系映射解决方案。 它是使用 GNU 宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用 Hibernate。Hibernate 不
31、仅负责从 Java 类到数据库表的映射(还包括从 Java 数据类型到SQL 数据类型的映射) ,还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理 SQL 和 JDBC 上的开发时间。3.2 多级查询的实现在企业资产管理中,我们用多级查询来实现省市的联动。(1) 首先,我们建立一个 XML 文件。内容如下:北京city 上海city 天津city 重庆city 广州city 珠海city 深圳city 东莞city 桂林city 柳州city 北海city 南宁city 海口city 三亚city .武汉city 鄂州city 荆州city 十堰city 长沙city 岳阳city
32、 常德city 张家界 city 杭州city 绍兴city 宁波city 台州city 沈阳city 大连city 抚顺city 铁岭city (2) 用一个 Java 类来解析这个 XML 文件,我用的是 JDOM,实现的功能为能够取所有省份,和传入省份的集合(用于 JSP 页面显示),可以获取相应的城市集合。Java 代码:import java.io.FileNotFoundException;import java.io.IOException;import java.util.ArrayList; import java.util.List; import org.jdom.Doc
33、ument; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class ReadXml private Element root = null; .public ReadXml() throws FileNotFoundException, JDOMException, IOException super(); SAXBuilder sb = new SAXBuilder();/解析器对象 Document doc = sb.build(this.
34、getClass().getResourceAsStream(“/city.xml“);/绑定文件 root = doc.getRootElement();/获取根元素 public List getProvince() /获取省份 ArrayList provinceList = new ArrayList(); List tempList = root.getChildren();/获取所有省份节点 for(int i=0; iElement province=(Element)tempList.get(i);/子节点转型 provinceList.add(province.getAttr
35、ibuteValue(“name“);/获取省份节点属性内容 return provinceList; public List getCity(String province) ArrayList cityList = new ArrayList(); List provincetemplist = root.getChildren();/省份集合 for(int i=0; iElement provinceElement = (Element)provincetemplist.get(i); if(provinceElement.getAttributeValue(“name“).equal
36、s(province)/如果属性为传进来的名称 List cityTempList = provinceElement.getChildren();/获取子节点集合 for(int j=0; j/循环 Element cityElement = (Element)cityTempList.get(j);/当前城市节点 cityList.add(cityElement.getTextTrim();/增加城市到集合 return cityList; (3) 准备工作完毕,建一个 Struts 工程写一个 Action,用来获取省份集合。java代码:.public class GetProvinc
37、eAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, JDOMException, IOException ReadXml rx = new ReadXml(); List provinces = rx.getProvince();/获取省份 request.setAttribute(“provinces“, provinces);/放入request 中 return mapping.findForward(“success“); (4) 先通过此 Action,然后再显示首页,这样省的下拉框里就有值了.我先把Struts-Config.XML 文件贴出来。xml 代码:form-beans action (5) 然后是显示的 JSP 页面。XML 代码: