`
xgbjmxn
  • 浏览: 269398 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

解说Hibernate的工作原理实例

阅读更多
    *
      解说Hibernate的工作原理实例
    * http://developer.51cto.com  2009-09-23 15:37  佚名  21jn  我要评论(0)

      原理是什么呢?hibernate可以理解为是一个中间件它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对象传给java。

      大家可能对Hibernate 有大概了解,但Hibernate 原理到底是什么,不一定清楚,这篇文章主要通过一个实例说明Hibernate 原理。希望对大家的学习有所帮助。

      我们知道如果用java连接数据库我们首先想到的就是JDBC,那么Hibernate 原理是什么呢?hibernate可以理解为是一个中间件它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息 hibernate接收之后直接生成一个对象传给java。

      在说Hibernate 原理之前,先说说Hibernate的文件吧。
      假设一个 student 的学生表:
      sql语句:

         1. create table student(id Number(10),name varchar2(20))

      接下来呢.我们需要有两个hibernate特有的文件。一个是以.cfg.xml结尾的文件.一个是以.hbm.xml结尾的文件。 这两个文件做什么用的呢?

      .cfg.xml 的作用就是连接数据库,文件内部其实就是一个由user,password,url,driver组成的一个连接库的基本信息。

      文件的内容是这样的:

         1. xml version='1.0' encoding='UTF-8'?>
         2.
         3.   PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
         4.   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
         5. 
         6. <hibernate-configuration>
         7.  <session-factory>
         8.   <property name="connection.username">111property>
         9.   <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:risproperty>
        10.   <property name="dialect">org.hibernate.dialect.Oracle9Dialectproperty>
        11.   <property name="connection.password">111property>
        12.                 <property name="connection.driver_class">oracle.jdbc.driver.OracleDriverproperty>
        13. 
        14.   <mapping resource="Student.hbm.xml"/>
        15.         session-factory>
        16. hibernate-configuration>

      这个文件的全称应该是"你的应用名字.cfg.xml"。当前例子建立的项目名称是one.cfg.xml 。


      简单分析一下这个文件:

      包含的是程序里面的 configuration 的实例的信息。通过这个实例的方法configure我们可以从 mapping 里得到对应的表的信息和类的信息。

      这个标签是我们在程序里通过 configure 的方法 BuildSessionFactory 所得到的一个 SessionFactory 对象,这个对象可以理解为一个 statement ,我们对数据库的所有操作都是通过它的一系列方法来实现的。

      里面的那些 property 是一些连接需要的东西。其中dialect 这个是hibernate的方言属性值,对于不同的数据库,方言的值dialect是不同的,那么下面就列出在不同的数据库中如何设置该dialect值(参见下表):  

      RDBMS
     

      方言

      DB2
     

      org.hibernate.dialect.DB2Dialect

      DB2 AS/400
     

      org.hibernate.dialect.DB2400Dialect

      DB2 OS390
     

      org.hibernate.dialect.DB2390Dialect

      PostgreSQL
     

      org.hibernate.dialect.PostgreSQLDialect

      MySQL
     

      org.hibernate.dialect.MySQLDialect

      MySQL with InnoDB
     

      org.hibernate.dialect.MySQLInnoDBDialect

      MySQL with MyISAM
     

      org.hibernate.dialect.MySQLMyISAMDialect

      Oracle (any version)
     

      org.hibernate.dialect.OracleDialect

      Oracle 9i/10g
     

      org.hibernate.dialect.Oracle9Dialect

      Sybase
     

      org.hibernate.dialect.SybaseDialect

      Sybase Anywhere
     

      org.hibernate.dialect.SybaseAnywhereDialect

      Microsoft SQL Server
     

      org.hibernate.dialect.SQLServerDialect

      SAP DB
     

      org.hibernate.dialect.SAPDBDialect

      Informix
     

      org.hibernate.dialect.InformixDialect

      HypersonicSQL
     

      org.hibernate.dialect.HSQLDialect

      Ingres
     

      org.hibernate.dialect.IngresDialect

      Progress
     

      org.hibernate.dialect.ProgressDialect

      Mckoi SQL
     

      org.hibernate.dialect.MckoiDialect

      Interbase
     

      org.hibernate.dialect.InterbaseDialect

      Pointbase
     

      org.hibernate.dialect.PointbaseDialect

      FrontBase
     

      org.hibernate.dialect.FrontbaseDialect

      Firebird
     

      org.hibernate.dialect.FirebirdDialect

      跟住继续讲 Student.hbm.xml 这个文件。这个文件是对数据库的表的映射文件,我们用这个文件指出哪个类对应着哪个表,而且还指出哪个类中的属性对应着表中的哪个字段。
      文件的内容是这样的:

         1. xml version="1.0"?>
         2.
         3.   PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
         4.   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
         5. 
         6. <hibernate-mapping>
         7.  <class name="src.Student" table="student">
         8.   <id name="id" column="id">
         9.    <generator class="increment"/>
        10.   id>
        11.   <property name="name" column="name"/>
        12.  class>
        13. hibernate-mapping>

      到此这个文件就结束了。特别说一下这个id 的问题。我们看到文件里面有个 ,这个是什么呢?这个是可以实现自动 id 增加,也就是说如果我们往数据库中插入一个 name 那么就id自动加1 。

      这个文件解释一下了这个所包含的就是我们前一个文件里面说的mapping。我们在java类中 configure得到的mapping就是从这个文件里面读取出来的。类如果带包的话一定要带包名(推荐一切写的类都要带包).包名和类名要注意.包名小写,类名的第一个大写。我是怕出错,这里提醒大家一下, 这个就是先指定了类对应的表。然后里面的那些就是指定表中的字段与类中的属性的对应关系了。


      到这里这两个特殊的文件就介始完了。下面就开始讲我们的 java 类了。主要有两个:一个是Pojo类,一个是我们的Test类。

      Pojo类其实就是简单的一个javaBean。(Plain Old Java Objects, 简单洁净Java对象)。看下面的代码:

         1. package src; 
         2. 
         3.  public class Student{ 
         4. 
         5.     private int id; 
         6.     private String name; 
         7. 
         8.     public void setId(int id){ 
         9.        this.id=id; 
        10.     } 
        11. 
        12. 
        13.     public void setName(String name){ 
        14.        this.name=name; 
        15.     } 
        16. 
        17.     public int getId(){ 
        18.      return id; 
        19.     } 
        20. 
        21.     public String getName(){ 
        22.      return name; 
        23.     } 
        24.  } 

      就是这么简单的一个类。就是和数据库的字段对应然后取值的。

      下面是我们关键的Test类:

         1. package src; 
         2. 
         3. import org.hibernate.*; 
         4. import org.hibernate.cfg.*; 
         5. 
         6. public class Test{ 
         7.    public static void main(String bb[]){ 
         8.       try{ 
         9.          SessionFactory sf=new Configuration().configure().BuildSessionFactory(); 
        10.          Session s=sf.opension(); 
        11.          Transaction ts=s.beginTransaction(); 
        12.          for(int i=0;i<3;i++){ 
        13.             Student st=new Student(); 
        14.             st.setName("begin go "+ i); 
        15.             s.save(st); 
        16.         } 
        17.          ts.commit(); 
        18.          s.close(); 
        19.        }catch(Exception e){ 
        20.          e.printStackTrace(); 
        21.       } 
        22.    } 
        23. } 

      这里的第一句 SessionFactory sf=new Configuration().configure().BuildSessionFactory(); 得到configuration的实例.这个开始要和最前面的哪个.cfg.xml对应着看了。

      我们取得实例,然后通过configure()读取mapping对应的.hbm.xml文件的信息。然后我们通过 BuildSessionFactory得到SessionFactory对象,然后我们在通过opensession() 建立连接 .Session 就是指一个session被建立。这个需要有servlet的基础理解,这里等于是一个connection被建立好。

      下面通过session对象开启事务(Transaction)这个相当于conn.setAutoCommit(false);先不递交最后通过另外一个方法递交。我们看到下面我们循环里把咱们写好的Student实例化了。既然实例化了我们就能用里面的方法了。

      每次都要session来save一下。一个对象set之后要保存,很好理解吧,保存在了session中。最后递交commit();  这个方法实际上是实现了两个作用

         1. conn.commit();   
         2.  conn.setAutoCommit(true); 

      这样才能把我们的数据放进数据库中。  很奇怪没有sql语句吧.最后提醒一下.想想hibernate的特性.我们对数据库的操作就是对对象的操作.这就是OR-Mapping。呵呵,实例分析结束。

      【编辑推荐】
         1. Hibernate入门学习宝典
         2. Hibernate属性简单分析
         3. Struts-Spring-Hibernate案例
         4. 简述Hibernate配置连接池
         5. 对Hibernate中get()与load()不同点分析
      【责任编辑:叶淑娟 TEL:(010)68476606】

原文:解说Hibernate的工作原理实例
    标 签:  Hibernate 原理

上一篇: Hibernate update全面讲解 下一篇: Hibernate saveOrUpdate分析
网友评论
查看所有评论(0)
通行证: 密码:   注
分享到:
评论

相关推荐

    hibernate的原理详细解说

    ### Hibernate原理详细解说 #### Hibernate概述 Hibernate 是一个开源的对象关系映射(Object Relational Mapping,简称 ORM)框架,用于 Java 应用程序与关系型数据库之间的交互。它通过将对象模型与数据库模型...

    hibernate解说

    其核心特性在于能够自动处理对象到数据库记录的转换,极大地减轻了开发人员的工作负担。同时,Hibernate还提供了丰富的API支持复杂的数据查询和事务管理,是现代Java应用程序开发不可或缺的一部分。

    Hibernate中的merge使用详情解说.docx

    理解`merge()`的工作原理对于优化数据操作和避免潜在的冲突至关重要。以下是对`merge()`函数的详细解析: 1. **游离态和瞬态对象**: - **瞬态对象**:这是刚刚创建但尚未与任何持久化会话关联的对象。它们没有...

    Hibernate手把手教学

    本教学资源源自厦门理工学院软件学院的一位资深Hibernate教师,通过步步截图与详细解说,旨在帮助学生和初学者快速掌握Hibernate的核心概念和实践技巧。 1. **Hibernate简介** - Hibernate是一个开放源代码的Java ...

    夏昕.深入浅出Hibernate1.part1.rar

    由浅入深的讲解Hibernate,并且在最后以实例进行解说

    夏昕.深入浅出Hibernate1.part2.rar

    由浅入深的讲解Hibernate,并且在最后以实例进行解说

    Hibernate读书笔记

    hibernate读书笔记,里面有一些实例和解说,是自己整理的,非常适合开发时做参考

    SSH项目解说.rar

    SSH是三个开源Java框架的缩写,分别是Spring、Struts2和Hibernate,它们常被用于构建企业级Web...通过观看"SSH项目解说"的视频,学生可以更直观地了解SSH框架在实际项目中的运用,从而更好地理解和实施自己的毕业设计。

    SSH开发案例

    SSH开发案例是一个基于Struts、Hibernate和Spring框架的典型Java Web开发项目实例。这个案例集提供了详尽的源代码和解说,旨在帮助开发者理解和掌握这三个技术的集成与应用。 Struts是Apache组织的一个开源框架,...

    dwr基础_dwr兼容三大框架+视频

    Direct Web Remoting (DWR) 是一个开源的Java库,它允许JavaScript在浏览器端与服务器端的...通过视频和文档,你可以深入理解DWR的工作原理,以及如何在三大框架中无缝集成DWR,提高开发效率,实现更丰富的客户端交互。

    sh框架解说

    Action类需要实现Spring的`ApplicationContextAware`接口,以便在初始化时获取Spring的ApplicationContext,然后通过它获取Service实例。例如: ```java public class MyAction implements ...

    SpringSide4

    SpringSide4是基于Spring框架的一个学习和实践项目,它为开发者提供了全面的Spring应用实例和详细解说,帮助开发者深入理解Spring的核心概念和技术。版本4.2.2.GA代表了这个项目在4.2.2版本的最终稳定版,GA...

Global site tag (gtag.js) - Google Analytics