解说Hibernate的工作原理实例 编辑

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

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

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

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

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

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

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


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


简单分析一下这个文件:

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

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

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


 



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

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


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

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


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

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

  
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类:

  
Java代码
  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();  这个方法实际上是实现了两个作用

  
Java代码
  1. conn.commit();      
  2.     conn.setAutoCommit(true);    

这样才能把我们的数据放进数据库中。  很奇怪没有sql语句吧.最后提醒一下.想想hibernate的特性.我们对数据库的操作就是对对象的操作.这就是OR-Mapping。呵呵,实例分析结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值