`

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 。 但是,我至少对这个轮廓有了一个初步的了解了,假如说我们现在身处大山里面,要想从大山里面出去,一看,那里都是高山,就不知道如何走、走那个方向;而如 果说我们是站在一座高山上,要去山外还是有那么远,所有的路程还是得自己走,但是我看到了方向,知道自己朝着这个方向走肯定能够走出去。我看了这篇文章就 是这个感觉,真希望以后能够多看到这样的文章,而不是一来就是这里要配置什么,那里需要怎么做,还没有开始,就昏了。


分享到:
评论

相关推荐

    Hibernate框架ORM的实现原理

    Hibernate框架ORM的实现原理.doc

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第24章 Hibernate与Struts框架  24.1 实现业务数据  24.2 实现业务逻辑  24.3 netstore应用的订单业务  24.4 小结 第25章 Hibernate与EJB组件  25.1 创建EJB组件  25.1.1 编写Remote接口  25.1.2 编写Home...

    ORM自定义框架

    关于orm框架的一个自定义框架,方便人们理解hibernate框架的原理

    高效使用JavaEE ORM框架

    虽然Java领域有无数的ORM框架,如Hibernate,iBatis,TopLink,JDO,JPA……但是这些ORM框架基本上大同小异。很多初学者对JDBC的复杂性望而却步,就简单认为使用ORM就会省时省力,结果恰恰相反,任何好的框架都是给...

    WEB中,各种技术的原理

    2、Hibernate框架如何实现ORM.doc 3、java接口.doc 4、MVC 的原理 .doc 5、Servlet 工作原理解析.doc 6、servlet材料.doc 7、Spring的原理.doc 8、struts1.doc 9、Struts2原理.doc 10、报表.doc 11、框架.doc 12、...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...

    ORM思想的深入学习ORM.zip

    这里面包括了Hibernate和MyBatis的实现ORM思想的原理,以及讲解了什么是ORM思想。仿照Hibernate自定义了一个简单的增删改查的ORM框架,还有测试代码。

    编程语言+JAVAspring+ORM框架+数据持久化

    它介绍了JAVAspring的ORM框架的概念、原理和作用,以及如何使用JAVAspring的ORM框架来实现数据持久化,包括JDBC、Hibernate、MyBatis等常用的ORM框架的集成和使用,以及一些配置文件和注解的用法。

    Hibernate5教程文档大纲

    HIbernate完整文档,有教程有截图,也有详细步骤,其中包括ORM思想介绍、框架原理、原理图、核心对象、核心配置文件、关联关系、映射文件、批量处理、事务控制、Hibernate缓存以及注解等

    Java三大框架面试题.docx

    Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第24章 Hibernate与Struts框架  24.1 实现业务数据  24.2 实现业务逻辑  24.3 netstore应用的订单业务  24.4 小结 第25章 Hibernate与EJB组件  25.1 创建EJB组件  25.1.1 编写Remote接口  25.1.2 编写Home...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第24章 Hibernate与Struts框架  24.1 实现业务数据  24.2 实现业务逻辑  24.3 netstore应用的订单业务  24.4 小结 第25章 Hibernate与EJB组件  25.1 创建EJB组件  25.1.1 编写Remote接口  25.1.2 编写Home...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第24章 Hibernate与Struts框架  24.1 实现业务数据  24.2 实现业务逻辑  24.3 netstore应用的订单业务  24.4 小结 第25章 Hibernate与EJB组件  25.1 创建EJB组件  25.1.1 编写Remote接口  25.1.2 编写Home...

    常见hibernate面试题

    列举了一些Hibernate框架相关的面试题,包括Hibernate实现原理、功能优势、常用方法、缓存机制等。另外还包括15道选择题及答案,大家感兴趣可以自测一下,我第一遍做居然错了7道,呵呵☻。

    图书管理系统(struts+hibernate+spring+ext).rar

    Hibernate作为持久层框架,负责实现对象关系映射(ORM),将Java对象与数据库表进行映射,简化了数据库操作的复杂性。Spring作为IoC容器,负责管理对象的生命周期和依赖关系,降低了系统各模块之间的耦合度。Ext作为...

    Java Web程序设计教程

    第14章spring与struts2、hibernate框架的整合基础 277 14.1spring与struts2的整合方式 277 14.1.1struts2应用的扩展方式 277 14.1.2spring插件的应用 278 14.2spring和hibernate的整合 279 14.2.1spring对...

    MyBatis经典面试题详细

    MyBatis简介 MyBatis是什么? ORM是什么 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里? 传统JDBC开发存在的问题 JDBC编程有哪些不足之处,MyBatis是如何解决这些...如果支持,它的实现原理是什么?

    持久层框架ibatis学习笔记

    的百分之61 的代码量,将Sql 语言与java 程序分离,便于维护和开发,ORM 关系映射上比 JDBC 更加容易更加方便这些有点足以让我们感受到iBatis 的强大。与Hibernate 相比,虽然 没有Hibernate 的功能强大,但也有很多...

Global site tag (gtag.js) - Google Analytics