一.Hibernate简介
1.什么是Hibernate
- 面向对象的数据访问层框架
- 功能类似于MyBatis
2.与MyBatis的区别
1)MyBatis
- 面向SQL: 自己写SQL
- 对jdbc封装的较轻,更灵活
2)Hibernate
- 面向对象: 自动生成SQL
- 对jdbc封装的较重,对基本的CRUD操作更方便
3.Hibernate使用步骤
- 导包: hibernate-core,javassist,jdbc
- 配置主配置文件: hibernate.cfg.xml
- 开发实体类
- 配置映射关系文件: *.hbm.xml
- 调用Hibernate API,执行CRUD操作
二.Hibernate基础语法
1.ID生成方式
sequence: 根据序列生成ID,用于oracle
<generator class="sequence"> <param name="sequence">序列名</param> </generator>
identity: 自动生成ID,用于其他数据库
<generator class="identity"></generator>
native: sequence和identity二选一
<generator class="native"> <param name="sequence">序列名</param> </generator>
2.创建连接
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
3.根据ID查询
session.get(Emp.class, 1)
session.load(Emp.class, 1)
4.增删改
Session session = null;
Transaction tx = null;
try {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
session.save(e);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
} finally {
session.close();
}
5.HQL查询
String hql = "from Emp where empno>3";
Query query = session.createQuery(hql);
List<Emp> list = query.list();
三.Hibernate高级特性
1.关联映射
1)什么是关联映射
- 多张表之间有关联关系
- 在映射文件中配置好它们的关系
- Hibernate会依据此关系,在访问一张表时,自动访问其关联的表
2)有哪些关联映射
- 一对多关联
- 多对一关联
- 多对多关联
- 一对一关联
3)有哪些关联操作
- 增,删,改,查
4)案例:一对多关联查询(部门与员工)
在部门对象中增加集合属性,以存储关联的员工数据
private Set<Emp> emps; public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; }
在映射文件中配置此集合属性
<set name="emps" lazy="false"> <key column="deptno"></key> <one-to-many class="cn.tedu.entity.Emp"/> </set>
查询部门,看看集合属性的值
Dept dept = (Dept) session.get(Dept.class, 1); Set<Emp> set = dept.getEmps(); System.out.println(set);
对应关系
2.延迟加载
1)什么是延迟加载
- 推迟数据加载的时机,什么时候用,就什么时候加载
2)哪些地方采用了延迟加载机制(面试题)
- 关联查询时,对关联数据的加载
- session.load()
- query.iterate()
3)延迟加载的实现原理
- CGLIB动态代理技术
4)延迟加载的作用
- 什么时候使用数据,就什么时候查询
- 如果用户没有使用该数据,则不查询,减少一些查询次数,减少开销
3.一级缓存
1)什么是一级缓存
- 也叫session级缓存
- 只能缓存实体对象数据
- 是在session对象中缓存数据,该数据可以被使用同一个session的其它查询复用
2)如何使用一级缓存
- 一级缓存默认开启,且不可关闭
- 直接使用session查询数据,数据会自动缓存到此session对象上
3)如何从一级缓存中移除数据
- 移除一个数据: session.evict(obj)
- 移除所有数据: session.clear()
4.对象状态
1)Hibernate对象的状态
- Hibernate对象有3种状态: 临时态、持久态、游离态
- Hibernate通过状态来管理对象,不同状态的对象有不同的处理机制
2)三种状态的关系
3)每种状态的特征
临时态
- 临时态对象未经过持久化,未与session关联
- 临时态对象可以被垃圾回收
持久态
- 持久态对象进行了持久化,已与session关联
- 持久态对象存在与session(一级)缓存中
- 持久态对象能自动更新到数据库,更新是在调用session.flush()时
commit()的底层调用了session.flush()
游离态
- 游离态对象进行过持久化,但已与session解除了关联
- 游离态对象可以被垃圾回收
5.二级缓存
1)什么是二级缓存
- 也叫SessionFactory级缓存
- 只能缓存对象数据
- 是在SessionFactory中缓存数据,该数据可以由所有session共用
2)二级缓存使用步骤
导包
- 搜ehcache
开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">
包名.EhcacheProvider
</property>
指定哪个对象可以使用二级缓存
在此对象的映射文件内
<cache usage="read-only"/>
注意
- 一定要保证只创建一个SessionFactory
补充一:jsp处理请求和Ajax处理请求的区别?
1.使用jsp处理请求的流程
2.使用Ajax处理请求的流程
3.归纳
- 后者彻底将HTML和Java解耦,更利于团队开发及配合