持久化层和ORM简介
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORM框架比较
• Hibernate:目前最流行的开源ORM框架,已经被选作 JBoss的持久层解决方案。整个Hibernate项目也一并投入 了JBoss的怀抱,而JBoss又加入了Red Hat组织。因此, Hibernate是属于Red Hat组织的一部分。 • IBATIS:Apache软件基金组织的子项目。与其称它是一 种ORM框架,不如称它是一种“SqlMapping”框架。相对 Hibernate的完全对象化封装,iBATIS更加灵活,但开发 过程中开发人员需要完成的代码量更大,而且需要直接编 写SQL语句。
ORM框架比较
• Oracle的TopLink:作为一个遵循OTN协议 的商业产品,TopLink在开发过程中可以自 由下载和使用,但一旦作为商业产品使用, 则需要收取费用。可能正是这一点,导致 了TopLink的市场占有率?
ORM的优点
• 优点: • 1.提高了开发效率。由于ORM可以自动对 Entity对象与数据库中的Table进行字段与 属性的映射,所以我们实际可能已经不需 要一个专用的、庞大的数据访问层。 • 2.ORM提供了对数据库的映射,不用sql直 接编码,能够像操作对象一样从数据库获 取数据。
ORM简介
• 如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似 的通用的模式。 • 除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质 上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如 用O/R Mapping。你用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。 • 一般的ORM包括以下四部分: 一个对持久类对象进行CRUD操作的API; 一个语言或API用来规定与类和类属性相关的查询; 一个规定mapping metadata的工具; 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。
ORM简介
• 面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展 起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显 著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。 • 让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系 "(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在 业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变 化的时候,我们需要把对象的信息保存在关系数据库中。 • 当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不 少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等 等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等 任务。而这些代码写起来总是重复的。
Hibernate
持久化层介绍
• 了解三层软件结构和持久化层 一般来讲三层软件体系结构分为 一、表述层 二、业务逻辑层 三、数据库层 • 持久化层位于业务逻辑层和数据库层中间。 • 狭义理解持久化就是把域对象保存到数据库中,广义理解 持久化包括和数据库相关的各种操作。
持久化层介绍
持久化层(Persistent Object)封装了数据访问细节(以持 久化类 POJO+**.hbm.xml 封装数据访问细节),连接数据 库,对数据库进行查询,插入,删除,更新。 持久化层为业务逻辑层提供面向对象的API(DAO对象)。 完善的持久化层应该达到如下目标: 1.代码可重用性高,能够完成所有的数据库访问操作。 2.如果需要的话,能够支持多种数据库平台。(IBM DB2/MySQL/Oracle 9i/Oracle 10g/MS SQL Server) 3.具有相对独立性,当持久化层的实现发生变化,不会影 响上层的实现
•
• •
ORM原理
• Hibernate是如何实现ORM的功能?如果让我们自己开发一款实现ORM功能的框架需 要怎么做?其实这些问题就是围绕着一个词,那就是“映射”,如果我们知道如何实 现这种映射那么我们也能够开发出自己的一款ORM框架。会使用Hibernate的开发人员 都知道,在使用它实现ORM功能的时候,主要的文件有:映射类(*.java)、映射文件 (*.hbm.xml)以及数据库配置文件(*.properties或*.cfg.xml),它们各自的作用如下。 ◆映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,将来 就可以实现把表中的记录映射成为该类的对象。 ◆映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表 的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。 ◆数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比如连接哪中 数据库、登录用户名、登录密码以及连接字符串等。
• • •
Leabharlann Baidu
ORM原理
• • • • 在这三种主要的文件中,映射类为普通Java源文件、映射文件为XML格式、数据库配 置文件为Properties格式或者是XML格式。想理解“映射”首先我们需要知道如何解析 这三种文件,即解析XML格式文件、解析Properties格式文件和解析Java类文件。 下面我们来分别探讨一下如何实现这些文件的解析。 1.如何解析XML文件 前面我们说过映射文件是XML格式,数据库配置文件也可以是XML格式,因此如果能 解析XML文件我们就可以获取这两个文件的信息。XML文件格式我简单做下介绍,比 如tom这句就是一个XML格式的描述,name代表节点,节点必须有开始标记和结束标 记,在开始标记中我们可以添加一些属性的声明比如sex。解析XML的技术可以分为两 类那就是SAX和DOM,这两种方式的差别和优缺点大家可以上网查阅或者我们会在以 后的文章中提出,请大家关注。实现解析XML文件的功能很方便,我们可以通过下载 第三方的一些工具包如xml-apis.jar和xercesImpl.jar等,也可以使用JDK自带的工具类 DocumentBuilderFactory、DocumentBuilder、Document、Element等等,大家可以通 过API文挡查阅这些类的说明。通过这些类我们可以把XML文件的信息读入内存并通过 类中的某些方法获取指定节点的名字、值、属性名、属性值这些信息。
ORM的缺点
• • • 缺点: ORM的缺点是会牺牲程序的执行效率, 从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降 低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影 响。 开发系统时,一般都有性能问题。性能问题主要产生在算法不正确和与数据库不正确 的使用上。ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有 可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了 ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和加工处理, 这样就容易产生性能问题。 在对对象做持久化时,ORM一般会持久化所有的属性,有时,这是不希望的。 但ORM是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。但不 能指望工具能一劳永逸的解决所有问题,有些问题还是需要特殊处理的,但需要特殊 处理的部分对绝大多数的系统,应该是很少的
ORM框架比较
• 目前ORM框架的产品非常多,除了各大著名公司、组织 的产品外,甚至其他一些小团队也都有推出自己的ORM 框架。目前流行的ORM框架有如下这些产品。 • 传统的Entity EJB:Entity EJB实质上也是一种ORM技术, 这是一种备受争议的组件技术,很多人说它非常优秀,也 有人说它一钱不值。事实上,EJB为J2EE的蓬勃发展赢得 了极高的声誉。虽然EJB作为一种重量级、高花费的ORM 技术,具有不可比拟的优势。但由于其必须运行在EJB容 器内,而且学习曲线陡峭,开发周期、成本相对较高,因 而限制EJB的广泛使用。
ORM简介
对象关系映射(Object Relational Mapping,简称 ORM)是一种为了解决面向对象与关系数据库存在的互 不匹配的现象的技术。简单的说,ORM是通过使用描述 对象和数据库之间映射的元数据,将程序中的对象自动持 久化到关系数据库中。本质上就是将数据从一种形式转换 到另外一种形式。这也同时暗示着额外的执行开销;然而, 如果ORM作为一种中间件实现,则会有很多机会做优化, 而这些在手写的持久层并不存在。更重要的是用于控制转 换的元数据需要提供和管理;但是同样,这些花费要比维 护手写的方案要少
•
小结
• 在这里我只是给大家把实现ORM功能的一些关键技术提 了出来,通过上面介绍大家对ORM机制应该有个大概了 解,比如通过解析数据库配置文件获取数据库连接信息并 建立连接,通过解析映射文件可以获取映射类名、属性名、 表名以及字段名等信息,得到名字后通过反射机制可以得 到映射类信息,调用构造方法创建对象,调用每个属性的 set方法给对象设值完成数据的装载。就是采用这个过程 来实现Hibernate ORM的,当然Hibernate还使用了事务 控制、缓存控制等很多技术
2.解析Properties文件
• 数据库配置文件可以是XML格式也可以是Properties格式, Properties文件一般采用“属性名=属性值”的形式描述信 息。如果配置文件采用Properties文件描述,我们就需要 想办法解析这种类型的文件了。想解析Properties文件大 家就需要熟悉Properties这个类了,这个类有一些常用方 法比如,load()加载指定文件并读取文件中的属性信息, PropertyNames()返回所有属性名,getProperty()返回指 定属性名的属性值。通过解析Properties文件我们可以得 到连接数据库必要的信息,然后通过底层JDBC技术与数 据库建立连接。
3.解析Java类文件
• 通过解析映射文件和数据库配置文件我们可以建立数据库的连接,可以得到映射类的 名字、属性名、数据库表名、字段名以及类型等信息。要把数据库中表的数据映射成 为对象,首先需要把表中的记录取出,然后将每个字段值给映射类对象的每个属性, 这个赋值过程要调用对象中的set方法。我们现在通过映射文件只知道类名和属性名, 如何根据类名和属性名调用相应的set和get方法,是一个关键问题。在Java中有一种机 制叫反射机制,使用这种机制我们可以得到类的信息,包括类只用的修饰符、方法、 属性、继承的父类以及实现接口等信息。反射机制相关的类有Class、Field、Method 以及Constructor等。通过Class的getFields()、getMethods()和getConstructors()方法 得到相应的属性、方法和构造方法。通过Field类的getName()、getType()和 getModifiers()方法得到相应的属性名、属性类型、属性修饰符信息。通过Method类 getReturnType()可以获取方法的返回类型,invoke()方法可以根据给定的方法名和参数 值执行对象中对应的方法。我们可以首先通过以上方法获取类中的属性名,然后拼写 成setXXX和getXXX方法名,最后根据方法名执行对应的方法,将数据库数据加载到对 象中。 此外要实现Hibernate机制还会涉及到一个技术点,那就是如何获取数据库的相关信息。 要实现这个功能,就需要大家了解JDBC的DataBaseMetaData类和 ResultSetMetaData类,通过这两个类的方法我们就可以获取数据库表的字段名、类型、 大小等相关信息。