1.为什么要用Hibernate

  JDBC的优点
    直接底层操作,提供了很简单、便捷的访问数据库的方法,跨平台性比较强。灵活性比较强,可以写很复杂的SQL语句。
  JDBC的缺点
    因为JAVA是面向对象的,JDBC没有做到使数据能够面向对象的编程,使程序员的思考仍停留在SQL语句上。
    操作比较繁琐,很多代码需要重复写很多次。
    如果遇到批量操作,频繁与数据库进行交互,容易造成效率的下降。
    JDBC的程序操作可以封装一些什么内容?又不可以封装哪些内容?

  Hibernate优点

    Hibernate实现了面向对象的数据库编程
    Hibernate比起JDBC来,在代码的书写上比较简单化了。
    Hibernate提出了缓存机制,这样可以使访问数据的效率提高很大。
  Hibernate缺点:
    SQL语句是由hibernate生成的,程序员不能干涉生成sql语句,这就造成了优化比较困难。
    在大量数据的条件下,hibernate的执行效率是比较低的。

2.Configuration 类

  Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:
    Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。
    持久化类与数据表的映射关系(*.hbm.xml 文件)

  创建 Configuration 的两种方式:

    属性文件(hibernate.properties):

      Configuration cfg = new Configuration();
    Xml文件(hibernate.cfg.xml):
      Configuration cfg = new Configuration().configure();
    第二种创建方式较为常见。Hibernate.cfg.xml文件默认的目录为系统的根目录

3.SessionFactory类:
  》在hibernate容器起作用的时候,sessionFactory这个类存放了配置文件、映射文件、及持久化的一些信息
  》sessionFactory类是一个重量级别的类
  》sessionFactory类存放了数据库操作的所有的信息
  》一个数据库只能存在一个sessionFactory
  》在hibenernate中,加载配置文件、映射文件、持久化类只需要加载一次
  》sessionFactory是线程安全的
  》sessionFactory是由单例模式来产生的

  SessionFactory是生成Session的工厂: 
    Session session = sf.openSession();
    构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

4.Session是线程级别的
  》当客户端每访问一次,就起一次session

  关于session的运行模式,如下图:

  

  (讲师所说,不代表我的观点)说明:客户端的每一个请求sessionFactory都会产生一个session,为了保证操作的原子性,数据放入session中,设计者把session放到一个ThreadLocal(是一个线程类,有个特点,只有当前线程能够访问,其他线程访问不了)中,这样的话,就把不同的session区分开来,从而保证了数据的安全。

  getCurrentSession和openSession的区别:
    getCurrentSession 从当前线程中获取Session对象,只要事务提交以后,session会自动关闭,不需要程序显示得去关闭
    需要在hibernate.cfg.xml添加对应的配置
      <property name="current_session_context_class">thread</property>
    openSession 不一定时从当前线程中获取Session对象,事务提交以后,必须关闭session

  在Hibernate中,Transaction tx = session.beginTransaction()相当于给数据库操作起事务。Session.commit()则为提交事务。

5.Hibernate的整个运行过程

  hibernate 包括如下4个部分

  》配置文件,用于指明连接数据库所需要的参数
  》映射文件
  》持久化类
  》API

  对应的加载顺序,有下面一幅图:

  

  另一比较好的流程图如下:

  

  Hibernate的整个运行过程如下:

  1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,
  2、并用这些信息生成一个SessionFactory对象,
  3、然后从SessionFactory对象生成一个Session对象,
  4、并用Session对象生成Transaction对象;
    A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作;
    B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。

  源码中实现的过程如下:

  Configuration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。

  Configuration cfg = new Configuration().configure();
  SessionFactory sf = cfg.buildSessionFactory(); 
  

hibernate相关知识的更多相关文章

  1. spring事务管理及相关知识

    最近在项目中遇到了spring事务的注解及相关知识,突然间感觉自己对于这部分知识只停留在表面的理解层次上,于是乎花些时间上网搜索了一些文章,以及对于源码的解读,整理如下: 一.既然谈到事务,那就先搞清 ...

  2. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  3. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  4. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  5. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  6. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  7. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  8. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  9. 电路相关知识--读<<继电器是如何成为CPU的>>

    电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...

随机推荐

  1. EasyUI 调用getSelections方法只能获取到一行的原因

    $('#tt').datagrid({ url: 'GetDataJosn', title: 'DataGrid', width: 800, height: 300, pageSize: 10, id ...

  2. USB做Host的OTG原理

    在介绍USBOTG的基础上,着重介绍Maxim公司的MAX3301E型USBOTG电路的特点.内部结构和工作原理. 1 引言 随着USB2.0版本的发布,USB越来越流行,已经成为一种标准接口.现在, ...

  3. HTML表单和验证事件

    1.表单验证<form></form> (1).非空验证(去空格) (2).对比验证(跟一个值对比) (3).范围验证(根据一个范围进行判断) (4).固定格式验证:电话号码, ...

  4. 在html中嵌入markdown

    在博客园网页里写markdown的时候, 某些特殊内容想加上自定义的css, 于是用<div class="xxx">包裹起来, 但是发现该<div>中的m ...

  5. leetcode面试准备:Divide Two Integers

    leetcode面试准备:Divide Two Integers 1 题目 Divide two integers without using multiplication, division and ...

  6. Perl脚本学习经验(四)--Perl中sftp的使用

    使用sftp,需要使用Except模块,该模块需要下载安装在perl目录下,可以上http://www.cpan.org/上下载对应的安装包:1. 用root用户登录环境:2. cd /usr/lib ...

  7. Linux协议栈函数调用流程

    普通网络驱动程序中必须要调用的函数是eth_type_trans(略),然后向上递交sk_buff时调用netif_rx()(net/core/dev.c).其函数中主要几行 __skb_queue_ ...

  8. 17.1.1 How to Set Up Replication 设置复制:

    17.1.1 How to Set Up Replication 设置复制: 17.1.1.1 Setting the Replication Master Configuration 17.1.1. ...

  9. java学习多线程之创建多线程一

    现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...

  10. NOI2005维护数列

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 6263  Solved: 1879[Submit][Status ...