什么是Hibernate

 Hibernate可以完成[对象]<=>[关系]的映射工作,也就是经常听到的Object/Relation Mapping(ORM),在没有ORM的时候,开发者需要自己开发对象到数据库的映射工作,一般来说在Java世界中是通过JDBC来实现,在.Net世界是通过ADO.net来实现,众所周知这一项任务是繁琐耗时的,因为要在代码中内置大量的SQL语句,这使得代码的可读性和可维护性大大降低。现在,Hibernate可以为我们来做这项工作,我们只需要配置一个Mapping文件即可,剩下的所有事情就交给Hibernate吧,这样可以节省对象持久化相关的至少30%的JDBC/ADO.net编程工作量,这是多么的令人兴奋阿。 
    1、什么是持久化层?
    企业软件架构比较流行的三层结构是大家比较熟悉的,那就是自上而下为:
    [显示表述层]=>[业务逻辑层]=>[数据库层]
这种结构中,业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务数据的增、删、改、查的操作。为了把数据访问的细节和业务逻辑分开,可以把数据访问作为单独的持久化层。重新分层后自上而下变为:
    [显示表述层]=>[业务逻辑层]=>[持久化层]=>[数据库层]
这样持久化层封装数据访问细节,为业务逻辑提供面向对象的API。一个完善的持久化层应该达到以下几个目标:
    (1)代码重用性高,能够完成所有的DB访问操作;
    (2)能够支持多种数据库平台;
    (3)具有独立性,持久化层的具体实现的变化不能影响上层的实现。
正因为这几个目标的艰巨,在企业级开发中花费大量的时间,采用高级相关技术工程师去重头开发自己的持久层不是很可行的,Hibernate作为持久层中间件,它的具体实现对上层是透明的,开发者无需关系它的具体实现,只需要知道如何访问他的接口就行了。
 
    2、什么是ORM?
    ORM(Object-Relation Mapping)是对象-关系映射,当下流行的开发语言都是面向对象的,如Java,C#。而当下流行的DB大多都是面向关系的,也就是关系数据库。这样在面向对象与面向关系之间需要一个桥梁,才能使二者协同无缝联合工作,ORM就是这个桥梁。映射关系如下:
    [类]<=>[表]   [对象实例]<=>[表的行]   [属性]<=>[表的列]
那么这些映射关系是如何制定的呢?——只需要一个映射文件(XML)即可,在其中配置持久化类与DB表的映射关系后,ORM中间件在运行时参照此文件内容,对象持久化的DB中或把DB中数据加载到持久化类中。
    Hibernate就是一个卓越的ORM中间件。
 
    3、ORM是怎么映射的?
    要把类的属性与DB表的Field对应,ORM就必须能识别类的属性名字和数值。这就必须才用反射(Reflection)技术,相信有一定开发经验的人对此技术都是耳熟能详了吧,当前主流开发语言都支持此技术,如Java和.net,而且具体用法都如出一辙。当然对于那些只想使用ORM而不关心ORM的具体实现的朋友,这些内容不了解也没有任何影响。这也恰恰是ORM的好处啊。
 
    4、Hibernate采用的一个技术
    当配置为自动决定何时把对象数据写入DB的模式下,Hibernate采用了一个自动识别对象属性变化的技术。即Hibernate知道持久化类哪些属性发生了变化,然后据此来决定后便的操作。关于此技术更具体的内容,以后再详述。
 
    5、缓存
    从内存中获取数据要比从DB中获取数据快得多,所以很多ORM都采用缓存结束来提高持久化效率,Hibernate也不例外。在Session中保留所有已经持久化的对象实例作为缓存,如果需要获取的数据在缓存中存在,则不去DB中加载。当然缓存中数据与DB中数据的一致性问题,Hibernate就是通过刚刚说过的[识别对象属性变化]的技术来实现的。
 
    6、什么是HQL?
    HQL(Hibernate Query Language)是Hibernate自己的查询语句,它与SQL相似,但是HQL是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
 
    好了,通过以上这些,基本可以了解Hibernate是什么了,可以开始了解Hibernate的核心接口了,Let's Go
 

经过一天的摸索,终于调通了第一个Hibernate程序,非常的激动,赶快记录下来我的实践过程。

开发环境:eclipse3.21 + myeclipse(Hibernate3.0) + jdk1.5.0 + sql server2000

第一步: 建立数据库和表。

表名:T_account

