Hibernate工作机制简述

一、Hibernate

Hibernate是一个ORM(对象关系映射)框架。可以将其理解为中间件,介于应用程序和数据库之间的软件。
其本身就是对Jdbc进行轻量级的封装,让开发人员能更专注于业务开发。


二、工作流程

这里写图片描述

1、读取Hibernate配置文件,并创建Configeration类的实例。
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry =  new StandardServiceRegistryBuilder().applySettings(config.getProperties()).configure().build();
2、读取并解析pojo的映射信息,创建SessionFactory
//创建会话工厂对象
sessionFactory = config.buildSessionFactory(serviceRegistry);
3、打开Sesssion
 //创建会话对象
session = sessionFactory.openSession();

Session对象相当于jdbc中的connection数据库,因为要面对对象的思想操作数据库,所以用session而不是用而不是直接用JDBC。session与connection是一对多的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session实例。session的增删改查:save(),update(),delete().createQuery())

4、创建事务Transation
 //开启事务
transaction = session.beginTransaction();
5、持久化操作
//session的增删改查:save(),update(),delete().createQuery()
session.save(...);
....
6、提交事务

transaction.commit();
hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交方式,所以用session保存对象时,如果不开启事务并且手动提交事务,对象并不会真正保存在数据库中。不开事务的情况下,要用session的doWork()方法将数据提交到数据库

7、关闭Sesstion

session.close();

8、关闭SesstionFactory

sessionFactory.close();


三、Hibernate中的 核心类/接口

(1)Configuration
用于解析hibernate.cfg.xmlXXXXX.hbm.xml文件,并创建SessionFactory对象。Hibernate应用通过Configuration实例来指定对象--关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。

(2)SessionFactory接口:
用于充当数据存储源的代理和创建Session对象。(SessinFactory数据存储源一一对应,如果应用同时访问多个DB,需要为每个数据库创建一个单独的SessionFactory实例。)

(3)Session接口:
持久化管理器,对象级数据库操作。Session实例是轻量级的(创建和销毁不需要消耗太多的资源)、不是线程安全的,并且和一个Session实例与DB事务进行绑定。所以每执行一个DB事务都应该创建一个新的session实例,并且在使用结束后调用close()方法进行释放。

(4)Query接口:
执行数据库查询操作。(使用HQL(HibernateQueryLanguage)查询语句)

(5)Transaction用于管理操作事务。


四、Hibernate使用编写流程

(1)创建pojo类(javaBean)
(2)创建映射文件(.hbm.xml)
(3)创建配置文件(hibernate.hbm.xml)
(4)最后调用Hibernate API对数据库进行CRUD操作.
具体案例参考


五、Hibernate优缺点

优点:
1. 对JDBC的代码进行封装,大大简化了数据访问层的实现,增加开发效率。
2. 更好的移植性。
3. Hibernate用的是ORM 对象关系模型来操作数据库,符合Java发OOP原则。
4. 缓存机制的使用,不论是默认的一级缓存或者是通过配置使用的二级缓存都可以减少对数据库的访问次数,节省开支。

TIP:一级缓存是session级别的,二级缓存是应用级别的。

缺点:
1、由于对持久层封装过于完整,导致开发人员无法对SQL进行灵活的操作(如优化等)。
2、由于对JDBC进行了全面封装,其访问数据库的效率低于JDBC。
3、多了HQL语句的学习成本。

猜你喜欢

转载自blog.csdn.net/qq_33404395/article/details/81454950