数据库服务器和应用服务器
PC
Hibernate 总结
一、应用程序的分层结构
()应用软件的三层结构:
)表述层:提供与用户交互的界面。(图形用户界面)和页面时表述层的两个
典型的例子。
)业务逻辑层:实现各种业务逻辑。例如当用户发出生成订单的请求时,业务逻辑层负
责计算订单的价格、验证订单的信息,以及把订单信息保存到数据库中。
)数据库层:负责存放和管理应用的持久性业务数据。例如对于电子商务网站应用,在
数据库中保存了客户、订单和商品等业务数据。
()软件分层:
)物理分层:
即每一层都运行在单独的机器上。整个系统物理上分两层。
)逻辑分层:
指的是在单个软件模块中完成特定的功能。即上述的三层结构。
逻辑分层的的特征:
)每一层由一组相关的类或组件构成,共同完成特定的功能。
)层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的 ,
而下层组件不应该依赖上层组件。例如:表述层依赖于业务逻辑层,而业务曾依赖数
据库层。
)每个层对上层公开,但具体的实现细节对外透明。当某一层的实现发生变
化,只要他的不变,不会影响其他层的实现。
1
表述层
业务逻辑层
数据库层
表述层
业务逻辑层
数据库层
购物网站:按照业务功能划分为客户管理模块、订单模块和库存模块。
这几个模块之间为并列关系,不存在自上而下的依赖关系,因此不算分层的结构。
但每个模块都可划分为表述层、业务逻辑层和数据库层。
管理
()持久层:
)原因:三层结构中业务逻辑层不仅负责业务逻辑,而且直接访问数据库,提供对业务
书籍的保存、更新、删除和查询操作。为了保数据访问细节和业务逻辑分开,可以把数据访问
作为单独的持久层。
)持久层封装了数据访问细节,为逻辑层提供了面向对象的
)中间件:是在应用程序和系统之间的连接管道。
)中间件的特点:
中间件有很高的可重用性,对于各种应用领域都适用。
透明性。
)可以看成是连接应用和关系数据库的管道。
作为中间件,可以为任何一个需要访问关系数据库的应用服务。
二、hibernate数据持久化组件
1.基本概念:
(1)对象持久化:把数据保存在永久的存储介质中(数据库)。
(2)ORM(object relation mapping)对象关系映射。
(3)POJO(PlainOldJavaObject)类,就是标准的Java Bean。
(4)Hibernate就是一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组
件,底层也是由JDBC实现的。通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的
2
表述层
表述层
业务逻辑层业务逻辑层
数据库层
数据库层
购物网站系统
订单管理模块
库存管理层
客户管理层
表述层
业务逻辑层
数据库层
表述层
业务逻辑层
数据库层
表述层
业务逻辑层
数据库层
持久层
信息,以及连接数据库的驱动。
(5)hibernate的系统配置文件的名字一般叫做hibernate.cfg.xml,一般是映射类名.hbm.xml。
一般将映射类的xml文件和实体类放在一起。
a)对象映射文件
hibernate的映射类的XXXX.hbm.xml的写法
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--package:映射类所在的包,注意:包中间用"."隔开-->
<hibernate-mapping package="XXX.XXX.XXX">
<!--将类和数据库的表联系起来-->
<class name="Xxxxxx" table="Xxxxx">
<!--主键生成策略-->
<id name="studentId" column="studentId">
<!--指定主键生成策略为用户指定-->
<generator class="assigned"/>
</id>
<!--类中的书性和字段之间建立联系-->
<property name="XXX" column="XXXX" type="string"/>
<property name="homeAddress" column="homeAddress"/>
<property name="schoolAddress" column="schoolAddress"/>
<!--在hibernate中其他类型可以自动识别只有Date类型必须指名-->
<property name="brithday" column="brithday" type="date"/>
</class>
</hibernate-mapping>
b)hibernate.cfg.xml中会设置数据库的连接信息,以及引用的其他文件的文件名,和一些其他
的摄制。这个文件一般放在项目的根目录下。
在hibernate.cfg.xml的写法
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--显示sql语句-->
<property name="show_sql">true</property>
<!--使显示的sql语句格式化-->
<property name="format_sql">true</property>
<!--使用的数据库方言信息-->
<property name="dialect">....</property>
<!--使用的数据库的驱动-->
<property name="connection.driver_class">....</property>
<!--连接数据库使用的url-->
<property name="connection.url">....</property>
<!--连接数据库的用户名-->
<property name="connection.username">...</property>
3
<!--连接数据库的密码-->
<property name="connection.password">...</property>
<!--引入的映射对象的xml文件的全路径及文件名,包名之间用"/"隔开-->
<mapping resource="xxx/xxxx/Xxxxxx.hbm.xml"/>
</session-factory>
</hibernate-configuration>
2.使用hibernate编程步骤
1)配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPA
TH环境变量。
2)写hibernate所需的配置文件,hibernate.cfg.xml ,Xxxxx.hbm.xml
3)写类(普通的类)
4)调用hibernate API。
a)使用Configuration对象的buildSessionFactory()方法创建SessionFactory对 象。
b)使用SessionFactory对象openSession()方法创建Session对象。
c)使用 Session 的相应方法来操作数据库,将对象信息持久化到数据库。
的 个核心接口
() :用于解析 !"#$% 文件和 &&&&&!$#$% 文件,并
创建 '(()* 对象。 对象用于配置并且启动 。
应用通过 实例来指定对象++关系映射文件的位置或者动态配置 的
属性,然后创建 '(()* 实例。
()'(()*:初始化 ,充当数据存储源的代理,创建 '(( 对
象。一个 '(()* 实例对应一个数据存储源,应用从 '(()* 中获得 '((
实例。如果应用同时访问多个 ,-,怎需要为每个数据库创建一个单独的 '(()* 实
例。
()'((:也被称为持久化管理器,对象级数据库操作。
特点:
)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个
'(( 实例。
)'(( 实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太
多的资源。这意味着在程序中可以经常创建或销毁 '(( 对象,例如为每个客户
请求分配单独的 '(( 实例,或者为每个工作单位分配单独的 '(( 实例。
)通常将每一个 '(( 实例和一个 ,- 事务邦定,也就是说,每执行一个
,- 事务,都应该先创建一个新的 '(( 实例,不论事务执行成功与否,最后都应
该调用 '(( 的 %(()方法,从而释放 '(( 实例占用的资源。
注:每个 '(( 实例都有自己的缓存,这个 '(( 实例的缓存只能被当前的工
作单元访问。
(.)/ *:执行数据库查询操作。要使用 /0(/ *0 )查询
语句,/0 查询语句是面向对象的,它引用类名及类的属性名。
()1(:用于管理操作事务。它对底层的事务接口做了封装,底层事务接口
包 括 : ,-
、 1 ( 1( ) 、 2- ( $$23 (-4
! )。
三、持久化类:
持久化类:是指其实例需要被 持久化到数据库中的类。持久化类符合 -
的规范,包含一些属性,以及与之对应的 &&&()和 (&&&()方法。
4
注:5( 方法必须符合特定的命名规则, 和 ( 后面紧跟属性的名字,并且属性
名的首字母为大写。
$ 属性的 方法为 6$7,如果写成 $7或 6897会导致
在运行时抛出以下异常:
("!:*6) ;9#: %; ; "
::*$%(($*:4&&&
如果持久化类的属性为 % 类型,那么他的 方法名即可以用 作为前缀,也可
以用 ( 作为前缀。
类的 :; 属性为 % 类型,因此以下两种 方法是等价的。
: % %(:;7<
:;=
>
?@A
: %%:;7<
:;=
>
持久化类有一个 ; 属性,用来唯一标识 类的每一个对象。这个 ; 属性被称为对象
标示符(,,;),通常它都用整数表示。
. 要求持久化类必须提供一个不带参的默认构造方法,在程序运行时,
运用 反射机制,调用 0B( C(7方法来构造持久化类
的实例。
四、把持久化类映射到表
!$#$% 文件用于映射 类D如果需要映射多个持久化类D有两种方法
()在同一个映射文件中映射所有类
()为每一个类创建单独的映射文件,映射文件最好和类同名,扩展名为 !$#$%7推 荐
使用,这有利于在团队开发中维护和管理映射文件
2.映射文件的分析:
(1)<hibernate-mapping package="XXX.XXX.XXX">
package:映射类所在的包,注意:包中间用"."隔开
(2)<class name="Xxxxxx" table="Xxxxx">
<class>元素指定类和表的映射
name:设定类名 table:设定表名
注:如果没写tableHibernate直接以类名作为表名。
(3)<id name="studentId" column="studentId">
<generator class="native"/>
</id>
1)<id>子元素设定持久化类的OID和表的主键的映射,<class>元素只有一个<id>子元素。
2)<generator>子元素指定对象标识符生成器,他负责为OID生成唯一标识符。
3)Hibernate的内置标示符生成器:
)increment:由 以递增的方式为代理主键赋值。 在初始
化阶段读取表中最大主键值,然后再最大值的基础上递增,增量为 。
5