Hibernate框架简介

面试被问及了Hibernate框架,虽然问的很少,很简单,但是还是简单的总结一下吧,以备以后不时之需。

什么是Hibernate框架?

百科定义:Hibernate框架式一个开源的对象关系映射(ORM)框架,是对JDBC的轻量级的对象封装,使java程序员可以使用对象思维来操纵DB。

白话版:在Hibernate之前,我们是如何操作DB的?JDBC,需要在程序中嵌入SQL语句。效率低下,不能忍啊。但是Hibernate的出现,让我们无需再操纵SQL语句了,每个表实例被实例化为一个java对象,操作DB的时候,只需要操作该实例对象即可。这就是Hibernate所做的事情。是不是有一个问题:这个表实例化成什么对象呢?没错,需要你再手动的创建一个跟表结构(R)相对应的java类(O)。然后将这两者相映射(M),酱子,对表的操作就完全转换为了对类对象的操作。这就是ORM。

了解几个概念。

瞬时状态:在程序运行的时候,有些数据保存在内存中,当程序退出后,这些数据就不复存在了,称这些数据的状态是瞬时的。

持久状态:数据以文件形式保存在辅存中,这样,程序退出后,数据依然存在,这种状态称之为持久的。

持久化 :即在程序中的瞬时状态和持久状态之间转换的机制。

剖析框架:(尽量用流水账的方式讲解,容易被接受)

由上图可以看出,Hibernate框架式介于DB和应用之间的,在与App的接口部分,提供了持久化。再稍微展开来看。

PO持久化做的工作就是,将数据库的表实例,转换成相应类对象。同样的,将类对象转换为相应的表实例。

图中hibernate.cfg.xml和Mapping是做什么用的呢?看下图

图中的流程可以看出:应用程序先调用Configration类,该类读取Hibernate.cfg.xml配置文件以及Mapping映射文件,生成一个SessionFactory对象。

然后SessionFactory再生成一个Session对象。这个Session对象是与DB的一次回话。可以说是与数据库交互的核心。增删改查都需要通过Session。

言归正传:什么是Hibernate.cfg.xml配置文件和Mapping文件?

Hibernate.cfg.xml是个配置文件,你要与数据库交互,你总得告诉人家,你的数据库地址是多少?用户名?密码?(还有驱动、方言、连接池等等)具体的可以参考这里

Mapping文件:是一个映射文件,上文中说到,我们需要知道类对象与表模型之间的对应关系,这个Mapping就是设置对应关系的。

有了这两个文件,类<->表,算是正式的桥接上了。接下来才是面向对象操纵数据库了。

再看Configration、SessionFactory和Session:

Configuration读取配置文件和Mapping文件,加上其类名,因此可以想到,它可能是用来完成Hibernate的配置、初始化工作的。比如管理配置文件、链接数据库、管理OR映射关系等初始化工作。

SessionFactory即会话工厂,因此肯定是生产“会话”的,会话需要知道什么?与DB会话需要知道什么?需要知道这个对象对应哪张表。因此SessionFactory才是真正的解析Mapping信息的。

Session自不必多说,与DB的一次会话。增删改查都是在会话中进行的。只不过增删改必须设置事务。

Hibernate就简单介绍到这里了,把最基本的工作流程理了一下,下面附上几个xml文件以及实例,不太明白的可以结合代码来看。

Hibernata.cfg.xml

<?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">root</property>
    <property name="connection.url">//地址,木有写账号密码...
        jdbc:mysql://localhost:3306/study
    </property>
    <property name="dialect">//方言
        org.hibernate.dialect.MySQLDialect
    </property>
    <property name="myeclipse.connection.profile">MySQL5.0</property>
    <property name="connection.password">root</property>
    <property name="connection.driver_class">//驱动
        org.gjt.mm.mysql.Driver
    </property>
    <property name="show_sql">true</property>
    <mapping resource="hibernate/PO/TRegister.hbm.xml" />

</session-factory>

</hibernate-configuration>

Hibernate.mapping.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    <class name="hibernate.PO.TRegister" table="t_register">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <!-- 我在MYSQL中并没有设置该字段递增,但在Hibernate中依然可以设置为递增 -->
            <generator class="increment" />
        </id>
        <property name="userName" type="java.lang.String">
            <column name="userName" length="30" />
        </property>
        <property name="userPwd" type="java.lang.String">
            <column name="userPwd" length="30" />
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" length="10" />
        </property>
        <property name="age" type="java.lang.Integer">
            <column name="age" />
        </property>
    </class>
</hibernate-mapping>

mapping文件中的表结构

create table T_register
(
    id    int primary key,
    userName varchar(30),
    userPwd varchar(30),
    sex varchar(10),
    age int
)

相对应的java类(与上面的表结构完全一样,而且表属性和类属性在mapping.xml中完全对应)

/**
 * 持久化类
 */

public class TRegister  implements java.io.Serializable {

    // Fields    

     private Integer id;
     private String userName;
     private String userPwd;
     private String sex;
     private Integer age;

    // Constructors

    /** default constructor */
    public TRegister() {
    }

    /** minimal constructor */
    public TRegister(Integer id) {
        this.id = id;
    }

