Hibernate

一、概念

  前言:使用传统的 Servlet + JavaBean + JDBC 可以开发任何项目,但是存在很大缺陷 —— 过于底层、代码繁琐、开发效率低。所以 SSH、SSM 等集成框架备受欢迎。

  概念:Hibernate 是一个应用于持久层,用面向对象思想来操作关系型数据库框架,属于ORM框架(Object Relation Mapping ,对象关系映射,JavaBean 与关系型数据库表的映射),本质是对 JDBC 的封装。

  方言:因为 Hibernate 的 SQL 是“自身”生成的,所以针对不同的数据库,只需要生成不同的 SQL 语句。即 从MySQL 换到 Oracle 数据库,只需要修改方言配置即可。

二、Hibernate开发步骤

  1. 创建持久化类
  2. 创建对象-关系映射文件(类名.hbm.xml 可设置成自动建表)
  3. 创建 Hibernate 配置文件(hibernate.cfg.xml)
  4. 通过 Hibernate API 编写访问数据库的代码(步骤如下)
    1. 通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
    2. 由 hibernate.cfg.xml 中的<mapping resource="com/xx/Xxx.hbm.xml"/>读取解析映射信息。
    3. 通过config.buildSessionFactory();得到 sessionFactory。
    4. sessionFactory.openSession();得到 session。
    5. session.beginTransaction();开启事务。
    6. persistent operate; 执行你自己的操作。
    7. session.getTransaction().commit();提交事务。
    8. 关闭 session。
    9. 关闭 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 方法:直接访问数据库,执行到这行的时候,马上发送SQL查询,查询后返回的是真实对象的本身。

      load 方法:先看缓存,延迟加载。执行到这行的时候,不会发送 SQL语句,什么时候使用这个对象,才会发送SQL语句。查询后返回的是代理对象。

    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 不同)。

四、Hibernate 的缓存类别

​   一级缓存:session 对象的缓存,自带的不可卸载的. 一级缓存的生命周期与 session 一致。

​   二级缓存: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()进行调用。用你所指定的名字,拿到某个特定查询。

 

posted @ 2018-04-16 12:32  贱小提莫  阅读(270)  评论(0编辑  收藏  举报