`

Hibernate框架ORM的原理

    博客分类:
  • java
阅读更多
hibernate,通过对jdbc进行封装,对 java类和 关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作,改变了传统的jdbc + sql操作数据的方式,从而使开发人员可以话更多精力进行对象方面的开发,好处并不只是简化了数据库操作,更有价值的事对不同的数据库提供了统一操作的接口,使应用程序的跨数据库开发成为可能。

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文件格式我简单做下介绍,比如<name sex=”male”>tom</name>这句就是一个XML格式的描述,name代表节点,节点必须有开始标记<name>和结束标记</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还使用了事务控制、缓存控制等很多技术
分享到:
评论
9 楼 ww20042005 2010-10-15  
楼长写的不错
8 楼 xyqqjy 2010-07-09  
条理清晰,学习了,多谢楼主.
7 楼 likehibernate 2010-04-23  
分析得不错!
以前注册这个用户名时的确是挺喜欢hibernate的,后面随着对hibernate的深入了解,始终觉得hibernate带给我的并不只是解决方案,更带来一种思想上的向上提升.以前开发关注的是细节,往往会一直钻,可以说是点.现在会往上再去看问题,所以觉得hibernate还是不错的.当然hibernate也有其不足之处,这些不在这讨论,因为每个人的关注点不一样!
6 楼 pgy20032000 2010-04-22  
好贴 希望楼主能分析一下核心代码
5 楼 ckn126 2010-04-22  
思路是对的,但是 还没有细致的深入揭破hibernate。。
4 楼 whaosoft 2010-04-22  
lz写的不错 在把 hibernate的好处写出来更好了
3 楼 yaobiao753 2010-04-22  
楼主 继续 期待你的好文
2 楼 hypercube1024 2010-04-22  
楼主 大拿
1 楼 yunyanmiman 2010-04-22  
学习了,楼主写的不错!

相关推荐

    Hibernate框架ORM的实现原理

    Hibernate框架ORM的实现原理.doc

    ORM自定义框架

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

    高效使用JavaEE ORM框架

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

    ORM思想的深入学习ORM.zip

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

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

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

    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、...

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

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

    Hibernate5教程文档大纲

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

    常见hibernate面试题

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

    精通 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...

    Java三大框架面试题.docx

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

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

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

    持久层框架ibatis学习笔记

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

    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经典面试题详细

    Hibernate 和 MyBatis 的区别 MyBatis的解析和运行原理 MyBatis编程步骤是什么样的? 请说说MyBatis的工作原理 MyBatis的功能架构是怎样的 MyBatis的框架架构设计是怎么样的 为什么需要预编译 Mybatis都有哪些...

    精通 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...

Global site tag (gtag.js) - Google Analytics