    /** full constructor */
    public TRegister(Integer id, String userName, String userPwd, String sex, Integer age) {
        this.id = id;
        this.userName = userName;
        this.userPwd = userPwd;
        this.sex = sex;
        this.age = age;
    }

    // Property accessors

    public Integer getId() {
        return this.id;
    }

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

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return this.userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }

    public String getSex() {
        return this.sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return this.age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

hibernate具体流程实例:

**
 * hibernate 基础类
 * @author fengyan
 * date 2007-01-09 02:32
 */
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static
    {
        try
        {
            //流程图中第一步,解析配置文件
            Configuration config = new Configuration().configure("/hibernate/hibernate.cfg.xml");
           //解析Mapping映射文件,生成工厂
            sessionFactory = config.buildSessionFactory();
        }
        catch(Throwable e)
        {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static final ThreadLocal session = new ThreadLocal();

    public static Session currentSession() throws HibernateException
    {
        Session s = (Session)session.get();
        //Open a new Session,if this Thread has none yet
        if(s == null || !s.isOpen())
        {
            //得到session
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }

    public static void closeSession() throws HibernateException
    {
        Session s = (Session)session.get();
        session.set(null);
        if(s != null)
            s.close();
    }

}

Hibernate框架简介,布布扣,bubuko.com

时间: 2024-10-24 15:31:39

Hibernate框架简介的相关文章

Hibernate框架简介(二)基本使用增、删、改、查

一.Hibernate框架简介 Hibernate是一个优秀的Java持久化层解决方案,是当今主流的对象-关系映射(ORM,ObjectRelationalMapping)工具 1.1.理解持久化 瞬时状态:在程序运行的时候,有些程序数据是保存在内存中,当程序退出后,这些数据就不复存在了,所以称这些数据的状态为瞬时状态 持久状态:在使用一此软件的时候,有些数据,在程序退出后,还以文件等形式保存在硬盘或者数据库中,称这些数据的状态是持久状态 持久化:持久化就是将程序中的数据在瞬时状态和持久状态之间

Apache—DBUtils框架简介

转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernat

粗浅看Struts2和Hibernate框架

----------------------------------------------------------------------------------------------[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52424578作者:朱培      ID:sdksdk0      邮箱: [email protected] --------------------------

关于Struts框架简介

一,什么是框架? 所谓框架就是提供了一组统一的接口和编程方式的可以重用组件,同时我们可以在框架中扩充我们自己的特定逻辑. 二,MVC设计模式 将应用程序分为3个部分:模型 Model,视图View,控制器Controller: 模型组件:负责业务逻辑: 模型包含应用程序的核心功能.模型封装了应用程序的状态.有时它包含的唯一功能就是状态.它对视图或控制器一无所知. 视图组件:负责表示业务范围的视图: 视图提供模型的表示.它是应用程序的 外观.视图可以访问模型的读方法,但不能访问写方法.此外,它对控

Stripes视图框架简介

Stripes第一次接触就觉得它很神奇,不禁让喜欢编码的程序员产生好奇心.是什么让他做到了灵活自如的进行页面跳转呢? Stripes是一个视图框架用于利用最新的Java技术来构建Web应用程序.它具有以下特点: 不需要对每一action进行映射配置(ActionBeans将自动被发现,它利用注释进行配置).支持:action转发.servlet请求.Rest风格请求. 强大的绑定引擎用于构建复杂并脱离请求参数(request parameter)的web对象. 易于使用并可本地化的验证与类型转换

常用框架简介

Spring,作为三大框架之一,一直很困惑她有什么用? 为什么要使用Spring呢?回过头来想想过去一年花了很多时间来看Struts.Hibernate,总是不停地去他们有什么用,怎么去用,却从没去想过为什么要使用他们? 必须要使用SSH吗?所以花了点时间去搜集资料(大部分来自网上,引用出处太多,恕不一一标明.). SSH 在J2EE项目中表示了3种框架,即 Spring + Struts +Hibernate. Struts对Model,View和Controller都提供了对应的组件. Sp

java程序员培训:为什么要用Spring含三大框架简介

文章来源:http://www.zretc.com/technologyDetail/476.html Spring作为三大框架之一,一直困惑她有什么用?为什么要使用Spring呢?(大部分来自网上,引用出处太多,恕不一一标明.). SSH在J2EE项目中表示了3种框架,即 Spring + Struts +Hibernate. Struts对Model,View和Controller都提供了对应的组件.Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,它由Rod Jo

(转)Hibernate框架基础——Hibernate API及Hibernate主配置文件

Hibernate的学习路线图 Hibernate API简介 Configuration Configuration类负责管理Hibernate的配置信息,包括如下内容: Hibernate运行的底层信息:数据库的URL.用户名.密码.JDBC驱动类,数据库Dialect,数据库连接池等(对应hibernate.cfg.xml文件). 持久化类与数据表的映射关系(*.hbm.xml文件). 创建Configuration的两种方式: 属性文件(hibernate.properties) Con

Apache—DBUtils框架简介、DbUtils类、QueryRunner类 、ResultSetHandler接口

Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选. API介绍: org.apache.commons.dbutils.QueryRunner --BDMa