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();