框架:软件的半成品,已经完成了部分功能
Hibernate:是一个轻量级的JDBC,我们可以使用Hibernate来完成原来我们使用JDBC完成的操作,也就是与数据库的交互操作。它是在Dao层去使用的,Hibernate就是一个持久层的ORM框架。
ORM(Object Relation Mapping):对象关系映射,指的是将一个Java中的对象与关系型数据库的表建立一种映射关系,从而操作对象就可以操作数据库中的表。
持久化类:
指其实例需要被Hibernate持久化到数据库中的类即实体类
private 类型属性;
public 类型的 setter 和 getter 方法;
public 或 protected 类型的无参数的构造方法。
描述持久化类与数据库表之间的对应关系。
一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。
目录结构:
documentation:存放在Hibernate的相关文件和APl
lib:存放Hibernate编译和运行所依赖的Jar包,其子目录required下包含了运行Hibernate项目必须的Jar包
project:存放Hibernate各种相关的源代码,project目录下的ect目录非常重要,它里面有一些关于Hibernate的配置信息
流程:
1.创建数据库
2.创建实体类
3.创建Hibernate的配置文件:{
映射文件配置文件:xxx.hbm.xml
核心配置文件:hibernate.cfg.xm(包含了链接数据库的相关信息和Hibernate的相关配置信息)
}
执行工作原理:
1.通过Configuration().configuration;读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的《mappingresource="com/xx/User.hbm.xml/》读取解析映射信息
3.通过config.buildSessionFactory();//得到SessionFactory
4.SessionFactory.openSession();//得到Session
5.Session.bginFransaction();//开启事务
6.Persistent operate;
7.Session//提交事务
8.关闭Session;
9.关闭SessionFactory;
“xxx.hbm.xml”
《class》标签:
name属性:类的全路径
table属性:映射到数据库里面的那个表的名称,如果表名与类名一致,table属性可省略
catalog:数据库名,可省略,若省略,则参考核心配置文件中的主键的对应关系
《id》标签:
该标签必须存在,该标签用来建立类中的id属性与表中的主键的对应关系
name属性:类中的属性名称
column:表中主键名称,类中的属性名和表名的字段名(主键名)如果一致,column可省略
length:字段长度,若忽略不写,且你的表是自动创建这种自动创建这种方案,那么length的默认长度是255
type:指定类型可不写,Hibernate自行转换
《property》标题
该标签是用来建立类中的普通属性与表中非主键字段的对应关系
name属性:类中的属性名称
column:表中主键名称,类中的属性名和表名的字段名(主键名)如果一致,column可省略
length:字段长度,若忽略不写,且你的表是自动创建这种自动创建这种方案,那么length的默认长度是255
type:指定类型可不写,Hibernate自行转换
not–null:设置是否非空
unique:设置唯一
核心配型文件分为:
1.必须配置:驱动类,url路径,用户名,密码 ,方言
2.可选配置:
显示sql :hibernate.show_sql
格式化 sql:hibernate.format_sql
自动建表:hibernate.hbm2ddl.auto
none:不适用hibernate的自动建表
creat:如果数据库中已经有表,删除原有表
create–drop:如果已有表,删除原有表,执行操作,删除这个表;如果没表,则新建一个,使用完后删除表 (常用于测试)
*update:如果数据库中有表,则用原表,若无,则创建新表(更新表结构)
*validate(校验):如果没有表,不会创建表,只会使用数据库原有的表,校验映射和表的结构
3.映射文件的引入:
引入映射文件的位置:《mappingresource="…"》
4.Hibernate核心配置方式:
属性文件:hibernate.properties(无法加载映射,需手动加载)
hibernate.connection.driver_class=“com.mysql.jdbc.Driver”
手动加载映射:configuration:addResource("…");
xml文件:hibernate.cfg.xml
Configuration: Hibernate的配置对象
configuration类的作业是对hibernate进行配置,以及对他进行启动。在hibernate的启动过程中configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然configuration类在整个hibernate项目中扮演一个很小的角色,但是他是启动hibernate时所遇到的第一个对象
作用:
1.加载核心配置文件
加载属性文件:Configuration cfg = new Configuration();
加载XML文件:
Configuration cfg = new Configuration().configuration();
2.加载映射:
属性文件需手动加载
SessionFactory: Session工厂
负责初始化,充当数据库存储代理,并负责创建Session,这里用到了工厂模式,且它不是轻量级,一个项目通常有一个SessionFactory,当需要操作多个数据库的时候,可以为灭个数据库指定一个SessionFactory。
作用:
1.SessionFactory内部维护了hibernate的连接池,是线程安全对象,且是重量级对象
2.配置连接池
3.抽取工具类
Session: 类似于Connection对象,是连接对象
Session接口负责执行被持久化对象的CRUD操作,Session对象是非线程安全的,同时,hibernate的Session不同于jsp中的HttpSession,这里使用的这个Session是指hibernate中的Session,而以后会将HttpSession对象称为用户Session
Session代表的是hibernate与数据库的连接对象
Session中的API方法:
1.保存方法: Serializable.Save(Obejct obj);
2.查询方法:
get(class c ,Serializable.id);
load(class c ,Serializable.id);
区别:
get:立即加载,执行到该行代码时候,就会发送SQL语句查询,返回的是真实对象本身,查询不到返回NULL;
load:延迟加载(懒加载),执行带该行代码不会发送SQL语句,当真正使用这个对象时候才会发送,查询返回的是代理对象,查询不到,返回objectNotFoundExcepton
3.修改法方法:
void update(Objet obj);
两种修改方法:1.直接创建对象进行修改(不设置来源,修改后来源会默认为NULL);
2.先查询,再修改(推荐);
4.删除方法:
void delete(Objet obj);
两种修改方法:1.直接创建对象进行删除
2.先查询,再删除(推荐);
Transaction: 事务对象
Transaction接口是一个可选API,可选择不用,取而代之的是hibernate设计者写的底层事务代码,Transaction接口是对实际事物实现的一个抽象,这些实现包括JDBC事务,JIA中的UserTransaction甚至是CORBA事务,之所以这样设计是能使用一个统一事务操作界面,使得自己项目可以再不同环境,容器之间方便的移植
Hibernate中管理事务的对象
方法:commit();提交
rollback();回滚
分类:自然主键和代理主键
自然主键:主键的本身就是表中的一个字段(实体中的一个属性)
例:创建一个人员表,每个人员都会有一个身份证号(唯一不可变),使用身份证号作为主键,则称为自然主键
代理主键:主键的本身不是表中的一个字段(实体中的一个属性)
例:创建一个人员表,每个人员都会有一个身份证号,没有使用人员中的身份证号,使用了其他一个不想关的字段(ID Sno),这种就称为代理主键
在实际开发中,尽量使用代理主键
**原因:**一旦自然主键参与到业务逻辑中,后期有可能需要修改源码。
策略:
开发中一般不允许用户手动设置主键,一般主键交由数据库设置。
1.increment:
该机制是 Hibernate 以递增的方式为OID赋值。
不依赖于底层数据库系统,适合所有数据库;
适合单独的 Hibernate 应用使用,不适合在集群情况下使用。
【(发送Select max(id)from表),查询出表中的最大数值id+1,作为下一条记录主键】
2.identity :
该机制依赖于底层数据库,需要数据库支持自动增长字段。
例如:MySQL、MSSQL、DB2、Sybase等。
【只会一直增长,例:数据库中有id 1,2,3条记录,当删除id=3的记录,然后在新添一条记录进来,该记录id为4】
3.assigned :
该机制是由外部程序负责生成 OID, Hibernate 不负责维护主键生成,与Hibernate和底层数据库都无关。
例如: Student 类没有定义 ID,而是以学号 studentNo 作为业务主键。
Hibernate提供两种映射一对一关联关系的方式
主键关联映射;
唯一外键关联映射。
外键必须设定 unique 约束。
1.主键关联映射 – 外键表(PERSON )
通过one-to-one 元素配置。
constrained 属性为 true,表明 PERSON 表 ID 为外键,参照主表(USER)。
外键表实体类配置文件中 OID 使用 foreign 生成策略。
2.唯一外键关联映射 - 主键表(PERSON)。
通过one-to-one 元素配置。
property-ref 属性,表明建立了从User到Person的一对一关联关系。