hibernate(持久化)
Hibernate 是数据访问层(Dao层),就是把数据存入到数据库中,称为持久化。
Hibernate 对 JDBC 进行了封装,针对数据访问层提出面向对象的思想,操作对象间接的操作数据库中的表,自动生成 SQL 语句,可以简化数据访问层的代码,提高开发效率。
- 优点:
- 使用 JDBC 遇到的问题:
- 代码中存在大量的 SQL 语句
- 查询结果需要手动封装到 Model
- SQL 语句中存储大量的
?
,需要手动赋值 - SQL 语句根据不同的数据库,有不同的函数,如果更换数据库,需要大量更改 SQL 语句,针对数据库移植性差
- 使用 Hibernate 可以解决以上问题:
- Hibernate 操作对象自动生成 SQL 语句
- 查询结果自动赋值给 Model 类
- 自动赋值
- 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/
转载文章受原作者版权保护。转载请注明原作者出处!