三大框架-Hibernate
概念 持久化框架 把对象保存到数据库中,对数据的CURD操作
ORM框架 ORM对象关系映射 类<->表
属性<->字段
对象<->表中的记录
实现方法 创建持久化类
描述映射关系 对象关系映射文件,使用注解
环境搭建 安装 eclipse 的 HiberTools 插件 带有配置文件的向导
支持正项工程和反向工程
在项目中引入 Hibernate 的 jar 包
在项目中引入数据库驱动的 jar 包
配置文件 默认名 hibernate.cfg.xml
放在src目录下
根节点<hibernate-configuration>
子节点 <session-factory> 数据库连接
<property name="属性名">属性值</property>
hibernate.connection.driver_class 数据库驱动类属性
hibernate.connection.password 数据库密码
hibernate.connection.url 数据库连接
hibernate.connection.username 数据用户名
hibernate.default_schema 数据库方案,只针对oracle(配置为全大写的用户名)
hibernate.dialect 数据库方言 (org.hibernate.dialect.Oracle10gDialect)
调试选项 hibernate.show_sql 是否显示SQL语句
hibernate.format_sql 是否格式化SQL语句
自动建表方式 hibernate.hbm2ddl.auto update(表不存在就创建新表)
(增加属性就增加字段)
(减少属性不减少字段)
create(先删表和序列,重新创建)
(是用于重新初始化系统)
creat-drop(先删除表和序列,
重新创建,用完之后删除)
validate(检查映射关系和表是否一直)
(不一直就报错)
<mapping resource="包名/映射文件名.hbm.xml"/>
注册映射文件
API Configuration 管理和加载配置信息
默认加载 hibernate.cfg.xml
new Configuration().configure()
ServiceRegistry 4.0之后新增,所有基于 hibernate 的配置或服务都必须向其注册才能生效
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
SessionFactory 生成 session 的类,相当于数据库连接
比较耗资源,一般一个应用创建一个
SessionFactory sf = cfg.buildSessionFactory(sr);
session 和数据库交互操作的单线程对象
管理所有持久化类的实例
Session se = sf.openSession();
Transaction 相当于数据库事务的概念
Transaction ts = se.beginTransaction();
所有持久化操作包括查询,都必须放在事务中进行
ts.commit(); 提交事务
ts.rollback(); 回滚事务
ORM 持久化类 实体类(符合pojo结构)
必须有无参的构造方法(用来反射)
提供一个表示属性(用来对应主键字段)
不能使final类 如果是final累就不能使用load()进行延迟加载
映射文件 一般持久化类对应一个映射文件
一般命名方式是 类名.hbm.xml
根节点<hibernate-mapping> <class name="持久化类全路径" table="表名">
<property name="属性名" type="数据类型">
<column name="字段名" />
</property>
class的属性 id标签(主键用这个标签) column同property标签
generator class=“”(主键生成策略)
(assigned 自然主键,由程序负责定义)
(odentity 数据库自动增长,要求底层数据库支持自动增长字段,数据类型要为整形)
(sequence 序列,要求底层数据库支持序列,数据库类型要为整形)
(hilo 适合所有数据库-需要在数据库中建表保存计算次数,按照high/low算法生成随机数,数据类型要为整形)
(native 根据底层数据库类型自动选择上面三种之一,适用于跨平台项目开发,数据类型必须是整形)
(guid 全局唯一标示,和数据库平台无关,数据库类型要为字符串类型)
property标签 name=“属性名”
length=“长度”
not-null=“是否为空” (true为空,false非空)
sql-type=“数据库的数据类型”
unique=“唯一约束”
default=“默认值”
多对一
<many-to-one name="属性名" class=“持久化类的全路径”> column同property标签 通过字段的值查找对应的主键表的数据
一对多(和多对一不能同时配置)
<set name="属性名" table="表名" inverse="true">
<key>
<column name="TNO"></column>
<key>
<one-to-many class="持久化类的全路径" />
set内的属性 inverse="true"反转控制方向可以提高效率
级联操作类型cascade= none 默认不级联
delete 级联删除
save-update 级联保存和更新
all 级联全部操作
session get(持久化类.class,主键值) 立即加载数据,加载前检查一级缓存,如果数据不存在就返回空
load(持久化类.class.主键值) 延时加载数据,当使用时才加载,加载前检查一级缓存,如果数据不存在就抛出异常,要求持久化类是非final类
状态 持久化状态 get()或load()调用之后得到的实例
通过save(),update(),saveorupdate()调用之后
临时状态 实例化之后,save之前是临时状态
删除状态 delete()之后是删除状态
游离状态 关闭了session之后是游离状态
save(持久化类的实例) 添加数据到数据库,并把实例转为持久化状态,会根据主键策略生成策略覆盖OID的属性
update(持久化类的实例) 执行数据修改,如果持久化状态的实例属性发生变化,事务在提交前自动执行update
saveOrUpdate(持久化类的实例) 根据OID属性是否为空自动执行save或update方法
delete(持久化类的实例) 执行删除,使实例进入删除状态
HQL 一种面向对象的查询语言 类似SQL查询语句,基于持久化类实现查询,类名和属性名严格区分大小写
Query 负责执行HQL查询的类(支持方法链调用)
方法 1.创建 Query qu = session的实例.createQuery("HQL语句")
2.条件参数设置 (?占位符 setXXX(位置索引从0开始,值))(:参数名 setXXX(参数名,值))
3.得到查询数据集合Lise(返回List<持久化类名>)
分页查询 setFirstResult(开始行号)(默认开始行号从0开始)
每页的开始行号=页码-1*每页行数
分组和聚合函数 使用List<Object>或List<Object[]>接收数据集合(根据查询结果选择)
反向工程 表要有主键(最好是单主键)
步骤 1.创建Hibernate Console Configuration 目的只创建数据库连接,一般是选择项目的hintrnate.cfg.xml获取连接信息
2.创建反向配置文件Hibernate.reveng 目的是确定要反向的表
3.配置CodeGeneration并运行 链接数据库的Console Configuration
反向配置文件.reveng.xml
输出的项目目录 一般是项目的SRC目录
要生成的包名
要导出的文件类型 持久化类 和 映射文件
4.检查生成的结果 检查持久化类
检查映射文件 一对多和多对一只能同时存在一个
5.把映射文件注册到主配置文件中