Hibernate框架ORM的实现原理-不是技术的技术

Hibernate 框架 ORM 的实现原理

2007-08-24 来自:梁建全

梁建全 :

东方标准国际软件专业讲师,曾经负责过的重大的大型项目包括:全军武器装备质量管理系统、全军办公自动化系统、日本 NTT 电信管理系统等。主要著作包括《 ASP.NET 开发答疑 200 问》《 ASP.NET 开发实例导航》等。毕业于北京大学计算机专业。

 

1. 什么是 ORM

 

ORM 的全称是 Object Relational Mapping ,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

 

2 什么是 Hibernate

 

对于 Hibernate 的称呼有很多,比如工具、技术、框架以及解决方案等,这些都可以,重要的是大家要知道它的作用。在这里我习惯性称它为框架,它是一种能实现 ORM 的框架 。能实现 ORM 这个功能的框架有很多, Hibernate 可以说是这些框架中最流行、最受开发者关注的,甚至连 JBoss 公司也把它吸收进来,利用它在自己的项目中实现 ORM 功能。

 

3 ORM 的实现原理

 

现在在 Java 领域大家对 Hibernate 的讨论很多,比如它的优缺点、如何应用、错误如何解决以及把它和 Struts/Spring 等框架相结合作为整个系统的解决方案。在这里我想和大家探讨一些更深层次的话题,那就是 Hibernate 是如何实现 ORM 的功能?如果让我们自己开发一款实现 ORM 功能的框架需要怎么做?其实这些问题就是围绕着一个词,那就是“映射”,如果我们知道如何实现这种映射那么我们也能够开发出自己的一款 ORM 框架。会使用 Hibernate 的开发人员都知道,在使用它实现 ORM 功能的时候,主要的文件有:映射类( *.java )、映射文件( *.hbm.xml )以及数据库配置文件( *.properties *.cfg.xml ,它们各自的作用如下。

 

映射类 :它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。

 

映射文件 :它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

 

数据库配置文件 :它的作用是指定与数据库连接时需要的连接信息,比如连接哪中数据库、登录用户名、登录密码以及连接字符串等。

 

在这三种主要的文件中,映射类为普通 Java 源文件、映射文件为 XML 格式、数据库配置文件为 Properties 格式或者是 XML 格式。想理解“映射”首先我们需要知道如何解析这三种文件,即解析 XML 格式文件、解析 Properties 格式文件和解析 Java 类文件。下面我们来分别探讨一下如何实现这些文件的解析。

 

⑴如何解析 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 文件的信息读入内存并通过类中的某些方法获取指定节点的名字、值、属性名、属性值这些信息。

 

解析 Properties 文件

 

数据库配置文件可以是 XML 格式也可以是 Properties 格式, Properties 文件一般采用“属性名 = 属性值”的形式描述信息。如果配置文件采用 Properties 文件描述,我们就需要想办法解析这种类型的文件了。想解析 Properties 文件大家就需要熟悉 Properties 这个类了,这个类有一些常用方法比如, load() 加载指定文件并读取文件中的属性信息, PropertyNames() 返回所有属性名, getProperty() 返回指定属性名的属性值。通过解析 Properties 文件我们可以得到连接数据库必要的信息,然后通过底层 JDBC 技术与数据库建立连接。

 

解析 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 类,通过这两个类的方法我们就可以获取数据库表的字段名、类型、大小等相关信息。在这里我只是给大家把实现 ORM 功能的一些关键技术提了出来,通过上面介绍大家对 ORM 机制应该有个大概了解,比如通过解析数据库配置文件获取数据库连接信息并建立连接,通过解析映射文件可以获取映射类名、属性名、表名以及字段名等信息,得到名字后通过反射机制可以得到映射类信息,调用构造方法创建对象,调用每个属性的 set 方法给对象设值完成数据的装载。 Hibernate 就是采用这个过程来实现 ORM 的,当然 Hibernate 还使用了事务控制缓存控制 等很多技术,大家有兴趣的话我们可以以后探讨。

 

限于时间的原因前面提到的一些技术介绍的比较简单,对于有些人可能理解有困难,没关系我会在以后的时间把各个技术分别进行详细的介绍,请大家关注,同时热情邀请大家一起讨论,通过逐步剖析 Hibernate ,使我们对 Hibernate 的理解和驾御能力更近一步。谢谢大家。

 

读后感:

       这篇文章,如果从操作技术层面上来讲,确实没有说什么,因为在我看了这篇文章之后,并不能够让我现在就可以使用 Hibernate 。 但是,我至少对这个轮廓有了一个初步的了解了,假如说我们现在身处大山里面,要想从大山里面出去,一看,那里都是高山,就不知道如何走、走那个方向;而如 果说我们是站在一座高山上,要去山外还是有那么远,所有的路程还是得自己走,但是我看到了方向,知道自己朝着这个方向走肯定能够走出去。我看了这篇文章就 是这个感觉,真希望以后能够多看到这样的文章,而不是一来就是这里要配置什么,那里需要怎么做,还没有开始,就昏了。


你可能感兴趣的:(xml,框架,Hibernate,orm,配置管理)