Hibernate
一、概念
前言:使用传统的 Servlet + JavaBean + JDBC 可以开发任何项目,但是存在很大缺陷 —— 过于底层、代码繁琐、开发效率低。所以 SSH、SSM 等集成框架备受欢迎。
概念:Hibernate 是一个应用于持久层,用面向对象思想来操作关系型数据库框架,属于ORM框架(Object Relation Mapping ,对象关系映射,JavaBean 与关系型数据库表的映射),本质是对 JDBC 的封装。
方言:因为 Hibernate 的 SQL 是“自身”生成的,所以针对不同的数据库,只需要生成不同的 SQL 语句。即 从MySQL 换到 Oracle 数据库,只需要修改方言配置即可。
二、Hibernate开发步骤
- 创建持久化类
- 创建对象-关系映射文件(类名.hbm.xml 可设置成自动建表)
- 创建 Hibernate 配置文件(hibernate.cfg.xml)
- 通过 Hibernate API 编写访问数据库的代码(步骤如下)
- 通过
Configuration().configure();
读取并解析hibernate.cfg.xml配置文件。 - 由 hibernate.cfg.xml 中的
<mapping resource="com/xx/Xxx.hbm.xml"/>
读取解析映射信息。 - 通过
config.buildSessionFactory();
得到 sessionFactory。 sessionFactory.openSession();
得到 session。session.beginTransaction();
开启事务。persistent operate;
执行你自己的操作。session.getTransaction().commit();
提交事务。- 关闭 session。
- 关闭 sessionFactory。
- 通过
Hibernate 的核心配置文件:
Hibernate 框架支持 properties 和 xml 两种方式的属性配置。对应的两种核心配置文件为:
hibernate.properties :配置常用的属性,必须手动加载 hbm 文件或持久化类。(了解)
hibernate.cfg.xml :配置常用的属性,配置加载 hbm 映射,配置缓存策略等。(推荐)
三、核心 API 接口
所有的 Hibernate 应用都会访问 Hibernate 的 5 个核心接口。
Configuration 、SessionFactory 、Session 、Transaction 、 Query 和 Criteria 以及 SQLQuery 接口。
Configuration 对象:用来加载 Hibernate 配置和启动 Hibernate,创建 SessionFactory 对象。
SessionFactory 对象:初始化 Hibernate ,本质是对 JDBC 中数据库连接池的封装,创建 Session 对象。(全局只需要有一个就可以了,因为它的内部还维护着 Hiberante 的二级缓存<一般不用,用redis> ,所以它的创建和销毁需要消耗大量的资源,并且它是线程安全的)
Session 对象:执行 CRUD 的主体,是 Hibernate 与数据库交互的桥梁。创建 Transaction 对象。内部维护 Hiberante 的一级缓存。(不是线程安全的,不能创建全局)。
1、get方法和load方法的区别:
两者都是用来根据主键查询对象。
get 方法:直接访问数据库,查询后返回的是真实对象的本身。
load 方法:先看缓存,延迟加载。查询后返回的是代理对象。
2、save()、persist() 和 saveOrUpdate() 的区别?
都是用于将对象保存到数据库的方法。
save() 只能 insert 记录,saveOrUpdate() 可以进行记录的 insert 和 update。
save() 返回值是 Serializable(序列化) 对象,persist()返回值是 viod 。
Transaction 对象:管理事务。默认情况下事务不自动提交,需要手动提交事务。每段事务操作都是隐含着异常的,需要手动添加try catch。
Query 和 Criteria 以及 SQLQuery 接口:都是 Hibernate 的查询接口,用于向数据库查询对象。
Query 对象:不需要写 SQL 语句,写 HQL 语句。跨数据库使用。
Criteria 对象:QBC(QBC,Query By Criteria)不需要写语句,直接调用方法实现。跨数据库使用。
SQLQuery 对象:写 SQL 语句。不能跨数据库(数据库的 SQL 不同)。
四、
二级缓存:SessionFactory 对象的维护的缓存,可以在多个 session 中共享数据。一般不会用,企业里通常使用 Redis。
1、查询缓存指的是什么?
查询缓存实际上保存的是 SQL 查询的结果,这样再进行相同的 SQL 查询就可以从缓存中拿到结果了。
五、Hibernate 的持久化类
持久化类的三种状态:
1、瞬时态:没有 OID ,没有关联 session 对象。
2、持久态:有 OID ,关联了 session 对象。
3、脱管态:有 OID ,没有关联 session 对象。
持久态类特性:自动更新数据库。(session 内部有两个存储区域,一级缓存区和快照区,使用 get/load 查询到的数据在这两个区域会各保存一份对象本身。当持久类在持久态下进行了修改,修改完成后,一级缓存区数据改变,系统对比一级缓存区和快照区数据,如果不同,则自动更新 update 操作)
六、Hibernate 的相关问题
1、命名 SQL 查询指的是什么:
指的是在映射文档中定义或使用@NameQuery注解定义的 SQL 查询,可以使用 Session.getNameQuery()进行调用。用你所指定的名字,拿到某个特定查询。