Hibernate基础
1.Hibernate的概念
Hibernate是数据库访问层的框架,对JDBC进行了封装,是针对数据库访问提出的面向对象的解决方案。
2.Hibernate的作用
使用Hibernate可以直接访问对象,Hibernate自动将此访问转换成SQL执行,从而达到间接访问数据库的目的,简化
了数据库访问层的代码开发。
3.Hibernate与JDBC对比
使用JDBC具有以下缺点
需要编写大量的SQL语句
需要给大量的?参数赋值
需要将ResultSet结构集转换成实体对象
SQL中包含特有函数,无法移植
使用Hibernate可以解决上述问题
自动生成SQL语句
自动给?参数赋值
自动将ResultSet结果集转换成实体对象
采用一致的方法对数据库操作,移植性好
4.Hibernate与MyBatis对比
共性
对JDBC进行了封装
采用ORM思想解决了Entity和数据库的映射问题
MyBatis
MyBatis采用SQL与Entity映射,对JDBC封装程度较轻
MyBatis自己写SQL,更具有灵活性
Hibernate
Hibernate采用数据库与Entity映射,对JDBC封装程度较重
Hibernate自动生成SQL,对于基本的操作,开发效率高
5.设计原理
Hibernate采用了ORM思想对JDBC进行了封装。
Hibernate框架是ORM思想的一种实现,解决了对象和数据库数据映射问题。
Hibernate提供一系列API,允许我们直接访问实体对象,然后其根据ORM映射关系,转换成SQL并且去执行,从而达到
访问数据库的目的。
6.ORM思想
ORM:Object Relation Mapping,即对象关系映射,指的是Java对象和关系数据库之间的映射。
ORM思想,就是将对象与数据库进行相互转换的思想,不同的框架/技术实现ORM的手段不同,但更多的是采用配置+反射的
方式来实现ORM。
7.主配置文件
Hibernate的主配置文件是一个XML文件,通常命名为hibernate.cfg.xml
该文件可以配置数据库连接参数,Hibernate框架参数,以及映射关系文件
8.实体类
9.映射关系文件
映射关系文件指定了实体类和数据表的对应关系,以及类中属性和表字段的关系。
Hibernate中使用XML文件来描述映射关系,文件通常命名为"实体类.hbm.xml",并放于实体类相同的路径下。
10.底层API
Hibernate提供了一系列的底层API,基于ORM思想,对数据库进行访问。
这些API主要是对映射关系文件的解析,根据解析出来的内容,动态生成SQL语句,自动将属性和字段映射。
11.Hibernate常用API
Configuration
负责加载主配置信息,同时也加载映射关系文件信息
SessionFactory
负责创建Session对象
Session
数据库连接会话,负责执行增删改操作
Transaction
负责事务控制
Query
负责执行特殊查询
12.对象的3种状态
在Hibernate中,可以把实体对象看成有3中状态,分别是
临时态、持久态、游离态。
13.临时态
转换
通过new创建的对象 为临时态
通过delete方法操作的对象将转变为临时态
特征
临时态的对象可以被垃圾回收
临时态的对象未进行过持久化,未与session关联
14.持久态
转换
通过get、load、list、iterate方法查询到的对象为持久态
通过save、update方法操作的对象转变为持久态
特征
持久态对象垃圾回收器不能回收
持久态的对象进行了持久化,与session相关联,实际上持久态对象存在于session缓存中,有session负责
管理
持久态对象的数据可以自动更新到数据库中,时机是在调用session.flush(),因此提交事务时也会出发同步,
可以理解为ts.commit=session.flush()+commit;
15.游离态
转换
通过session的evict、clear、close方法操作的对象会转变为游离态
特征
游离态的对象可以被垃圾回收
游离态的对象进行过持久化,但已与Session解除了关联
16.使用延迟加载需要注意的问题
采用具有延迟加载机制的操作,需要避免session提前关闭,避免在使用对象之前关闭session.
可以采用以下2种方案解决此问题
采用非延迟加载的查询方法,如query.get()、session.list()等。
在使用对象之后再关闭session.
17.Open session in view
在项目中,DAO只是负责查询出数据,而使用数据的时机是在JSP解析的过程中,因此要避免在DAO中关闭session,
或则说要在视图层保持session的开启
项目中解决这个问题的手段称之为Open session in view,即在视图层保持session的开启。
在不同的技术框架下,实现Open session in view的手段不同:
在Servlet中使用过滤器实现
在Struts2中使用拦截器实现
在Spring中使用AOP实现
18.延迟加载实现原理
采用延迟加载方法,返回的对象类型是Hibernate采用CGLIB技术在内存中动态生成的类型,该类型是原实体类的子类
,并在子类中重写了属性方法。
19.什么是多对一关联
如果有两张表具有多对一的关联,希望在使用Hibernate操作“多”方数据时,可以自动关联操作“-”方数据,
那么这种关联映射称之为多对一关联
20.多对一关联的作用
可以通过"多"来操作"一",包括
通过查询“多”,自动查询“一”。
通过新增/修改“多”,自动新增/修改“一”。
通过删除“多”,自动删除“一”。
注:
一般情况下,多对一关系中,“多”方数据从属于“一”,比如员工从属于部门。因此很少会根据“多”方数据
来增删改“一”方数据,更多的是对“一”方数据的关联查询。
21.明确关系字段
以service与account为例
service与account具有多对一关系,其关系字段是service.account_id
22.延迟加载
默认情况下,关联属性是采用延迟加载机制进行加载的。可以通过映射关系文件中关联属性配置标签中的lazy属性
进行修改:
lazy="true",表示采用延迟加载。
lazy="false",表示不采用延迟加载。
23.抓取策略
由于2张表具有关联关系,实际上可以通过一个连接查询一次性取出2张表的数据,避免进行2次查询。使用连接查询需要在
映射 关系文件中,关联属性标签上通过fetch属性进行设置,该设置通常称之为抓取策略
fetch="join",表示在查询时使用连接查询,一起把对方数据抓取过来
fetch="select",表示在查询时,不使用连接查询,是默认的情况
注:
当fetch="join"时,关联属性的延迟加载失效。
24.级联添加/修改
要实现级联添加/修改,需要在映射文件中的关联属性标签中,通过cascade属性进行设置,即
cascade="save-update"
25.级联删除
要实现级联删除,需要在映射关系文件中的关联属性标签中,通过cascade属性进行设置,即
cascade="delete"
注:
若想级联添加、修改、删除一起支持,需要将cascade属性设置为all,即
cascade="all"
26.控制反转
在一对多关联中,使用级联新增、删除时,当前操作的“-”方会试图维护关联字段。然而关联字段是在“多”方对象中,它会
自动维护这个字段,因此“一”方没有必要做这样的处理。
要想让“一”方放弃这个处理,需要在他的映射文件中,关联属性配置标签上,通过inverse属性设置
inverse="true",表示控制反转,即交出控制权,“一”方将不再维护关联字段
inverse="false",表示不控制反转,即不交出控制权,“一”方将维护关联字段,这是默认情况。
27.按条件查询
HQL中可以追加查询条件,条件中写的是属性名,之后在执行查询前用query对象为条件赋值。
28.查询一部分字段
使用HQL查询时,可以只查询表中的一部分字段,需要在from之前追加select语句,并且明确指定要查询的列对应的
属性值
注意
当查询一部分字段时,query.list()方法返回的集合中封装的不再是实体对象,而是一个Object[],数组中
的值与select语句后面的属性按顺序对应。
29.分页查询
Hibernate的分页查询不是通过HQL条件实现,而是通过API统一实现,需要通过API设置出分页的起点和每页显示的
行数,如
int from=(page-1)pageSize;
query.setFirstResult(from);
query.setMaxResults(pageSize);
30.多表联合查询
Hibernate支持使用HQL进行多表联合查询,不过HQL进行中写的是关联的对象及属性名。
Hibernate中有3种使用HQL实现关联查询的方式,分别是
对象方式关联
join方式关联
select子句关联
31.直接使用SQL查询
32.使用Criteria查询
Hibernate还支持使用一个Criteria的API来动态拼一个HQL
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。