hibernate相关知识
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相关知识的更多相关文章
- spring事务管理及相关知识
最近在项目中遇到了spring事务的注解及相关知识,突然间感觉自己对于这部分知识只停留在表面的理解层次上,于是乎花些时间上网搜索了一些文章,以及对于源码的解读,整理如下: 一.既然谈到事务,那就先搞清 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- 移动WEB像素相关知识
了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- UIViewController相关知识
title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- NSString使用stringWithFormat拼接的相关知识
NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...
- iOS网络相关知识总结
iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...
- 电路相关知识--读<<继电器是如何成为CPU的>>
电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...
随机推荐
- uva 12526 - Cellphone Typing
字典树,可惜比赛的时候有两句话写倒了: 害得我调了一个小时: 今天不宜做题 = = 代码: #include<cstdio> #include<cstring> #define ...
- CT 来值班,让您安心过新年!
春节,盼了整整一年的节日,我们一定要抛开工作,狠狠的开心,狠狠的幸福,但是作为苦逼的运维,你们真的能完全抛开工作(对网站不闻不问)吗?OneAPM CT 24 小时监控您的网站,让您无忧无虑过新年. ...
- Best Sequence
poj1699:http://poj.org/problem?id=1699 题意:给你nge串,让你求出这些串组成的最小的串重叠部分只算一次. 题解:我的做法是DFS,因为数据范围只有10,就算是n ...
- 在ubuntu12.04下编译android4.1.2添加JNI层出现问题
tiny4412学习者,在ubuntu12.04下编译android4.1.2添加JNI层出现问题: (虚心请教解决方法) trouble writing output: Too many metho ...
- Android之获得内存剩余大小与总大小
方法一: 如何查看android对应用的内存限制 每款手机对应用的限制都是不一样的,毕竟硬件不同,我们可以使用如下方式来查看单独的应用可使用的最大内存: 执行命令: adb shell getprop ...
- unicode下各种类型转换CString、string
把最近用到的各种unicode下类型转换总结了一下: 1.string转CString string a=”abc”; CString str=CString(a.c_str()); 或str.for ...
- Javascript自动换图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 三种asp.net 抓取网页源代码
/// <summary>方法一:比较推荐 /// 用HttpWebRequest取得网页源码 /// 对于带BOM的网页很有效,不管是什么编码都能正确识别 /// </summar ...
- BZOJ_1497_[NOI2006]_最大获利_(最大流+最大权闭合图)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1497 共n个站点,给出建立每个站点所需要的花费.现在有m个客户需要开通服务,每个客户需要有两个 ...
- 【转】virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
原文网址:http://fuliang.iteye.com/blog/1102998 在笔记本安装Ubuntu11.04增强功能失败 引用 fuliang@fuliang-VirtualBox:~$ ...