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

  • 相关阅读:
    Linux pmap 工具
    bzoj 1060 贪心
    bzoj 1076 状压DP
    bzoj 1150 贪心
    bzoj 1412 最小割 网络流
    bzoj 3212 线段树
    bzoj 1942 斜率优化DP
    bzoj 1876 高精
    bzoj 1880 最短路
    斜率优化DP讲解
  • 原文地址:https://www.cnblogs.com/sun7897/p/8855292.html
Copyright © 2020-2023  润新知