1、 本科毕业论文 (科研训练、毕业设计 ) 题 目: 使用 Hibernate 和 Spring 开发数据持久层 姓 名: 学 院:软件学院 专 业:软件工程 年 级: 学 号: 指导教师 (校外 ): 职称: 指导教师 (校内 ): 职称: 年 月 日 使用 Hibernate 和 Spring 开发数据持久层 1 使用 Hibernate 和 Spring 开发数据持久层 摘 要 在 现 今 世 界 中 ,数 据 已 经 是 信 息 时 代 中 的 重 心 ,本 系 统 基 于 对 象 /关 系 映射 的 核 心 理 论 , 使 用 Hib e r n a t e 持 久 层 技 术 和 S
2、p r in g 框 架 构 建 数 据 持 久 层 , 优 化 数 据库 交 互 , 搭 建 原 型 机 系 统 。 通 过 实 践 证 明 了 Hib e r n a t e 的 优 秀 , 以 及 S pr in g 架 构 的 先进性。 关键词 持久层 O RM Hib e r n a t e S p r in g 使用 Hibernate 和 Spring 开发数据持久层 2 ABSTRACT No wa d a y s , t he Dat a h a s b ee n t he mo s t impo rta n t t h in g in th is c o mmu n ica
3、 t io n e po c h. T he de s ign is b as ed on O bje ct / Re lat ion Ma pp in g th eo ry, u s ing Hib er na t e p er s is te n t t e ch no lo g y a nd Sp r in g f ra me wo r k t o co ns tr u ct a d at a p er s ist en c e la ye r, op t imize th e da ta ba s e in ter a ct ion , c on s tr uc t a ar ch e
4、 ty pe s ys te m. F ro m th is d e s ig n, p ro v in g th e e xc e llen ce o f Hib er na t e a nd t he a d va nc e of Spr in g f r a me wo r k . K eyword Pe r s is t e n ce L a y e r O RM Hib e r n a t e Sp r in g 使用 Hibernate 和 Spring 开发数据持久层 3 目 录 中文摘要 Abstract 第一章 引言 . 1 1.1 课 题背 景 . 1 1.2 设 计意 图
5、 . 1 1.3 设 计概 述 . 2 1.4 论 文组 织 . 3 第二章 基 础概 念 . 4 2.1 ORM . 4 2.1.1 ORM 概念 . 4 2.1.2 ORM 的好 处 . 4 2.2 Hibernate . 5 2.2.1 JDBC 和 Hibernate . 5 2.2.2 新技 术 Hibernate . 7 2.2.3 Hibernate 特性 . 8 2.3 Spring 框架 . 8 2.3.1 Spring 特性 . 8 2.3.2 Spring 中的 IOC . 9 2.4 本 章小 结 . 10 第三章 设 计方 案和 实现 . 11 3.1 设 计方 案概
6、 述 . 11 3.2 IDE 开发工 具 . 11 3.3 构 建持 久层 对象 . 13 3.4 映 射描 述 . 16 3.5 Hibernate 语义 . 20 3.6 整合 . 21 3.6.1 整 合配置 . 21 3.6.2 数 据访问 . 24 3.6.3 原型 机系 统 . 25 3.7 本 章小 结 . 27 第四章 结论 . 28 致 谢 语 . 29 参 考 文 献 . 30 使用 Hibernate 和 Spring 开发数据持久层 1 第一章 引言 1.1 课题背景 在 现今 软件 世界 里, 由于 功能 和数 据量 的增 长, 数据 库扮演 了越 来越 重要的 作
7、用 ,可 以说 基本 上任 何一 个软 件都 不可 能脱 离数 据库单 独存 在。 数据 库技 术的 发展 ,已 经成 为先 进信 息技 术的 重要 组成 部分 ,是现 代计 算机 信息 系统 和 计 算 机 应 用系 统的 基础 和核 心。 数 据库 技术 最初 产生 于 20 世纪 60 年 代中 期,根据 数据 模型 的发 展,可以划 分为 三个 阶段 :第 一代 的网 状、 层次 数据 库系 统; 第二代 的关 系数 据库 系统 ; 第 三 代 的 以面 向对 象模 型为 主要 特征 的数 据库系 统。 鉴 于数 据库 的重 要性,对其 访问 的 高 效和 数据 库的 稳定 成了 当今
8、 非 常重 要的 一个 环节 ,各 个不 同的 系统 采取 数据 库的 访问 方式 很有可 能都 不一 样。 面向 对象 的开 发方 法是 当今 的主 流, 但是 同时 我们 不得 不使用 关系 型数 据库 ,所 以在 企业 级应 用开 发的 环境 中,对象 、关 系的 映射( ORM)是 一种 耗时 的工 作。 大部 分企 业应 用不 得不 与他 们的 后端 数据 库频 繁交互 。为 了让 这 种交互 成为 可能 ,并 且使 得交 互变 得有 效而 迅捷 ,企 业应 用开发 者在 应用 和底 下的 数 据 库 之 间 创建 了一 个“ 持久 层” ( persi stence layer)。
9、 1.2 设计意图 几 乎所 有的 应用 都需 要持 续性 数据 。持 续性 在应 用开 发中是 一个 基本 的概念 ,比 如如 果当 主机 停电 时一 个信 息系 统没 有保 存用 户输入 的数 据, 这样 的系 统几 乎没 有实 际的 用途 。这 个数 据库 负责 存储 从应 用到数 据库 的数 据, 也负 责数 据的 检索 、更 新和 删除 。在 基于 J2EE 的 企业 应用 中,组 成这 个持 久层的 Java 类 既 可 以映 射对 象到 数据 ,也 可以 映射 数据到 对象 。 Hibernate 是一 个开 源对 象 /与 持久 性和 查询 相关 的框 架。 这种 新的 ORM
10、映 射工 具, 它不 仅提 供了 从 Java 类到 数据 表之 间的 映射 ,也提 供了 数据 查使用 Hibernate 和 Spring 开发数据持久层 2 询 和恢 复机 制 。相 对于 使用 JDBC 和 S QL 来 手工 操作 数据 库,使用 Hibernate,可 以大 大减 少操 作数 据库 的工 作量 。 Hi bernate 是 一个 OD MG3 i nterface ,只 要有 Lesser GNU P ublic Li cense (LGPL)就可 以从 hi bernate.org 处免 费下 载。 OD MG3 是由对 象数 据管 理小 组( OD MG)开发的
11、 规范 , OD MG 是一个 由不 同的 投资 商和 兴趣 小组 为开 发用 于对 象数 据库 和对象 相关 的映 射产 品的 可移 植性 规范 而结 成的 联盟 。该 规范 推动 了在 不止 一个产 品上 运行 的可 移植 应 用 程 序 的 开发 。 它 既是 开源 的和 免费 的, 使得 用户 在需 要的 时候 可以 修改源 代码 ,进 行功能 的定 制, 它又 是轻 量级 封装 ,避 免引 入过 多的 复杂 问题, 调试 容易 ,也 减轻 程序 员的 负担 ,另 外它 还具 有良 好的 可扩 展性, AP I 开 放 ,当 本身 功能 不够 的 时 候 , 可 以自 己进 行编 码扩
12、 展所 需的 功能 。 1.3 设计概述 建 立一 个持 久层 是简 单的 ,只 要在 Java 对象 和相 应的 数据库 之间 存在 线性 关系(例 如:一 个对 象域 映射 到相 应的 数据 库表 格的 某一列 )。但是 这 种关系 常常 难于 建立 ,因 为对 象或 者下 层的 数据 库结 构复 杂(例 如, 对象 具有 混合 的类 型、 集合 、和 属性 ;数 据库 表格 有外 部钥匙 约束 、串 联属 性 )。 经常 ,在 开发 持久 层的 时候 ,后 端数 据库 的属 性和 它的 模式 假设永 远保 持不 变。 基于 这种 假设 ,所 有的 持久 性操 作在 应用 中是 硬编 码的
13、 ,因此 只能 绑定 到一 种特 殊的 数据 库模 式中 。当 后端 的数 据库 模式 任何 时候 发生改 变( 这在 现实 生活 中经 常发 生 ),这种 方法 极耗 时间 和精 力。数据 库模 式的 改变导 致了 整个 持久 层必 须重 写, 应用 程序 代码 本身 也有 可能 要进 行大 量的修 改。 这是 一个 单调 乏 味 、 非 常 费时 的任 务。 本 设 计采 用的 是 S pring 的 框 架 配 置加 上 Hibernate 的 解 决方 案, 就是 由Hiber nate 负 责 底 层的 数据 持久层 ,但 是不 使用 Hibernate 自 带 的 配置 文件 ,而
14、 是使 用 S pring 框 架 下 的配 置, 让 S pring 框架和 Hibernate 进 行 一个 整合 ,以 吸 取 二 者 之 长, 在效 率和 简便 性上 面达 到最 佳组合 。 使用 Hibernate 和 Spring 开发数据持久层 3 1.4 论文组织 本 次 设 计 的 论 文大 致分 为 4 个章 节 : 第 一 个 章 节 是 引言 部分 , 总 体介 绍了 课题 背景 ,设计 意图 , 设 计概 述; 第 二个 章节 是阐 述概 念, 本章 节对 O RM, S pring 和 H iber nate 的 概 念 作了一 个较 为详 细的 介绍 ,让未 曾接
15、 触过这 些 方 面的 读者 能有 个比 较清 晰的 认识 ,再 对现 有持 久层 技术 作一 个对 比, 让读 者明 白为什 么会 选 择 Hibernate 而不是 JDO 或 者 别 的 解决 方案 ; 第 三个 章节 设计 方案 和具 体实 现过 程 , 到这 部分 实现 一个从 理论 到实 践的转 换, 在实 践的 角度 上把 整个 设计 过程 进行 一个 较为 条理的 综合 ,让 读者 明白 上 文 所 述 的 各项 技术 如何 运用 到项 目中 去; 第 四个 章节 是最 后的 总结 语,对上 述阐 述进 行一 个最 终的 总结 ,指 出还 存在 的 问 题 以 及 努力 的方
16、向。 使用 Hibernate 和 Spring 开发数据持久层 4 第二章 基础概念 由 于本 次设 计使 用到 的技 术在 实际 应用 领域上 还算 是比 较新 颖,在 本章 就重 点对 设计 中使 用到 的各 种技 术 , 以及 技术 牵涉 到的 概念进 行比 较全 面的 介绍。 2.1 ORM 2.1.1 ORM 概念 上 文提 到 的 ORM 映 射是 本设 计的 核心理 论, ORM 是 Object/Relati on Mappi ng 的 缩写 ,翻 译过 来就 是对 象 /关 系映 射,字母 O 起 源于 “对象 “ (Object),而 R 则来 自于 “关系 “ (Rel
17、ational)。几乎 所有 的程 序里 面,都存在 对象 和关 系数 据库 。在 业务 逻辑 层和 用户 界面 层中 ,我 们是 面向 对象的 。当 对象 信息 发生 变 化 的 时 候 ,我 们需 要把 对象 的信 息保 存在 关系数 据库 中。 当 你 开 发 一 个 应用 程 序 的时 候 (不 使用 O/R Mappi ng),你 可 能会 写 不少 数据 访问 层的 代码,用来 从数 据库 保存,删除 ,读 取对象 信息 ,等 等。你 在 DA L中 写了 很多 的方 法来 读取 对象 数据 ,改 变状 态对 象等 等任务 。而 这些 代码 写起 来总 是重 复的。如果 看看 DA
18、L 代码,你肯 定会 看到 很多 近似 的通 用的 模式 。我 们 以保 存对 象 的方 法为 例 ,你 传入 一个 对 象,为 S qlC ommand 对 象添 加S qlParameter,把 所有属 性和 对象 对应 ,设置 S qlCommand 的 C ommandText属 性为 存储 过程 ,然 后运行 S qlC ommand。对于 每个 对象 都要重 复的 写这 些代 码 。除 此之 外,还有 更好 的 办 法就 是采用 ORM,使 用 ORM 可 以大 大降 低学 习 和 开 发 成 本, 现代 技术 的发 展, 使得 我们 不得不 不停 地学 习。 2.1.2 ORM
19、的 好处 我 们 不仅 要学 习面 向对 象、 UML、设 计模 式等 知识 ,而 且还 需要 学习 S ql 使用 Hibernate 和 Spring 开发数据持久层 5 S erver、 AD O.NE T、 D ataS et、 D ataReader 等知识 。而在 实际 的开 发中,真正 对客 户有 价值 的是 其独 特的 业务 功能 ,而 现在 的现 状是我 们花 费了 大量 的时 间在 编写 数据 访问, C RUD 方法 ,包 括后 期的 B ug 查找 ,维护 等也 会花 费相 当多 的时 间在 数据 处理 上。 这就 是说 ,我 们在 实际 的开发 中很 多的 时间 都被
20、 浪费 在根 本不 创 造 价值 的非 业务 事件 上了 。在使 用 ORM 之后 ,我 们将 不需 要再 浪费 太多 的时 间在 AD O.NE T 和 S ql 语 句上 。 ORM 框架已 经把 数据 库转 变成 了我 们熟 悉的 对象 ,我 们将 只需 要了 解面 向对 象开发 就可 以实 现数 据库 应用 程序 的开 发。 通过 建立 ORM 系 统, 能够 大量 减少 程序开 发代 码, 实现 ORM 后 ,开 发数 据层 就比 较简 单,大大 减少 了出 错机 会。同时 通过 C ache的 实现 ,能 够对 性能 进行 调优 ,实 现了 ORM 区 隔了 实际 数据存 储和 业
21、务 层之 间的 关系 ,能 够对每 一层 进行 单独 跟踪 ,增加 了性 能优 化的 可能。利用 ORM可 以将 业务 层与 数据 存储 隔开 ,开 发人 员不 需要 关系 实 际存 储的 方式 ,如 果我 们需 要把 S QL S erver 数据 库换 成 ORA CLE 数 据库 ,只 需要修 改配 置文 件就 可 , 不 需 要 修改 程序 。 2.2 Hibernate 2.2.1 JDBC 和 Hibernate JDB C 可 以说 是访问 持久 数据 层最 原始 、最 直接 的方 法。 JD BC 是 Java 的开 发者 S un 的 Javasoft 公 司 制定 的 Ja
22、va 数 据 库连 接 (Java D ata Base C onnecti vi ty)技 术 的 简 称 , 是为 各种 常用 数据 库提 供无 缝联 接的 技术。 JDB C 向应 用程 序开 发者提 供了 独立 于数 据库 的统 一 的 AP I。这个 AP I 提供 了编 写的 标准 和考 虑所 有不 同应 用程 序设 计的 标准 。其奥 秘是 一组 由驱 动程 序实 现的 Java 接 口。 驱动 程序 负责 标准 JDB C 调 用向 支持的 数据 库所 要的 具体 调用 转变 。除 了向 开发 者提 供统 一的 独立于 D B MS 的 框架 外, JD BC还 提供 了让 开
23、发 者保 持数 据库 厂家 提供 的特 定功 能的办 法。 JD BC 驱 动程 序必 须支 持 A NS I A QL -2 项 目层 ,但 JD BC 允 许开 发者 直接 将查询 字符 串传 递到 连接 的驱 动程 序。 这些 字段 可能是 A NS I S QL 也可 能不 是,或 者根 本不 是使用 Hibernate 和 Spring 开发数据持久层 6 A QL。这 些字 符串 的使 用是 基础 驱动 程序的 事 。之 前通过 Java 访 问数 据库 的唯 一方 法就 是利 用 Java 中的 流调 和访 问 Common Gateway Interface( C GI,公 用
24、网 关接 口) 程序 。通过 Java 调用 C GI 脚 本 其实 是执 行一个 访问 数据 库并 返回 结果 的独 立程 序。 但是 使用 这种 方法 速度 很慢 ,而且 会在 应用 程序 中引 入更 多的 错误 。这 是由 于利 用两 种不 同的 开发 语言 开发程 序, 需要 掌握 两种不同的技术。 使用 JDB C,用 户只 要了 解 Java 语言 即可 ,而 使用 C GI,用 户必 须同 时使用 Java 和 另 一种 编程语 言。 使 用 JDB C 的另一 个原 因是 它的 速度 比 C GI 方法 更快 。使 用 C GI 方 法 通常要 求计 算机 执行 另一 个独 立
25、的 程序。这个 独立 的程 序访 问数 据库 ,处 理数 据,并 将结 果返 回给 调用 程序。这就 需要 多级 处理 ,因 而增 加了 等待 时间 和出 错概 率。在企 业级 应用 开发 中,我们 可能 使用 D A O( Data Access Object) 模式 来把 数据 访问 封装 起来 ,然 后在其 它的 层中 同一调用。 这 种方 式的 优点 是运 行效 率最 高,但 JD BC +D A O 也 存在 很多的 问题 ,因为 很难 做到 把关 系表 记录 完整 的映 射到 持久 对象 的关 系上来 ,这 主要 体现 在多 表的 关系 无法 直接 映射 到对 持久 对象 的映 射
26、上 来, 可能是 一个 表映 射多 个持 久对 象, 有可 能是 多个 表映 射一 个持 久对 象, 更有 可能的 是表 的某 些字 段映 射到 一个 持久 对象 ,但 是另 外一 些字 段映 射到 别的 持久对 象上 。而 且即 使这 些问 题都 处理 好了 ,也不 能直 接按 照对象 的方 式来 对持 久对 象( PO)编程 ,因 为存 在 1: N 关 系的 持久对 象的 查询 其实 就是 1+n 次对 数据 库的 S QL,这样 将会 造成 访问 的效 率极 其低 下, 最后 可能 导致 不得 不整个 修改 底层 设计 ,最 后等 于是 完全 抛弃 了对 象设 计, 完全 是按 照表
27、字段 进行操 作 , 又回 到了 按照 过 程 进 行 编 程的 老路 上来 。 在 这 种 情况 下就 需要 一个 实用 的 ORM 工具 ,现 在市 面上 有几 种 ORM 工具 可 供 选 择 , 比如 JD O,但 是由 于一 些原 因, 诸如 : 1. 不 是 开源 免费 的工 具,这 点在 企业 开发 当中是 非常 重要 的,大 家都 知道许 多好 产品 都会 商业 化, 成为 商业 产品 ,而 很多 又是 国外的 产品 ,在 国内 根本 就没 有销 售和 技术 的支 持。 这就 决定 了某 些产 品只 能研究 学习 之用 ,而 不能 在实 际用 途中 大显 身手 ,否 则的 话, 你把 软件 卖给 客户的 时候 ,你 还要 告诉 他另 外去 购买 另外 一个 别的 在国 内没 有支 持的 产品 ,如果 那个 软件 出了 什