Hibernate 学习笔记

hibernate(持久化)

Hibernate 是数据访问层(Dao层),就是把数据存入到数据库中,称为持久化。
Hibernate 对 JDBC 进行了封装,针对数据访问层提出面向对象的思想,操作对象间接的操作数据库中的表,自动生成 SQL 语句,可以简化数据访问层的代码,提高开发效率。

  • 优点:
  • 使用 JDBC 遇到的问题:
    1. 代码中存在大量的 SQL 语句
    2. 查询结果需要手动封装到 Model
    3. SQL 语句中存储大量的 ?,需要手动赋值
    4. SQL 语句根据不同的数据库,有不同的函数,如果更换数据库,需要大量更改 SQL 语句,针对数据库移植性差
  • 使用 Hibernate 可以解决以上问题:
    1. Hibernate 操作对象自动生成 SQL 语句
    2. 查询结果自动赋值给 Model 类
    3. 自动赋值
    4. Hibernate 使用的是 HQL 语句,根据不同的方言,生成不同数据库的 SQL 语句,到达跨数据库平台 注:数据迁移是软性项目中的大事情,特别难做,做项目时对数据库的选型尤为重要
  • 缺点:
  • SQL语句自动生成,人工无法控制,使得 SQL 语句执行效率慢
  • Hibernate 执行效率低
  • Hibernate 特别耗内存,有一系列缓存机制

ORM 是一种编程思想(开发模式),全称:Object Relation Mapper(对象关系映射)
是为了解决面向对象与面向关系型数据库不匹配现象,通过一个配置文件把面向对象与面向关系型数据库关联起来

  • 类 — 表
  • 属性 — 字段
  • 对象 — 记录

结构 描述 hibernate.cfg.xml 是 Hibernate 的主配置文件,用来配置数据库连接信息与 Hibernate 相关参数 XXX.hbm.xml 类与表之间的映射文件,一个类对应一个表,一个属性对应一个字段 实体类 用于封装数据库的表,一定要实现 Serializable 接口 Hibernate API 用于读取并解析配置文件,然后根据映射关系生成 SQL 语句,间接操作数据库

注:SessionFactory 是一个重量级对象,创建销毁特别耗资源,应用程序创建一次,关闭一次

注:建议手动创建表,不要让 Hibernate 生成表格, hibernate.hbm2ddl.auto配置成为 update

接口 描述 Configuration 读取并解析配置文件,然后创建 SessionFactory(是一个类) SessionFactory 代表一个数据库,一个 SessionFactory 对应一个数据库,用于创建 Session(是一个接口) Session 程序与数据库的一次会话,用于数据库表的增删改查(是一个接口) Transaction 事务管理(是一个接口) Query 与 Criteria 用于数据查询(是一个接口)

查询效率由高到低排列:主键查询 > SQL 查询 > HQL 查询 > QBC 查询

SessionFactory 级别的缓存(需要配置)

Hibernate 二级缓存需要配置,在同一 SessionFactory 范围内,查询同一个对象多次,只会发送一条 SQL 语句(只会去数据库中查询一次),后面每次查询都是从二级缓存中去取数据

​ Hibernate 操作对象时,可以把对象看成三种状态::瞬时态,持久台,游离态/托管态

​ 如果两张表之间有关系,Hibernate 允许我们将关系提取出来,并且映射的配置文件中,在对一个表的增删改查操作,Hibernate 通过这个映射关系,间接的操作另一张表的增删改查,这两个表的关系配置称为关系映射

  • 延迟加载(对于关联属性,Hibernate 默认采用的是延迟加载,查询一端数据,不会关联出另一端数据)
lazy="proxy/true"   默认方式,采用懒加载
lazy="false"        立即加载,关联的表数据会同时查询出来
  • 连接查询
fetch="select"  默认方式,使用多条 SQL 语句查询
fetch="join"    使用连接查询,一条 SQL 语句完成查询,使用此属性懒加载失效
  • join 查询
String hql = "from Student s left join fetch s.cla";  左外连接
String hql = "from Student s inner join fetch s.cla";  内连接
  • 什么是级联操作? 在对一张表做增删改操作时,关联的另一张表也做增删改操作,称为级联操作
  • 如何设置级联操作? 在映射文件中,关联映射配置 cascade 属性,用这个属性定义级联操作
  • cascade取值如下:

取值方式 描述 none 默认方式,不支持级联 all 支持增删改 save-update 支持增,改 delete 支持删

​ 主键一对一:包装两个标段主键相同

​ 外键一对一:在任意一端增加一个字段(外键字段)指向另一端的主键,并且这个字段有唯一约束(不能重复)

​ 学生与档案一对一,在学生表中增加一个字段指向档案表的主键,外键保证唯一性

​ 如果两张表的关系是多对多,必然产生一张中间表,中间表只有两个字段,分别为两张表的外键字段,这两个外键字段组合成复合主键

​ 一个班级由多个老师教学,一个老师可以教多个班级


Original: https://www.cnblogs.com/xiqingbo/p/java-24.html
Author: Schieber
Title: Hibernate 学习笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598690/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球