上次讲了一下Hibernate的简介和搭建,这次就说一下比较细一些的东西。
Hibernate的核心组件:
在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层。它通过配置文件和映射文件把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
除配置文件,映射文件和持久化类外,Hibernate的核心组件包括以下几部分:
a)Configuration类:用来读取Hibernate配置文件,并生成SessionFactory对象。
b)SessionFactory接口:产生Session实例工厂。
c)Session接口:用来操作PO。它有get(),delete(),load(),save(),update()和等方法用来对PO进行加载,保存,删除及更新等操作。它是Hibernate的核心接口。
d)Query接口:用来对PO进行查询操。它可以从Session的createQuery()方法生成。
e)Transaction接口:用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。
Persistent Object(持久化对象):
持久化对象可以是普通的Javabeans,惟一特殊的是它们与(仅一个)Session相关联。
JavaBeans在Hibernate中存在三种状态:
1.临时状态(transient):当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联关系时,那么这个JavaBeans对象就称为临时对象(Transient Object)。
2.持久化状态(persistent):当一个JavaBean对象与一个Session相关联时,就变成持久化对象(Persistent Object)
3.脱管状态(detached):在这个Session被关闭的同时,这个对象也会脱离持久化状态,就变成脱管状态(Detached Object),可以被应用程序的任何层自由使用
Hibernate的运行过程:
- 应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
- 然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;
- 可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;
- 在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;
- 如果没有异常,Transaction对象将 提交这些操作结果到数据库中。
Hibernate的运行过程如下图:
Java Web 三层架构
- Web层 Struts框架
- Service层 spring框架
- Dao层 hibernate 框架
MVC思想
- M 模型
- V 视图
- C 控制器
Hibetnate 核心API详解:
Configuraction
到src 下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)
Sessionfactory(重点)
1. 使用configuration对象创建sessionFactory对象,
创建sessionFactory对象过程中做事情
根据核心配置文件中,有数据库配置,有映射文件部分,到数据库里面数据映射关系把表创建
<property name="hibernate.hbm2ddl.auto">update</property>
2. 创建sessionFactory过程中,这个过程特别耗资源的
在hibernate操作中,建议一个项目一般创建一个sessionFactory对象
3.具体实现
写工具类,写静态代码块实现
静态代码块在类加载时候执行,执行一次
Session(重点)
- Session类似于JDBC中的counnection
- 调用session里面不同的方法实现Crud操作
1)添加 save方法
2)修改update方法
3)删除delete 方法
4)根据id查询get方法
3. Session对象单线程对象
Session对象不能共用,只能自己使用
Transaction
1. 事务约束
transaction = session.beginTransaction();
2. 事务提交和回滚方法
transaction.commit();
transaction.rollback();
Hibernate对象的状态:
瞬时状态:一个对象既没有id也没有和session绑定
持久化状态:一个对象有id也和session绑定在一起
游离状态:有id没有和session绑定
Hibernate提供的四个crud不是增删改查的意思,而是改变对象的状态从而达到修改数据库的目的。
SaveOrUpdate
持久化状态的对象,随着对象的数据更改,数据库会自动更新
Hibernate 查询
hql
hql是hibernate的独家语言
hql (Hibernate Query Language) 的特点:面向对象查询,在查询时不会出现数据库里的东西。
查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。HQL查询在整个Hibernate实体操作体系中站核心地位
criteria
criteria的用法:
QBE (Query By Example):
QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成
session = this.getSession();
Criteria cri = session.createCriteria(JdItemSerialnumber.class);
Criterion cron = Restrictions.like("customer",name);
cri.add(cron);
list = cri.list();
Criteria cri = session.createCriteria(Student.class);
cri.add(Example.create(s)); //s是一个Student对象
list cri.list();
使用session创建CriteriaBuilder
使用工厂类 创建CriteriaQuery
制定根元素
增加条件
封装到query
把query传给session.createQuery(query)
得到结果集
Sql原生态的查询方式:
应用的环境
Hql 推荐使用 适用于一些简单的查询
Criteria 推荐使用 只适用于单表查询
Sql 不推荐 非常非常复杂的查询,推荐使用sql
事务:
事物的出现就是为了解决事务的安全。
同时对两张表进行操作,当操作完第一张表,然后出现了异常导致第二张表的数据出现了问题,这种情况就叫做事务安全。
事物的特性:
- 原子性
- 一致性
- 持久性
- 隔离性
由于有了事务,就又有了问题叫做事务线程安全(事务并发问题)。
- 脏读数据
- 不可重复读
- 脏读(幻读)
为了解决以上三个问题,事务隔离:隔离性 四种级别
- 读未提交 哪种都不解决(效率最高,最不安全)1
- 读已提交 脏读 2
- 可重复读 脏读和不可重复读(最常用的Mysql默认的级别就是4)
- 串行化 所有的问题都解决(效率最低)
Hibernate中事务的应用:
事务应该在service层开启和提交或者回滚。
事物的开启需要 session
获得session有两种方式:openSession 每次打开都是一个新的
GeiCurrentSession 线程绑定的session
Service层有session
Dao也层有session 这两个session必须保证是同一个session
这样事务的提交才能起到作用
Hibernate框架中所有增删改 都必须提交事务性才能最终修改到数据库
所以在增删改操作中必须使用getCurrentSession
使用currentSession必须在配置文件中加入属性
<property name="hibernate.current_session_context_class">thread</property>
表与表之间的关系:
1对1关系
1对多关系
多对多关系
Hibernate维护一对多关系:
在实体类中加上对应的属性
职工类 加入一个 企业类型属性
企业类 加入职工集合 set
在配置文件中增加以下代码:
多的一方
<many-to-one name="enterprise" class="Enterprise" column="enterpriseId"></many-to-one>
一的一方
<set name="employees">
<key column="enterpriseId"></key>
<one-to-many class="cn.hd.bean.Employee"></one-to-many>
</set>
在代码中维护关系时
要为两方都添加对应的属性
级联操作:
Cascade
取值为:delate create save-update all
加在多的一方 在代码中就要使用多的一方维护
加在一的一方 就要用一的一方维护
关系维护:
inserse true 就是放弃维护关系
让一的放弃(字段多为一方)
多对多关系:
Hibernate的查询方式:
crud
Crud:增查改删的英文首字母
save:保存
delete: 删除
update: 更新
get: 查询
get方法 需要主键和class文件
hql
比较常见
criteria
适用于单表
sql
- 适用于复杂查询
- 对象导航查询
分页查询
排序查询
基本条件查询
模糊查询
多表查询:
1. 笛卡尔积
A 集合 B 集合
A集合中和B集合中所欲的元素,自由组合生成新的数据
2. 内连接
隐式内连接
SELECT * from t_employee,t_enterprise WHERE t_employee.enterpriseId=t_enterprise.id;
显式内连接
SELECT * from t_employee t1 INNER JOIN t_enterprise t2 on t1.enterpriseId = t2.id;
3.外链接
右外连接
左外链接和右外连接没什么太大区别
Hibernate 实现多表查询
迫切内连接:
内连接:
区别就是: 结果的封装是一个数组(普通) 一个对象(迫切)
检索策略:
Hibernate缓存技术
Hibernate 默认开启一级
二级缓存(废弃) redis