zoukankan      html  css  js  c++  java
  • 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>
    View Code

    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>
    View Code

    mapping文件中的表结构

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

    相对应的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;
        }
    }
    View Code

    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();
        }
    
    }
    View Code

     

  • 相关阅读:
    linux常用命令
    ANAFI EXTENOED无人机(1)环境配置和基础开发
    无人机自主降落
    ROS开发(1)安装环境
    bebop无人机(1)环境配置和基础开发
    YOLO标注软件
    Python2与Python3之间切换
    python实现IOU计算
    读取多个(海康大华)网络摄像头的视频流 (使用opencv-python),解决实时读取延迟问题
    如何到外面的世界看看
  • 原文地址:https://www.cnblogs.com/huntfor/p/3893399.html
Copyright © 2011-2022 走看看