1.Hibernate名片
Hibernate是一款工作在持久化层的大型、开源、免费的ORM框架。
2.持久化
①狭义:将数据从“
不可掉电”的设备上,保存到“
可以掉电”的设备上。
②广义:与数据库有关的一切操作都可以归纳到持久化范围内。
Create:保存。将数据保存到数据库表中。对应SQL的INSERT语句。
Retrieve:查询。将数据库从数据库中提取出来。对应SQL的SELECT语句。
在Hibernate中特指使用专门的查询API进行数据的查找工作,例如:HQL、QBC查询。
Update:更新。将数据库表中的数据更新为新的值。对应SQL的UPDATE语句。
Delete:删除。将数据库表中的数据删除。对应SQL的DELETE语句。
Load:加载。根据一个对象的OID属性,从数据库中查找一条唯一的记录返回。
OID属性[Object ID]:是Java对象中与数据库表中的主键相对应的属性。
3.ORM思想
①含义:Object Relationship Mapping对象关系映射
②对象:在Java程序中用于封装具体业务数据的类的对象,这样的对象通常称之为“
实体类”,往往是由
JavaBean的技术实现。例如:Book、User、Order、Person、Student等等。
③关系:
关系型数据库,现在主流的数据库都是关系型数据库:MySQL、Oracle等等。
④映射:在Java对象和数据库之间建立对应关系。
[1]JDBC中的映射关系
Java概念
|
数据库概念
|
类
|
表
|
属性
|
字段/列
|
对象
|
记录/行
|
[2]Hibernate支持映射关系
能够将Java类之间的关系,映射为数据库表之间的主外键关系。
Java类:User[1]→Order[n]
数据库表:ORDERS表中通过外键关联到USERS表的主键
⑤精髓:将对数据库的操作,转化为对Java对象的操作。
SQL方式
|
update USERS set user_name="Tom2015" where user_id=3;
|
ORM方式
|
User user = (User)session.get(User.class,3);
user.setUserName("Tom2015");
|
4.Hibernate特点
①将对数据库的操作,转化为对Java对象的操作,从而大大简化持久化层的开发。
②支持丰富的映射关系,对JDBC中基本的单表映射进行了很大程度的扩充。
③能够屏蔽不同数据库之间的差异,让程序能够通过相同的方式操作不同的数据库。
MySQL分页:LIMIT
Oracle分页:ROWNUM
MySQL主键:自增
Oracle主键:序列
④非侵入式:使用Hibernate不会对原有的JavaBean/Entity有任何污染,实体类使用POJO即可。
POJO:Plain Old Java Object
⑤分别在线程和进程两个级别上维护了一级缓存和二级缓存,用于提升程序的性能。
5.搭建Hibernate开发环境
①HelloWorld步骤
[1]创建一个Java工程
[2]导入Hibernate需要的JAR包
[3]创建Hibernate自身的配置文件:hibernate.cfg.xml
[4]创建实体类:Student
[5]创建可以将Student类映射为数据库表的映射文件:Student.hbm.xml
[6]测试将Student对象保存到数据库中
②Hibernate需要的JAR包
[1]Hibernate框架需要的JAR包
hibernate-release-4.2.4.Final\lib\required目录下全部
[2]MySQL驱动
③Hibernate自身配置文件:cfg文件
[1]创建位置:src目录下
[2]创建方式:使用插件创建,保持默认的文件名hibernate.cfg.xml
④实体类和数据库表之间的对应关系
⑤创建hbm映射文件
创建位置:和实体类在同一个包下
6.Hibernate对持久化类的要求
①不需要持久化类继承任何其他类或实现任何接口。
②必须有一个无参的构造器:因为Hibernate需要通过反射来创建持久化类的对象。
③必须有通过getXxx()和setXxx()定义的属性,为了存取属性值。
④非final类:Hibernate在处理数据时,需要创建持久化类的代理对象,而如果持久化类声明为了final则无法创建其代理对象。
7.创建数据库表的策略[了解]
①create:每次都会将原来的旧数据库表删除,创建一个新的数据库表
②update
- 如果数据库表不存在,则创建新的数据库表
- 如果数据库表存在,并且表结构和hbm文件中定义的一样,则不修改数据库表
- 如果数据库表存在,但表结构和hbm文件中定义的不一样,则根据hbm文件修改数据库表
③create-drop:每次都创建新的数据库表,并且在使用完成后删除用过的数据库表
④validate:要求hbm文件中指定的数据库表和表的列都必须真实存在
⑤结论:推荐使用update方式
8.在Hibernate中使用C3P0数据库连接池[了解]
①额外导入相关JAR包
hibernate-release-4.2.4.Final\lib\optional\c3p0目录下的全部文件
②在cfg文件中配置
<!-- 每一个数据库连接超时时间 -->
<
property
name
=
"hibernate.c3p0.timeout"
>
300
</
property
>
<!-- 数据库连接对象自己并不能检测自己是否超时,进而自我释放 -->
<!-- 所以需要另外维护一个守护进程检查连接池中是否有超时的连接,进行释放 -->
<!-- 使用idle_test_period属性指定守护进程多长时间检查一次 -->
<
property
name
=
"hibernate.c3p0.idle_test_period"
>
5000
</
property
>
|
③测试
[1]为了证明数据库连接是从数据库连接池中获取的,需要获取Connection对象。如果Connection对象是C3P0提供的代理对象,则能够证明。
[2]在Hibernate环境中获取Connection对象
//借助doWork()方法获取Connection对象
session
.doWork(
new
Work() {
@Override
public
void
execute(Connection
connection
)
throws
SQLException {
System.
out
.println(
connection
);
}
});
|
注:这也是在Hibernate环境中执行原始JDBC操作的实现方案