《ORM基础知识概述.docx》由会员分享,可在线阅读,更多相关《ORM基础知识概述.docx(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ORM 资料整理ORM-概念对象关系映射Object Relational Mapping,简称 ORM是一种为了解决面对对象与关系数据库存在的互不匹配的现象的技术。 简洁的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将 java 程序中的对象自动长久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时示意者额外的执行开销;然而,假设 ORM 作为一种中间件实现,则会有很多时机做优化,而这些在手写的长久层并不存在。 更重要的是用于掌握转换的元数据需要供给和治理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守 ODMG 标准的对象数据库照旧需要类级别的
2、元数据。对象-关系映射Object/Relation Mapping,简称 ORM,是随着面对对象的软件开发方法进展而产生的。面对对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中 永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现 为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据 无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。面对对象是从软件工程根本原则(如耦合、聚合、封装)的根底上进展起
3、来的,而关系数据库则是从 数学理论进展而来的,两套理论存在显著的区分。为了解决这个不匹配的现象,对象关系映射技术应运而生。让我们从 O/R 开头。字母O 起源于“对象“(Object),而 R 则来自于“关系“(Relational)。几乎全部的程序里面,都存在对象和关系数据库。在业务规律层和用户界面层中,我们是面对对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。当你开发一个应用程序的时候(不使用 O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在 DAL 中写了很多的方法来读取对象数据,转变状态对象等等任务。而
4、这些代码写起来总是重复的。假设翻开你最近的程序,看看 DAL 代码,你确定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为 SqlCommand 对象添加 SqlParameter,把全部属性和对象对应,设置 SqlCommand的 CommandText 属性为存储过程,然后运行 SqlCommand。对于每个对象都要重复的写这些代码。除此之外,还有更好的方法吗?有,引入一个 O/R Mapping。实质上,一个 O/R Mapping 会为你生成DAL。与其自己写 DAL 代码,不如用 O/R Mapping。你用 O/R Mapping 保存,删除,读取对象,O/
5、R Mapping 负责生成 SQL,你只需要关心对象就好。一般的 ORM 包括以下四局部:一个对长久类对象进展 CRUD 操作的 API;一个语言或 API 用来规定与类和类属性相关的查询; 一个规定 mapping metadata 的工具;一种技术可以让 ORM 的实现同事务对象一起进展 dirty checking, lazy association fetching 以及其他的优化操作。对象关系映射模式从公共仓库元模型:开发指南一书第 8 章 CWM 元仓库中摘录出来的内容,实现了公共仓库元模型(CWM)的 UML 图到 MicrosoftSQL Server 数据库的映射,是一种将
6、对象层次构造映射成关系型构造的方法。个人认为可以作为将本体(Ontology)文件存储到关系型数据库中的一种可借鉴方法。根本状况:公共仓库元模型(CWM)是对象治理组织(OMG)的一种和数据仓库相关的元模型标准,承受 UML 表示的对象层次构造,在保存到数据库中时由于面对对象的数据库技术的不完善(理论争论和商业应用都不是主流),所以该书的作者倾向于使用成熟的关系型数据库来保存这也是存储本体时所遇到的问题。承受方法:将UML 模型中的各种元素通过转换,保存为数据库模式。由于CWM 是一种元模型,因此模型的实例也是一种模型,将这种实例以数据库数据的形式保存。使用数据库中比较成熟的存储过程技术提高开
7、发和执行效率。1、数据类型映射模式1.1 简洁数据类型模式:建立 UML 和关系型数据库中简洁数据类型的映射表以指导映射。1.2 枚举数据类型模式:每种枚举类型对应一个表,只有一个列(_EnumLiteral)表示枚举值。1.3 基于类的数据类型模式:使用外键约束,将根底列与基于类的类型实例相关联。2、类映射模型每个类对应一个表。单值属性、多值属性、继承关系可以用下述方法映射,而引用属性将在关联映射模式中提到。2.1 单值属性模式:是 cardinality 的上界为 1 的属性,映射到类所对应的表的列上。假设其下界也为1必需有的属性,列属性为 NOT NULL。2.2 多值属性模式:每个多值
8、属性映射成一个独立的表,使用外键连接到类所对应的表上。2.3 继承模式:每参加一个类的实例时,依据其继承关系自顶向下生成每个类的对象,这些对象具有一样的 ID根对象对应记录的主键。删除对象实例时,自底向上删除数据。遇到从中间删的状况怎么办? 多重继承怎么处理?3、关联映射模式3.1 一对一关联模式:在关联两端各加一列。3.2 一对多关联模式:和 3.1 一样。假设多这端是有序的,还需参加一列表示序号。3.3 多对多关联模式:将关联单独作一个表。3.4 组合关联模式:留意级联式删除。3.5 反演关联模式:关联两端指向相关的类型,和一般关联一样。3.6 成对关联模式:关联记录两个类间的关系,用交集
9、类表示关联,表示成一个单独的表,每个关联对应一个表,用外键表示它们间的关系。3.7 关联上的 OCL 需要分析成对应的存储过程代码。3.8 保证关联的 cardinality 也需要分析成对应的存储过程代码。4、引用映射模式在 UML 中不存在的 MOF 特征,指属性是声明为引用类型的实例。用存储过程实现。ORM-核心原则简洁:以最根本的形式建模数据。传达性:数据库构造被任何人都能理解的语言文档化。准确性:基于数据模型创立正确标准化了的构造。典型地,建模者通过收集来自那些生疏应用程序但不娴熟的数据建模者的人的信息开发信息模型。建模者必需能够用非技术企业专家可以理解的术语在概念层次上与数据构造进
10、展通讯。建模者也必需能以简洁的单元分析信息,对样本数据进展处理。ORM 特地被设计为改进这种联系。ORM-规章表达式ORM 把应用程序世界表示为具有角色关系中的局部的一组对象实体或值。ORM 有时也称为基于事实的建模,由于它把相关数据描述为根本领实。这些事实假设分割为再小的事实就会丧失信息。ORM-例子人有 人住在某个地方人生于某个日期人在某个日期被雇佣ORM 供给的不只是描述不同对象间关系的一个简洁而直接的方式。ORM 还供给了敏捷性。使用ORM 创立的模型比使用其它方法创立的模型更有力量适应系统的变化。另外,ORM 允许非技术企业专家按样本数据谈论模型,因此他们可以使用真实世界的数据验证模
11、型。由于 ORM 允许重用对象,数据模型能自动映射到正确标准化的数据库构造。ORM 模型的简洁性简化了数据库查询过程。使用 ORM 查询工具,用户可以访问期望数据,而不必理解数据库的底层构造。为什么要使用ORM 技术?1、繁琐的代码问题:用 JDBC 的 API 编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,简洁出错,例如:public void addAccount(final Account account) throws DAOException final Connection conn=getConnection;PreparedStatementps
12、tmt=con.prepareStatment(“insertintoaccount value(?,?,?,?,?,?,?,?,?)“);pstmt.setString(1,account.getUserName);pstmt.setInt(2,account.getPassWord); pstmt.setString(3,account.getSex); pstmt.setString(4,account.getQq);.pstmt.execute; conn.Close;可见,程序员需要消耗大量的时间、精力去编写具体的数据库访问的SQL 语句,还要格外留神其中大量重复的源代码是否有疏漏,
13、并不能集中精力于业务规律开发上面。ORM 则建立了 Java 对象与数据库对象之间的影射关系,程序员不需要编写简单的 SQL 语句,直接操作 Java 对象即可,从而大大降低了代码量,也使程序员更加专注于业务规律的实现。2、数据库对象连接问题关系数据对象之间,存在各种关系,包括1 对 1、1 对多、多对 1、多对多、级联等。在数据库对象更的时候,假设承受 JDBC 编程,程序员必需格外留神处理这些关系,以保证维持这些关系不会消灭错误, 而这个过程是一个很苦痛的过程。ORM 建立 Java 对象与数据库对象关系影射的同时,也自动依据数据库对象之间的关系创立 Java 对象的关系,并且供给了维持这
14、些关系完整、有效的机制。3、系统架构问题现在的应用系统,一般由展现层、业务规律层、数据访问层、数据库层等组成,各层次功能划分非 常清楚。JDBC 属于数据访问层,但是使用 JDBC 编程时,程序员必需知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创立了什么索引等等与后台数据库 相关的具体信息。相当于软件程序员兼职数据库 DBA。使用 ORM 技术,可以将数据库层完全隐蔽,呈献给程序员的只有 Java 的对象,程序员只需要依据业务规律的需要调用 Java 对象的 Getter 和 Setter 方法,即可实现对后台数据库的操作,程序员不必知道后台
15、承受什么数据库、有哪些表、有什么字段、表与表之间有什么关系。于是,系统设计人员把 ORM 搭建好后,把 Java 对象交给程序员去实现业务规律,使数据访问层与数据库层清楚分界。4、性能问题承受 JDBC 编程,在很多时候存在效率低下的问题,如:pstmt =conn.prepareStatement(“insert into user_info values(?,?)“);for (int i=0; i1000; i+) pstmt.setInt(1,i); pstmt.setString(2,“User“+i.toString); pstmt.executeUpdate;以上程序将向后台数据
16、库发送 1000 次 SQL 语句执行恳求,运行效率较低。假设承受 ORM 技术,ORM 框架将依据具体数据库操作需要,会自动延迟向后台数据库发送 SQL 恳求, 如上面的程序,只会在循环完成后,一次向数据库发送操作恳求,从而大大降低通讯量,提高运行效率; ORM 也可以依据实际状况,将数据库访问操作合成,尽量削减不必要的数据库操作恳求。目前流行的 ORM 产品目前众多厂商和开源社区都供给了长久层框架的实现,常见的有:Apache OJB :/db.apache.org/ojb/ Cayenne :/objectstyle.org/cayenne/ Jaxor :/ Hibernate :/
17、hibernate.org iBatis :/ ibatis jRelationalFramework :/ mirage :/itor.cq2.org/en/oss/mirage/toon SMYLE :/ drjava.de/smyleTopLink :/otn.oracle /products/ias/toplink/index.html 其中 TopLink 是 Oracle 的商业产品,其他均为开源工程。其中 Hibernate 的轻量级 ORM 模型逐步确立了在 Java ORM 架构中领导地位,甚至取代简单而又繁琐的EJB 模型而成为事实上的 Java ORM 工业标准。而且其中
18、的很多设计均被 J2EE 标准组织吸纳而成为最EJB 3.0 标准的标准,这也是开源工程影响工业领域标准的有力见证。Hibernate 框架ORM 的实现原理对于 Hibernate 的称呼有很多,比方工具、技术、框架以及解决方案等,这些都可以,重要的是大家要知道它的作用。在这里我习惯性称它为框架,它是一种能实现 ORM 的框架。能实现 ORM 这个功能的框架有很多,Hibernate 可以说是这些框架中最流行、最受开发者关注的,甚至连 JBoss 公司也把它吸取进来,利用它在自己的工程中实现 ORM 功能。现在在 Java 领域大家对 Hibernate 的争论很多,比方它的优缺点、如何应用
19、、错误如何解决以及把它和Struts/Spring 等框架相结合作为整个系统的解决方案。在这里我想和大家探讨一些更深层次的话题,那就是 Hibernate 是如何实现 ORM 的功能?假设让我们自己开发一款实现 ORM 功能的框架需要怎么做?其实这些问题就是围围着一个词,那就是“映射”,假设我们知道如何实现这种映射那么我们也能够开发出自己的一款 ORM 框架。会使用 Hibernate 的开发人员都知道,在使用它实现 ORM 功能的时候,主要的文件有:映射类*.java、映射文件*.hbm.xml以及数据库配置文件*.properties 或*.cfg.xml,它们各自的作用如下。映射类:它的
20、作用是描述数据库表的构造,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比方连接哪中数据库、登录用户名、登录密码以及连接字符串等。在这三种主要的文件中,映射类为一般 Java 源文件、映射文件为 XML 格式、数据库配置文件为 Properties 格式或者是 XML 格式。想理解“映射”首先我们需要知道如何解析这三种文件,即解析 XML 格式文件、解析 Pr
21、operties 格式文件和解析 Java 类文件。下面我们来分别探讨一下如何实现这些文件的解析。如何解析 XML 文件前面我们说过映射文件是 XML 格式,数据库配置文件也可以是 XML 格式,因此假设能解析 XML 文件我们就可以猎取这两个文件的信息。XML 文件格式我简洁做下介绍,比方tom这句就是一个 XML 格式的描述,name 代表节点,节点必需有开头标记和完毕标记,在开头标记中我们可以添加一些属性的声明比方 sex。解析 XML 的技术可以分为两类那就是 SAX 和 DOM,这两种方式的差异和优缺点大家可以上网查阅或者我们会在以后的文章中提出,请大家关注。实现解析 XML 文件的
22、功能很便利,我们可以通过下载第三方的一些工具包如 xml-apis.jar 和 xercesImpl.jar 等,也可以使用 JDK 自带的工具类 DocumentBuilderFactory、DocumentBuilder、Document、Element 等等,大家可以通过API 文挡查阅这些类的说明。通过这些类我们可以把 XML 文件的信息读入内存并通过类中的某些方法猎取指定节点的名字、值、属性名、属性值这些信息。解析 Properties 文件数据库配置文件可以是 XML 格式也可以是 Properties 格式,Properties 文件一般承受“属性名=属性值” 的形式描述信息。假
23、设配置文件承受Properties 文件描述,我们就需要想方法解析这种类型的文件了。想解析 Properties 文件大家就需要生疏 Properties 这个类了,这个类有一些常用方法比方,load加载指定文件并读取文件中的属性信息, PropertyNames返回全部属性名,getProperty返回指定属性名的属性值。通过解析 Properties 文件我们可以得到连接数据库必要的信息,然后通过底层 JDBC 技术与数据库建立连接。解析 Java 类文件通过解析映射文件和数据库配置文件我们可以建立数据库的连接,可以得到映射类的名字、属性名、数据 库表名、字段名以及类型等信息。要把数据库中
24、表的数据映射成为对象,首先需要把表中的记录用出,然 后将每个字段值给映射类对象的每个属性,这个赋值过程要调用对象中的 set 方法。我们现在通过映射文件只知道类名和属性名,如何依据类名和属性名调用相应的set 和 get 方法,是一个关键问题。在Java 中有一种机制叫反射机制,使用这种机制我们可以得到类的信息,包括类只用的修饰符、方法、属性、继承 的父类以及实现接口等信息。反射机制相关的类有 Class、Field、Method 以及 Constructor 等。通过 Class 的 getFields、getMethods和 getConstructors方法得到相应的属性、方法和构造方法
25、。通过 Field 类的 getName、getType和 getModifiers方法得到相应的属性名、属性类型、属性修饰符信息。通过Method 类 getReturnType可以猎取方法的返回类型,invoke方法可以依据给定的方法名和参数值执行对象中对应的方法。我们可以首先通过以上方法猎取类中的属性名,然后拼写成 setXXX 和 getXXX 方法名, 最终依据方法名执行对应的方法,将数据库数据加载到对象中。此外要实现 Hibernate 机制还会涉及到一个技术点,那就是如何猎取数据库的相关信息。要实现这个功能,就需要大家了解 JDBC 的 DataBaseMetaData 类和 ResultSetMetaData 类,通过这两个类的方法我们就可以猎取数据库表的字段名、类型、大小等相关信息。在这里我只是给大家把实现 ORM 功能的一些关键技术提了出来,通过上面介绍大家对 ORM 机制应当有个或许了解,比方通过解析数据库配置文件猎取数据库连接信息并建立连接,通过解析映射文件可以猎取映射 类名、属性名、表名以及字段名等信息,得到名字后通过反射机制可以得到映射类信息,调用构造方法创 建对象,调用每个属性的 set 方法给对象设值完成数据的装载。Hibernate 就是承受这个过程来实现 ORM 的,固然 Hibernate 还使用了事务掌握、缓存掌握等很多技术
限制150内