hibernate的工作原理

工作原理:

  • ①读取并解析配置文件。
  • ②读取并解析映射信息,创建SessionFactory。
  • ③打开Session
  • ④创建事务Transaction。
  • ⑤持久化操作。
  • ⑥提交事务。
  • ⑦关闭Session。
  • ⑧关闭SessionFactory。

概述:

  • Hibernate可以理解为是一个中间件,它负责把Java程序的SQL语句接收过来并发送到数据库,而数据库返回来的信息由Hibernate接收后直接生成一个对象传给Java。
  • 首先,必须有数据库文件,假设数据库里有一个employee员工表,SQL语句如下:
create table employee(id Number(10),name varchar2(20))
  • 其次,Hibernate有两个特有的文件,一个是以.cfg.xml结尾的文件,一个是以.hbm.xml结尾的文件。

详述:

1、关于cfg.xml文件:
  • cfg.xml文件的作用就是连接数据库。文件内部其实就是一个由user、password、url、driver组成的连接库的基本信息。文件的内容如下:
<Hibernate-configuration>
    <session-factory>
        <property name="connection.username">用户名</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:数据库名</property>
        <property name="connection.password">密码</property>
        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="dialect">org.Hibernate.dialect.OracleDialect</property>
        <mapping resource="employee.hbm.xml"/>  
    </session-factory>
</Hibernate-configuration>
  • 简单分析一下这个文件:
    • ①包含的是程序里面的configuration实例信息。通过这个实例的方法configure,我们可以从mapping中得到对应的表的信息和类的信息。
    • ② < session-factory > 这个标签是程序中通过configure的方法BuildSessionFactory得到的一个SessionFactory对象,这个对象可以理解为一个statement。我们对数据库的所有操作都是通过它的一系列方法来实现。
    • ③property dialect 都是Hibernate的一些属性设置,我们可以设置很多Property,其中一些是必须的,一些是可选的。

2、关于hbm.xml文件

  • hbm.xml文件是对数据库中表的映射文件,可以由这个文件指出哪个类对应着哪个表,而且还指出哪个类中的属性对应着表中的哪个字段。文件内容如下:
<Hibernate-mapping>
    <class name="src.employee" table="employee">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
        <property name="name" column="name"/>
    </class>
</Hibernate-mapping>
  • 上面文件里面有一行语句
<generator class="increment"/>

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

  • 这个文件解释了< Hibernate-mapping >所包含的就是cfg.xml文件中说的mapping。Java类中配置得到的mapping就是从这个文件里面读取出来的。如:
<class name="src.employee" table="employee">

就是先指定了类对应的表。文件中的语句就是指定表中的字段与类中的属性的对应关系。

  • 下面再说说要实现功能所需的Java类,有两个:一个是employee类,一个是Test类。 employee类是一个简单的JavaBean。它是先和数据库字段对应,然后取值的。
package src;

public class Employee{
    private int id;
    private String name;

    public void setId(int id){
        this.id = id;
    }

    public int getId(){
        return id;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }
}

再看一下Test类:

package src;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class Test{
    try{
        SessionFactory sessionfactory = new Configuration().configure().BuildSessionFactory();
        Session session = sessionfactory.opensession();
        Transaction transaction = session.beginTransaction();
        for(int i = 0;i<3;i++){
            Employee employee = new Employee();
            employee.setName("begin go "+i);
            session.save(employee);
        }
        transcation.commit();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        session.close();
    }
}
对代码分析如下:
  • 1、语句
SessionFactory sessionfactory = new Configuration().configure().BuildSessionFactory();

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

  • 2、通过BuildSessionFactory得到SessionFactory对象。
  • 3、通过opensession()建立连接。Session就是指一个Session被建立,这里等于是一个connection被建立好。
  • 4、通过Session对象开启事务(Transaction)相当于conn.setAutoCommit(false)先不递交,最后通过另外一个方法递交。
  • 5、循环语句把employee实例化。
  • 6、实例化后就可以用其中的方法,如setName方法等。
  • 7、每次都要用session来save一下,一个对象set之后要保存在session中。
  • 8、最后递交commit().
  • 之所以没有SQL语句,是因为Hibernate的特性,对数据库的操作就是对对象的操作,这就是OR-Mapping的本质。

使用Hibernate的原因:

  • 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它在很大程度上简化了DAO层的编码工作。
  • Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  • Hibernate的性能非常好,因为它是一个轻量级框架,映射的灵活性很出色。它支持各种关系型数据库,从一对一到多对多的各种复杂关系。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

iOS开发之再探多线程编程:Grand Central Dispatch详解

Swift3.0相关代码已在github上更新。之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread、操作队列以及GCD,介绍的不够深入。今...

20270
来自专栏问天丶天问

Java代码远程操作oracle数据库,执行sql文件、备份、回滚

40920
来自专栏chenssy

【死磕Sharding-jdbc】---基于 SSM 集成sharding-jdbc2.0.3

本篇文章讲解如何在ssm(spring、springmvc、mybatis)结构的程序上集成sharding-jdbc(版本为2.0.3)进行分库分表; 假设分...

10110
来自专栏狂码一生

深入PHP FTP类的详解

FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是Active,主动方式),一种是 Passive (也就是PASV,被动方式)。...

46480
来自专栏Linux驱动

36.Linux驱动调试-根据oops定位错误代码行

1.当驱动有误时,比如,访问的内存地址是非法的,便会打印一大串的oops出来 1.1以LED驱动为例 将open()函数里的ioremap()屏蔽掉,直接使用物...

29180
来自专栏Fundebug

Source Map入门教程

部署前端之前,开发者通常会对代码进行打包压缩,这样可以减少代码大小,从而有效提高访问速度。然而,压缩代码的报错信息是很难Debug的,因为它的行号和列号已经失真...

25860
来自专栏FreeBuf

Hongcms 3.0.0后台SQL注入漏洞分析

* 本文作者:BlackWater,本文属FreeBuf原创奖励计划,未经许可禁止转载。

13660
来自专栏人工智能LeadAI

mongoDB的安装及基本使用

mongoDB简介 1、NoSQL数据库 数据库:进行高效的、有规则的进行数据持久化存储的软件 NoSQL数据库:Not only sql,指代非关系型数据库...

31080
来自专栏CSDN技术头条

使用 Dubbo 搭建一个简单的分布式系统

随着阿里巴巴开源的高性能分布式 RPC 框架 Dubbo 正式进入 Apache 孵化器,Dubbo 又火了一把。本文作为 Dubbo 系列开端,先教大家使用 ...

18320
来自专栏技术之路

【swift学习笔记】二.页面转跳数据回传

上一篇我们介绍了页面转跳:【swift学习笔记】一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据...

22480

扫码关注云+社区

领取腾讯云代金券