Hibernate
一、入门及基本介绍
1.1 - Hibernate 概述
1.1.1 - 什么使框架
- 当我们写程序时,使用框架之后,框架帮我们实现一部分功能
- 使用框架的好处:少写一部分代码,实现功能
1.1.2 - 什么是 Hibernate
- 应用于
JavaEE
三层结构中的 DAO
层
- 适用于对数据库
CRUD
操作,使用 Hibernate
实现 CRUD
操作,底层代码就是 JDBC
- 开源的轻量级框架
1.1.3 - 什么是 ORM
Object Relational Database-Mapping
对象关系映射
- 让实体类和数据库进行一一对应
- 不需要操作表,而是操作表对应的实体类对象
1.2 - 开发环境搭建
2.2.4.delete(obj)
1 2
| Object obj = session.get( Object.class, id ); session.delete(obj);
|
2.2.5.saveOrUpdate()
- 对瞬时态是
save()
- 对持久态是
update()
- 对托管态是
update()
2.2.6.Query
- 不需要写
sql
语句,但是要写 hql
语句
hql (Hibernate Query Language)
sql
操作的是表和字段
hql
操作的是实体类和属性
from 实体类名称
– 查询所有
1 2
| Query query = session.createQuery("from User"); List<User> list = query.list();
|
2.2.7.Criteria
1 2
| Criteria cta = session.createCreteria(obj.class); List<obj> list cta.list();
|
2.2.8.SQLQuery
1 2 3 4 5 6 7 8
| SQLQuery sql = session.createSQLQuery("SQL语句"); List list = sql.list();
SQLQuery sql = session.createSQLQuery("SQL语句"); sql.addEntity(obj.class); List<obj> list = sql.list();
|
2.3.实体类状态
2.3.1.瞬时态
- 对象里没有
id
值,对象与 session
没有关联
2.3.2.持久态
- 对象里面有
id
值,对象与 session
有关联
2.3.3.托管态
- 对象里面有
id
值,对象与 session
没有关联
三、Hibernate 一级缓存
3.1.什么是缓存
- 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高
- 把数据存到内存里面,不需要使用流方式,可以直接读取内存中的数据
- 把数据放到内存,提供读取效率
3.2.Hibernate 缓存
Hibernate
框架中提供很多优化方式,Hibernate
缓存就是一个优化方式
3.2.1.一级缓存
- 默认打开
- 有使用范围(从
session
创建到 session
关闭)
- 存储数据必须是持久态
- 有一个快照区
3.2.2.二级缓存
- 已经不用了
- 默认不打开
- 范围是整个
sessionFactory
范围
四、事务的规范写法
1 2 3 4 5 6 7 8
| try { } catch() { } finally { }
|
五、绑定 Session
1 2 3 4
| sessionFactory.getCurrentSession();
- 需要配置 <property name="hibernate.current_session_context_class">thread</property>
|
当通过这种方式获取 session
时,线程结束,session
会自动关闭
六、多表操作
6.1.表与表之间关系
6.1.1.一对多
- 比如:分类和商品的关系,一个分类里面有多个商品,一个商品只能属于一个分类
6.1.2.多对多
- 比如:订单和商品关系,一个订单里有多个商品,一个商品属于多个订单
6.2.一对多操作
6.2.1.映射配置
创建实体类
在实体类中体现相互的关系·
写配置文件
1 2 3 4 5 6
| # 一对多中的多
<set name="属性名" cascade="save-update,delete"> <key column="外键名"/> <on-to-many class="被引用实体类全路径"/> </set>
|
1 2 3
| # 一对多中的一
<many-to-one name="set的属性名" class="引用实体类的全路径" cloumn="和上面的外键名一致"/>
|
6.2.2.级联保存
- 把一加入多的
Set
中
- 把多加入一的属性中
- 先保存多,再保存一

6.2.3.级联删除

6.3.多对多操作
6.3.1.映射配置
1 2 3 4
| <set name="Set属性名" table="第三张表名" cascade="save-update"> <key column="在第三张表的外键名"/> <many-to-many class="另一个表对应的实体类全路径" column="另一张表在第三张表的外键名"/> </set>
|
6.3.2.级联保存
6.3.3.级联删除
- 只要从数据库获取某一方,再进行删除即可,但该删除不仅会删除第三张表的对应关系,连同另一张表对应的数据也会被删
七、查询
7.1.对象导航查询
- 根据
id
查询某个客户,再查询这个客户里面所有联系人
过程
1 2
| Object1 obj1 = session.get(Object1.class, id); Set<Object2> obj2 = obj1.getobj2();
|
7.2.OID 查询
过程
1
| Object obj = session.get(Object.class, id);
|
7.3.HQL 查询
Query
对象,写 HQL
语句实现查询
Hibernate Query Language
提供一种查询语言,和普通 SQL
有区别
7.3.1.查询所有
1 2 3 4
| Query query = session.createQuery("from 实体类"); List<Object> list = query.list();
for(Object obj : list) {}
|
7.3.2.条件查询
1 2 3 4 5 6 7
| Query query = session.createQuery(from 实体类 where 实体类属性 = ? and ...); query.setParameter(index, value); List<Object> list = query.list();
for(Object obj : list) {}
|
1 2 3 4 5 6 7 8
| Query query = session.createQuery(from 实体类 where 实体类属性 like ? and ...); query.setParameter(index, value); List<Object> list = query.list();
for(Object obj : list) {}
|
7.3.3.排序查询
1 2 3 4 5 6
| Query query = session.createQuery(from 实体类 order by 实体类属性 asc/desc); List<Object> list = query.list();
for(Object obj : list) {}
|
7.3.4.分页查询
1 2 3 4 5 6 7 8
| Query query = session.createQuery(from 实体类); query.setFirstResult(start); query.setMaxResult(max); List<Object> list = query.list();
for(Object obj : list) {}
|
7.3.5.投影查询
1 2 3 4 5 6 7
| Query query = session.createQuery(select 属性名1... from 实体类); query.setParameter(index, value); List<Object> list = query.list();
for(Object obj : list) {}
|
7.3.6.聚集函数使用
1 2 3 4
| Query query = session.createQuery(select 函数() from 实体类); Object obj = query.uniqueResult();
|