对象-关系映像:Object Relational Mapping 简称 ORM
含义:用来把域模型表示的对象映像到关系数据模型对应的数据库中
面向对象 | 面向关系 |
---|---|
类 | 表 |
属性 | 列 |
对象 | 记录 |
Hibernate
1.在分层体系结构中Hibernate位于持久层,是完成对象持久化的持久层框架;
2.Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架;
3.Hibernate是对JDBC API的封装,是JDBC轻量级封装框架。
优点
1.实现了ORM,使用java程序员可以方便的运用面向对象的编程思想来操作关系型数据库;
2.对JDBC的封装,增强代码的重用性,简化了代码,提高编程效率;
3.对JDBC的轻量级封装,必要时Java程序员可以绕过Hibernate直接访问JDBC API;
4.不仅可以应用在独立的Java程序中,还可以应用在Java Web项目中,可以和多种Web服务器集成,并支持多种数据库平台。
项目步骤
1.安装Eclipse mysql
2.下载hibernate
3. 新建eclipse项目
4. 引入hibernate及其jar包
5. 引入mysql数据库驱动包
6. 编写hibernate配置文件
6. 创建java持久化类XXX.java
7. 编写持久化类的映射配置文件XXX.hbm.xml
8. 使用hibernate API完成对象的持久化
持久化类:是指实例需要被hibernate持久化到数据库中的实体类
1.private类型属性;
2.public类型的set和get方法
3.public或protected类型的无参构造方法
class元素用于指定类和表之间的映射
name属性设定类名(包含路径)
table属性设定表名,默认以类名作为表名
class元素包含一个id子元素以及多个property子元素
id(数据库的主键)子元素设定持久类的OID和表的主键的映射关系。
column-指定表字段的名称;
generator-元素指定OID的生成器
generator-class可配置:
increment 采用hibernate数值递增的方式
identity 采用数据提供的自增长方式
assigned 主键由应用逻辑产生
OID(对象标识符,标识对象的唯一性)是关系数据库表中的主键(代理主键)在java对象模型中的等价物;可维持java持久类和数据表的对应关系
property 子元素设定类的其他属性和表的字段的映射关系。
name – 对应类的属性名称;
type – 指定属性的类型;
column – 指定表字段的名称;
not-null – 指定属性是否允许为空。
一对一
通过one-to-one 元素配置。
constrained 属性为 true,表明 当前 表 ID 为外键,参照主表。
外键表实体类配置文件中 OID 使用 foreign 生成策略。
单向一对多
在原有class后
set元素属性:
name属性:指定映射的属性名;
cascade级联操作属性:save-update,delete,all,none;
set元素的子元素:
key元素:column属性设定所关联类对应表的外键
one-to-many元素:class属性设定所关联的类
双向一对多
many-to-one元素的属性:
name 属性:指定需映射的属性名;
column 属性:指定ORDER中的外键列名;
class 属性:指定所关联的类型。
多对多
set name=“实体类集合名” table=“多对多关联关系中间表”
inverse=“主控方:false ;被控方true”
key column=“定义名字 方便关联”
many-to-many class=“关联类” column=“关联key column名”
Mapping-recourse与Mapping-class的区别
recourse:持久化类配置文件路径 用/来表示;
class:表示用注解 的文件路径 用. 来表示;
hibernate中的实体对象的四种状态
Transient(临时状态) : 刚刚被 new 关键字创建,还没有被持久化,不在Session的缓存中。
Persistent(持久化状态) : 已经被持久化,并加入到 Session 缓存中。
Detached(游离状态) : 已经被持久化,但不再处于 Session 缓存中。
Removed(删除状态) : Session 已经计划将其从数据库删除,并且不再处于 Session 缓存中
session.get()和load()方法:
不同点:get()会抛出异常;load()返回null;
Session.get()立即检索;Session.load()延迟检索;
缓存介于应用程序和永久性存储源之间;为了降低应用程序和永久性存储源之间的效率;从而提高应用的运行速率。
缓存清理时间点:
transaction.commit()先清理缓存,在提交事务;
显式调用Session.flush()会清理缓存
Session缓存的作用:
1.减少数据库访问次数,提高访问效率;
2.缓存对象与数据库相关记录的同步;
HQL检索(Hibernate Query Language)
from关键字后面是类名不是数据库表名,类名区分大小写;
Query query = session.createQuery(hql);
query 返回结果方法:
list()返回list类型的查询结果;
uniqueResult()返回单个对象;
分页查询
setFirstResult(int firstResult)设定从哪个对象开始检索
setMaxResult(int maxResult)设定一次检索的数目
立即检索:映射文件中class元素lazy设置为false 反之延迟检索