一、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.xml
和XXXXX.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语句的学习成本。