Hibernate
入门
Hibernate
是
Java
应用和关系数据库之间的桥梁,它负责
Java
对象和关系数据之间的映射。
Hibernate
内部封装了通过
JDBC
访问数据库的操作,向上层应用提供了面向对象数据访问
API
。在
Java
应用中使用
Hibernate
包含以下步骤:
1
、创建
Hibernate
配置文件
2
、创建持久化类
3
、创建对象——关系映射文件
4
、通过
Hibernate API
编写访问数据库的代码
1
、创建Hibernate
的配置文件
Hibernate从其配置文件中读取和数据库连接有关的信息,这个配置文件应该位于应用的classpath中。Hibernate的配置文件有两种形式:一种是XML格式的文件;还有一种是Java属性文件,采用“键=值”的形式,这种配置文件的默认文件名为hibernate.properties
示范代码(Java属性文件格式):
hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/SAMPLEDB
hibernate.connection.username=root
hibernate.connection.password=1234
hibernate.show_sql=true
Hibernate将根据配置文件中的属性——属性值信息来连接数据库,在Hibernate软件包的etc目录下,有一个hibernate.properties文件,它提供了连接各种关系数据库的配置代码样例
2
、创建持久化类
持久化类是指其实例需要被
Hibernate
持久化到数据库中的类。持久化类通常都是域模型中的实体域类。持久化类符合JavaBean的规范,包含一些属性,以及与之对象的Get、Set方法
Hibernate
要求持久化类必须提供一个不带参数的默认构造方法,在程序运行时,
Hibernate
运用
Java
反射机制,调用
java.lang.reflect.Constructor.newInstance()
方法来构造持久化类的实例
3
、创建数据库Schema
创建与持久化类对应的数据库表
4
、创建对象——关系映射文件
Hibernate
采用
XML
格式的文件来指定对象和关系数据之间的映射,在运行时,
Hibernate
将根据这个映射文件来生成各种
SQL
语句
文档类型定义
DTD
对
XML
文件的语法和格式做了定义,
Hibernate
的
XML
解析器将根据
DTD
来核对
XML
文件的语法
每一种
XML
文件都有独自的
DTD
文件,
Hibernate
的对象——关系映射文件采用的
DTD
文件为:
hibernate-mapping-2.0.dtd
文件
在创建自己的对象——关系映射文件时,如果不熟悉某种元素的语法,可以参考
DTD
文件
如果需要映射多个持久化类,那么既可以在同一个映射文件中映射所有类,也可以为每个类创建单独的映射文件,映射文件与类同名,扩展名为“hbm.xml”
<class>
元素指定类和表的映射,它的
name
属性设定为类名,
table
属性设定表名
<class>
元素包含一个
<id>
子元素及多个
<property>
子元素。
<id>
子元素设定持久化类的
OID
和表的主键的映射。
<property>
子元素设定类的属性和表的字段的映射。<property>子元素主要包括name、type、column和not-null属性
name:持久化类的属性的名字
type:指定Hibernate的映射类型,Hibernate的映射类型是Java类型和SQL类型的桥梁
not-null:不允许持久化类的该属性为空
column:指定与类的属性映射的表的字段的名字
Hibernate
采用
XML
文件来配置对象——关系映射,有以下优点:
Hibernate
既不会渗透到上层域模型中,也不会渗透到下层数据模型中
软件开发人员可以独立设计域模型,不必强迫遵守任何规范
数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范
对象——关系映射不依赖于任何程序代码,如果需要修改对象——关系映射,只需要修改
XML
文件,不需要修改任何程序代码,提高了软件的灵活性,并且使维护更加方便
5
、通过Hibernate API
操纵数据库
Hibernate
对
JDBC
进行了封装,提供了更加面向对象的
API
通过
Hibernate API
访问数据库的一般流程,首先应该在应用的启动阶段对
Hibernate
进行初始化,然后就可以通过
Hibernate
的
Session
接口访问数据库
5.1
、Hibernate
的初始化
1、创建一个Configuration类的实例,Configuration类的构造方法把默认文件路径下的hibernate.properties配置文件的配置信息读入到内存
Configuration config = new Configuration();
2、调用Configuration类的addClass(Customer.class)方法,把默认文件路径下的Customer.hbm.xml文件中的映射信息读入到内存中
config.addClass(Customer.class);
3、调用Configuration类的buildSessionFactory()方法:
sessionFactory = config.buildSessionFactory();
该方法创建一个SessionFactory实例,并把Configuration对象包含的所有配置信息拷贝到SessionFactory对象的缓存中。SessionFactory代表一个数据库存储源,如果应用只有一个数据库存储源,那么只需创建一个SessionFactory对象。当SessionFactory对象创建后,该对象不和Configuration对象关联。
这里所指的缓存其实指的是
Java
对象的属性(通常是一些集合类型的属性)占用的内存空间。例如,SessionFactory的实现类定义了许多集合类型的属性,这些属性用于存放Hibernate配置信息,映射元数据信息等
如果对象的缓存很大,就称为重量级对象。如果对象占用的内存空间很小,就成为轻量级对象,
SessionFactory
就是一个重量级对象,如果应用只有一个数据存储源,只需创建一个
SessionFactory
实例,因为随意地创建
SessionFactory
实例会占用大量的内存空间
SessionFactory
的缓存分为两类:内置缓存和外置缓存。SessionFactory的内置缓存中存放了Hibernate配置信息和映射元数据信息等;SessionFactory的外置缓存是一个可配置的缓存插件,在默认情况下,SessionFactory不会启动这个缓存插件。外置缓存能存放大量数据库数据的拷贝,外置缓存的物理介质可以是内存或者硬盘
5.2
、访问Hibernate
的Session
接口
初始化过程结束后,就可以调用
SessionFactory
实例的
openSession()
方法来获得
Session
实例,然后通过它执行访问数据库的操作。Session接口提供了操纵数据库的各种方法,如:
save():把Java对象保存到数据库中
update():更新数据库中的Java对象
delete():把Java对象从数据库中删除
load():从数据库中加载Java对象
find():从数据库中查询Java对象
Session是一个轻量级对象,通常将每一个Session实例和一个数据库事物绑定,也就是说,每执行一个数据库事物,都应该先创建一个新的Session实例。如果事物执行中出现异常,应该撤销事物。不论事物执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源。以下代码演示了用Session来执行事物的流程,其中Transaction类用来控制事物
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction(); //开始一个事物
…
tx.commit(); //提交事物
}catch (Exception e) {
if (tx != null) {
// 如果出现异常就撤销事物
tx.rollback();
}
throw e;
} finally {
// 不管事物执行成功与否,最后都关闭Session
session.close();
}
Hibernate
查询语言(
HQL
)是一种面向对象的语言
6
、小结
1、创建Hibernate的配置文件,在配置文件中提供连接特定数据库的信息
2、创建Hibernate的对象——关系映射文件,Hibernate根据该映射文件来生成SQL语句。Hibernate提供了一组内置的映射类型作为连接Java类型和SQL类型的桥梁
3、在应用程序中通过Hibernate API来访问数据库。在应用启动时先初始化Hibernate,创建一个SessiooFactory实例,接下来每次执行数据库事务时,先从SessionFctory中获得一个Session实例,再通过Session实例来保存、更新、删除、加载或查询Java对象
4、掌握存储二进制大数据及长文本数据的技巧,Hibernate的binary映射类型用于映射字节数组,text映射类型用于映射长字符串
5、创建持久化类