Hibernate:解说工作流程实例

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

Hibernate 原理。希望对大家的学习有所帮助。


我们知道如果用java连接数据库我们首先想到的就是JDBC,那么Hibernate原理是什么呢?hibernate可以理解为是一个

中间件,它负责把java程序的sql语句接收过来发送到数据库,而数据库返回来的信息hibernate接收之后直接生成一个对

象传给java。


1、Hibernate 配置文件


在说Hibernate 原理之前,先说说Hibernate的文件吧。

假设一个 student 的学生表,sql语句:

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

 

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

 这两个文件做什么用的呢? .cfg.xml 的作用就是连接数据库,文件内部其实就是一个由user,password,url,driver

组成的一个连接库的基本信息。文件的内容是这样的:

<xml version='1.0' encoding='UTF-8'? PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    
<hibernate-configuration>  
 <session-factory>  
  <property name="connection.username">111property  
  <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:risproperty  
  <property name="dialect">org.hibernate.dialect.Oracle9Dialectproperty  
  <property name="connection.password">111property  
  <property name="connection.driver_class">oracle.jdbc.driver.OracleDriverproperty </property>
  <mapping resource="Student.hbm.xml"/>  
 <session-factory>
<hibernate-configuration>

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

简单分析一下这个文件:

      包含的是程序里面的configuration 的实例的信息。通过这个实例的方法configure我们可以从 mapping 

里得到对应的表的信息和类的信息。<configuration >这个标签是我们在程序里通过 configure 的方法 

BuildSessionFactory 所得到的一个 SessionFactory 对象,这个对象可以理解为一个 statement ,我们对数据库

的所有操作都是通过它的一系列方法来实现的。

      里面的那些 property 是一些连接需要的东西。其中dialect 这个是hibernate的方言属性值,对于不同的数据库,

方言的值dialect是不同的


跟住继续讲Student.hbm.xml这个文件。这个文件是对数据库的表的映射文件,我们用这个文件指出哪个类对

应着哪个表,而且还指出哪个类中的属性对应着表中的哪个字段。文件的内容是这样的:

<xml version="1.0"?PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   
<hibernate-mapping>  
 <class name="src.Student" table="student">  
  <id name="id" column="id">  
   <generator class="increment"/>  
  </id>  
  <property name="name" column="name"/>  
 </class>  
</hibernate-mapping>

到此这个文件就结束了。特别说一下这个id 的问题。我们看到文件里面有个generator,这个是什么呢?这个是

可以实现自动 id 增加,也就是说如果我们往数据库中插入一个 name 那么就id自动加1 。

       这个文件所包含的就是我们前一个文件里面说的mapping。我们在java类中configure得到的mapping就是从

这个文件里面读取出来的。类如果带包的话一定要带包名(推荐一切写的类都要带包).包名和类名要注意.包名小写,类

名的第一个大写。我是怕出错,这里提醒大家一下, 这个就是先指定了类对应的表。然后里面的那些就是指定表中的

字段与类中的属性的对应关系了


2、创建类实例


下面就开始讲我们的 java 类了。主要有两个:一个是Pojo类,一个是我们的Test类。Pojo类其实就是简单的一个

javaBean。(Plain Old Java Objects, 简单洁净Java对象)。看下面的代码:

package src;   
  
 public class Student{   
  
    private int id;   
    private String name;   
  
    public void setId(int id){   
       this.id=id;   
    }   
  
    public void setName(String name){   
       this.name=name;   
    }   
  
    public int getId(){   
     return id;   
    }   
  
    public String getName(){   
     return name;   
    }   
 }  

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

下面是我们关键的Test类:


package src;   
  
import org.hibernate.*;   
import org.hibernate.cfg.*;   
  
public class Test{   
   public static void main(String bb[]){   
      try{   
         SessionFactory sf=new Configuration().configure().BuildSessionFactory();   
         Session s=sf.opension();   
         Transaction ts=s.beginTransaction();   
         for(int i=0;i<3;i++){   
            Student st=new Student();   
            st.setName("begin go "+ i);   
            s.save(st);   
        }   
         ts.commit();   
         s.close();   
       }catch(Exception e){   
         e.printStackTrace();   
      }   
   }   
}  


   这里的第一句 SessionFactory sf=new Configuration().configure().BuildSessionFactory(); 得到configuration

的实例.这个开始要看和最前面的哪个.cfg.xml对应着。

       我们取得实例,然后通过configure()读取mapping对应的.hbm.xml文件的信息。然后我们通过BuildSessionFactory

得到SessionFactory对象,然后我们在通过opensession() 建立连接 .Session 就是指一个session被建立。这里等于是一个connection被建立好。

      下面通过session对象开启事务(Transaction)这个相当于conn.setAutoCommit(false);先不递交最后通过另外一个方法

递交。我们看到下面我们循环里把咱们写好的Student实例化了。既然实例化了我们就能用里面的方法了。

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

法实际上是实现了两个作用

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

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


3、Hibernate 流程图




1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory


4、为什么要用Hibernate


1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作

3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
 

5、说下Hibernate的缓存机制


1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存

2. 二级缓存
a) 应用级缓存
b) 分布式缓存
条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c) 第三方缓存的实现
一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期和session一致。不能对其进行管理。

不用显示的调用。

二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的,也值缓存实体,生命周期和sessionFactory一致,可以进行管理。

首先配置第3方插件,我们用的是EHCache,在hibernate.cfg.xml文件中加入

1 <property name="hibernate.cache.user_second_level_cache">true</property>

在映射中也要显示的调用,<cache usage="read-only"/>

二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查询缓存的生命周期也结束了。

在程序中必须手动启用查询缓存:query.setCacheable(true);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值