Fid   int   主键 自增量

Fname varchar 50

Fonhand int 

Ftype  varchar 30

Fcreatetime datetime

第二步:下载sql server 2000 jar 包 下载地址http://download.microsoft.com/download/SQLSVR2000/Install/2.2.0022/UNIX/EN-US/mssqlserver.tar解压后取出msbase.jar / mssqlserver.jar / msutil.jar 存放到一个目录下

第三步:启动eclipse 打开菜单: window --> preferences --> java --> Build path --> user Libraries 点new ,输入jdbc名称:jdbc_sqlserver, 选中刚建好的jdbc,点 Add JARs 选中第二步准备好的三jar文件。点OK关闭。

第四步:新建一个java工程。右键点工程,选preferences  ,点java Build path ,在右边选Libraries ,点Add Libraries ,选 User Libraries , 点next ,选第三步建好的jdbc名称。点OK

第五步:在工程中建立SRC 源程序目录,在目录下建立T_account表对应的实体accountInfo.java文件. (本例是用cownewstudio1.0插件完成这步)如下:

package com.nettwn.finance;

public class accountInfo 
{   
   private int id;      
   private String name;      
   private int onhand;      
   private String type;      
   private java.sql.Date createtime;   
   
   public void setid(int value)
   {
     this.id=value;
   }
   
   
   public void setname(String value)
   {
     this.name=value;
   }
   
   
   public void setonhand(int value)
   {
     this.onhand=value;
   }
   
   
   public void settype(String value)
   {
     this.type=value;
   }
   
   
   public void setcreatetime(java.sql.Date value)
   {
     this.createtime=value;
   }
   
   
   public int getid()
   {
     return id;
   }
   
   
   public String getname()
   {
     return name;
   }
   
   
   public int getonhand()
   {
     return onhand;
   }
   
   
   public String gettype()
   {
     return type;
   }
   
   
   public java.sql.Date getcreatetime()
   {
     return createtime;
   }
      
}

第六步,创建实体类文件的accountInfo.hdm.xml文件。类与表的映射就是这里进行的。(本例是通过cownewstudio1.1建立并稍加修改)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
  <class name="com.nettwn.finance.accountInfo" table="T_account">   
    <id name="id" type="int" column="Fid" >       
        <generator class="identity"/>
    </id>    
     <property name="name" type="string" column="Fname" length="50"/>    
     <property name="onhand" type="int" column="Fonhand" />    
     <property name="type" type="string" column="Ftype" length="50"/>    
     <property name="createtime" type="date" column="Fcreatetime"/>    
  </class>   
</hibernate-mapping>

第七步:创建本工程的配置文件hibernate.cfg.xml 这一步比较重要,数据库的配置就是在这里完成。实现的方法为:右键点工程,选myEclipse,选Add web hibernate...然后按提示配置完后就产生这个文件。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
 <property name="connection.username">sa</property>
 <property name="connection.url">
  jdbc:microsoft:sqlserver://192.168.0.45:1433;DatabaseName=asdfg
 </property>
 <property name="dialect">
  org.hibernate.dialect.SQLServerDialect
 </property>
 <property name="connection.password">
  *************** </property>
 <property name="connection.driver_class">
  com.microsoft.jdbc.sqlserver.SQLServerDriver
 </property>
 <mapping resource="com/nettwn/finance/accountInfo.hbm.xml" />

</session-factory>

</hibernate-configuration>

第八步:建一个java程序测试是否可以通过hibernate进行插入一条数据。文件名为insertAccount.java,以上所做的所有工作都是为了在这里使用方便,看到了吗?不用写一句SQL就完成了一条插入操作。很神奇!

package com.nettwn.finance;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.*;
import org.hibernate.classic.Session;

public class insertAccount
{

 public static void main(String[] args) {
  SessionFactory sf = new Configuration().configure().buildSessionFactory();
  Session session = sf.openSession();
  Transaction tx = session.beginTransaction();
  
  accountInfo acc = new accountInfo();  
  //acc.setid(10);
  acc.setname("gongshang");
  acc.setonhand(45000);
  acc.settype("A");
  acc.setcreatetime(java.sql.Date.valueOf("2007-1-22"));
  
  System.out.println(acc + "_____________10");
  try
  {  
   session.save(acc);
   tx.commit();
   session.close();
   System.out.println(acc + "_____________9999");
  }
  catch(Exception ex)
  {
   ex.printStackTrace();
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值