00AD小组项目学习报告 小组角色 a)小组成员: 0461006王英琦 0461084王文静 0461097华菁婧 0461118朱牧(组长) 0461124黄闻 b) IBATIS项目开题背景 i.由于小组中王文静同学暑期开始在SAP实习,正在接触与旧 BATIS相关的项目 觉得BATS既可以让人觉得简单到会 Select* from table就行,又有自身可以 挖掘的地方,而且觉得也是个不错的开源项目。于是提议小组来研究这个开源 项目。 ⅱ.通过进一步的研究学习,来提高项目DAO层的性能,改进代码质量 ⅲ.当对 IBATIS有比较深入的理解后,和当下流行的其他OR/M框架做下对比。从 而有新的分析与认识 c)|BATS项目研究准备工作 i.由于王文静同学对BATS提前有过一定的接触,搜集了一些相关的资料分享给 其他组员 i.具体的研究阶段分为 1.【 CHAPTER1】BATS框架简介及相关知识点概要一王英琦 2.【 CHAPTER2】DAO设计模式介绍与深入理解一华菁婧 3.【 CHAPTER2】DAO设计模式实现一朱牧 4.【 CHAPTER3】|BATS如何工作及配置工作一黄闻 5.【 CHAPTER4】|BATS小结与 CHACHE机制的深入研究一王文静 学习研究成果 )项目资料前期准备 i.http:/ibatis.apache.org i. JPet store开源项目源码 BATIS-SqlMaps-2 cn pdf iv. iBATIS-SqlMaps-2-Tutorial cn pdf Manning. iBATIS in Action. Jan 2007. pdf b)基本框架简介 .单词“ iBATIS"和 SQL Maps与DAO框架同义,就象" xerox"(施乐复印机(商 标名称))和“ photocopy"(影印)同义。 简单说来, IBATIS是一个开源的对象关系映射程序,其工作是将对象映射到 SQL语句。和众多的 Source Forge开源项目一样, iBATIS曾经也是其中的一员。 在2004年11月3日成功地成为了 Apache Incubator下的子项目。 IBATIS包
OOAD 小组项目学习报告 一、 小组角色 a) 小组成员: 0461006 王英琦 0461084 王文静 0461097 华菁婧 0461118 朱牧(组长) 0461124 黄闻 b) IBATIS 项目开题背景 i. 由于小组中王文静同学暑期开始在 SAP 实习,正在接触与 IBATIS 相关的项目。 觉得 iBATIS 既可以让人觉得简单到会 Select * from table 就行,又有自身可以 挖掘的地方,而且觉得也是个不错的开源项目。于是提议小组来研究这个开源 项目。 ii. 通过进一步的研究学习,来提高项目 DAO 层的性能,改进代码质量。 iii. 当对 IBATIS 有比较深入的理解后,和当下流行的其他 OR/M 框架做下对比。从 而有新的分析与认识。 c) IBATIS 项目研究准备工作 i. 由于王文静同学对 IBATIS 提前有过一定的接触,搜集了一些相关的资料分享给 其他组员 ii. 具体的研究阶段分为: 1. 【CHAPTER1】IBATIS 框架简介及相关知识点概要 — 王英琦 2. 【CHAPTER2】DAO 设计模式介绍与深入理解— 华菁婧 3. 【CHAPTER2】DAO 设计模式实现— 朱牧 4. 【CHAPTER3】IBATIS 如何工作及配置工作 — 黄闻 5. 【CHAPTER4】IBATIS 小结与 CHACHE 机制的深入研究 — 王文静 二、 学习研究成果 a) 项目资料前期准备 i. http://ibatis.apache.org ii. JPetStore 开源项目源码 iii. iBATIS-SqlMaps-2_cn.pdf iv. iBATIS-SqlMaps-2-Tutorial_cn.pdf v. Manning.iBATIS.in.Action.Jan.2007.pdf b) 基本框架简介 i. 单词“iBATIS”和 SQL Maps 与 DAO 框架同义,就象“xerox”(施乐复印机(商 标名称))和“photocopy” (影印)同义。 ii. 简单说来,iBATIS 是一个开源的对象关系映射程序,其工作是将对象映射到 SQL 语句。和众多的 SourceForge 开源项目一样,iBATIS 曾经也是其中的一员。 在 2004 年 11 月 3 日成功地成为了 Apache Incubator 下的子项目。 iBATIS 包
括 for java和 for net两个版本, for java版提供了 SQL Maps和DAO框架, for NET只提供了 SQL Maps框架。我们小组研究的是 for java版 i我们都知道,对象关系映射程序( Object relational| Mappers,ORM)有多种形 式。在」ava中,大多数流行的oRM都可以实现完整的域模型映射,它的目 标是将整层的对象和行为映射到数据库表。流行的ORM包括: Hibernate EJB Entities 3 EJB Entity Beans 2.x · TopLink 上面每一个框架都被分类为一个完整的域模型映射程序,其中将表映射到对 象,对象状态得到维护,对象在任何时间或者某些时间跟随一个连接的模型(由 于客户机组件与对象交互,因此将涉及到基础数据库操作),并且抽象查询语 言通过对象模型进行工作。反过来,这些框架将生成」DBC或隐藏的SQL代 码。 而 iBATIS框架是由轻量级的映射框架和持久层AP组成的,能快速通过数据 库 schema为java应用程序创建持久层。一系列的XML文件——被解释为SQL Map文件,包含SQL语句的模板,其中每个文件对应一个数据库表。这些SQL 语句会作为 prepared statements执行,得到的结果会被映射到jaa的包装类 中。从应用程序角度看,BAT的 Data Access Objects objects(0AO)层作为AP, 负责从sαLMap模板到把结果赋值给对应的包装类。所以,大致的架构就如 下图: application domain classes DAO layer SOL Maps vendor JDaC driver . I Batis应用的需要: a)系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几 条 Select sαL(或存储过程)以获取所需数据,具体的表结构不予公开 b)开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由
括 for Java 和 for .NET 两个版本,for Java 版提供了 SQL Maps 和 DAO 框架, for .NET 只提供了 SQL Maps 框架。我们小组研究的是 for Java 版。 iii. 我们都知道,对象关系映射程序(Object Relational Mappers,ORM)有多种形 式。在 Java 中,大多数流行的 ORM 都可以实现完整的域模型映射,它的目 标是将整层的对象和行为映射到数据库表。流行的 ORM 包括: • Hibernate • JDO • EJB Entities 3 • EJB Entity Beans 2.x • TopLink 上 面每一个框架都被分类为一个完整的域模型映射程序,其中将表映射到对 象,对象状态得到维护,对象在任何时间或者某些时间跟随一个连接的模型(由 于客户机组 件与对象交互,因此将涉及到基础数据库操作),并且抽象查询语 言通过对象模型进行工作。反过来,这些框架将生成 JDBC 或隐藏的 SQL 代 码。 而 iBATIS 框架是由轻量级的映射框架和持久层 API 组成的,能快速通过数据 库 schema 为 java 应用程序创建持久层。一系列的 XML 文件——被解释为 SQL Map 文件,包含 SQL 语句的模板,其中每个文件对应一个数据库表。这些 SQL 语句会作为 prepared statements 执行,得到的结果会被映射到 java 的包装类 中。从应用程序角度看,iBATIS 的 Data Access Objects Objects(DAO) 层作为 API , 负责从 SQL Map 模板到把结果赋值给对应的包装类。所以,大致的架构就如 下图: iv. IBatis 应用的需要: a) 系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几 条 Select SQL (或存储过程)以获取所需数据,具体的表结构不予公开。 b) 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由
存储过程实现系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必 须通过经过高度优化的sαL语句(或存储过程)才能达到系统性能设计指标 面对这样的需求,再次举起 Hibernate大刀,却发现刀锋不再锐利,甚至无法使用, 奈何?恍惚之际,只好再摸出」DBC准备拼死一搏……,说得未免有些凄凉,直接 使用」DBC进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码 乏味的字段读取操作令人厌烦。“半自动化”的 ibatis,却刚好解决了这个问题。 使用BATS提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Jav对 象,这一层与通过 Hibernate实现ORM而言基本一致,而对于具体的数据操作 Hibernate会自动生成soQL语句,而 ibatis则要求开发者编写具体的SQL语句。 相对 Hibernate等“全自动”ORM机制而言, ibatis以SoQ开发的工作量和数据库 移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM实现 的一种有益补充, ibatis的出现显得别具意义 i.这里的“半自动化”,是相对 Hibernate等提供了全面的数据库封装机制 的“全自动化”ORM实现而言,“全自动”ORM实现了POO和数据 库表之间的映射,以及SQL的自动生成和执行。而 ibatis的着力点,则 在于POo与SQL之间的映射关系。也就是说, ibatis并不会为程序员在 运行期自动生成sαL_执行。具体的sQL需要程序员编写,然后通过映 射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POo Poo的概念(举个具体的例子: eg User java) POJO= pure old java object or plain ordinary java object or what ever. tEiR 在一些 Object/ Relation M apping工具中,能够做到维护数据库表记录的 persisent object完全是一个符合 Java bean规范的纯Java对象,没有增加 别的属性和方法。 i.再来区别持久对象和Poo 持久对象实际上必须对应数据库中的 entity,所以和POo有所区别。比 如说POO是由neW创建,由GC回收。但是持久对象是 insert数据库创 建,由数据库 delete删除的。基本上持久对象生命周期和数据库密切相 关。另外持久对象往往只能存在一个数据库 Connection之中, Connnection关闭以后,持久对象就不存在了,而POo只要不被GC回收, 总是存在的 由于存在诸多差别,因此持久对象Po( Persistent Object在代码上肯定和 Poo不同,起码PO相对于Po会增加一些用来管理数据库 entity状态 的属性和方法。而ORM追求的目标就是要Po在使用上尽量和Poo 致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到Po 的存在。 c)数据持久化比较合理的定义 .数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转 换为内存中的数据模型的统称.数据模型可以是任何数据结构或对象模 型,存储模型可以是关系模型、XML、二进制流等。cmp和 Hibernate 是对象模型到关系模型之间转换的不同实现。只不过对象模型和关系模型 应用广泛,所以就会误认为数据持久化就是对象模型到关系型数据库的转 换罢了 持久化”这个概念是和“暂时”等概念相对的,数据在计算机中有
存储过程实现系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必 须通过经过高度优化的 SQL 语句(或存储过程)才能达到系统性能设计指标。 面对这样的需求,再次举起 Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用, 奈何?恍惚之际,只好再摸出 JDBC 准备拼死一搏……,说得未免有些凄凉,直接 使用 JDBC 进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码, 乏味的字段读取操作令人厌烦。“半自动化”的 ibatis,却刚好解决了这个问题。 使用 iBATIS 提供的 ORM 机制,对业务逻辑实现人员而言,面对的是纯粹的 Java 对 象,这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作, Hibernate 会自动生成 SQL 语句,而 ibatis 则要求开发者编写具体的 SQL 语句。 相对 Hibernate 等“全自动”ORM 机制而言,ibatis 以 SQL 开发的工作量和数据库 移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM 实现 的一种有益补充,ibatis 的出现显得别具意义。 i. 这里的“半自动化” ,是相对 Hibernate 等提供了全面的数据库封装机制 的“全自动化 ”ORM 实现而言,“全自动” ORM 实现了 POJO 和数据 库表之间的映射,以及 SQL 的自动生成和执行。而 ibatis 的着力点,则 在于 POJO 与 SQL 之间的映射关系。也就是说,ibatis 并不会为程序员在 运行期自动生成 SQL 执行。具体的 SQL 需要程序员编写,然后通过映 射配置文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO。 ii. POJO 的概念(举个具体的例子 :eg.User.java) POJO = pure old java object or plain ordinary java object or what ever.就是说 在一些 Object/Relation M apping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的纯 Java 对象,没有增加 别的属性和方法。 iii. 再来区别持久对象和 POJO: 持久对象实际上必须对应数据库中的 entity,所以和 POJO 有所区别。比 如说 POJO 是由 new 创建,由 GC 回收。但是持久对象是 insert 数据库创 建,由数据库 delete 删除的。基本上持久对象生命周期和数据库密切相 关。另 外持 久对 象往 往只 能存 在一 个数 据库 Connection 之 中, Connnection 关闭以后,持久对象就不存在了,而 POJO 只要不被 GC 回收, 总是存在的。 由于存在诸多差别,因此持久对象 PO(Persistent Object)在代码上肯定和 POJO 不同,起码 PO 相对于 POJO 会增加一些用来管理数据库 entity 状态 的属性和方法。而 ORM 追求的目标就是要 PO 在使用上尽量和 POJO 一 致,对于程序员来说,他们可以把 PO 当做 POJO 来用,而感觉不到 PO 的存在。 c) 数据持久化比较合理的定义: i. 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转 换为内存中的数据模型的统称. 数据模型可以是任何数据结构或对象模 型,存储模型可以是关系模型、XML、二进制流 等。cmp 和 Hibernate 只 是对象模型到关系模型之间转换的不同实现。只不过对象模型和关系模型 应用广泛,所以就会误认为数据持久化就是对象模型到关系型数据库的转 换罢了。 ii. “持久化”这个概念是和 “暂时”等概念相对的,数据在计算机中有一
般有两个存储地,内存为暂存,因为电源关机就会数据丢失,如果需要反 复使用,就要持久保存,实现持久化了。持久化现在有多个途径,如数据 库和文件等 ⅲ.持久层是J2EE中实现持久化的一个层次,由于它和数据库等具体技术打 交道,而且不同数据库提供的接口不一致,因此,有4个指标来衡量持 久化技术的选择: 1.性能->高性能,最好能直接使用具体数据库特性(好) 2.通用→>可移植,在不同数据库之间移植(差) 3.方便->使用方便,o/ R mapping非常方便(好) 4.安全->事务机制好,很好地支持CAID等。(好) c)DAo设计模式介绍 . iBATIS是一个开源对象映射持久框架程序。它是将对象映射到SQL语句中。DAo 是 iBATIS两个重要核心框架之一。DAO是 Data Access Objects的缩写,也就是 数据访问对象。它的位置处于业务逻辑层和数据库资源之间。它的作用是抽象 封装所有对数据源的访问。DAO负责与数据源连接以获取和存储数据。DAO 是」2EE标准开发模式之一。程序员利用DAO将底层的数据访问与高层的操作 逻辑分离开来。DAO是一个应用程序接口,DAO是 Data Access Object数据访 问接口,数据访问:故名思义就是与数据库打交道。夹在业务逻辑与数据库资 源中间 ⅱ.在核心」2EE模式中是这样介绍DAO模式的:为了建立一个健壮的2E应用, 应该将所有对数据源的访问操作抽象封装在一个公共AP中。用程序设计的语 言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务 方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口 并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储 ⅲ.几个例子: a)DAo与微软的关系:DAo(数据访问对象)是一种应用程序编程接口(AP), 存在于微软的 Visua| Basic中,它允许程序员请求对微软的 Access数据库的访 问。DAO是微软的第一个面向对象的数据库接口。DAO对象封闭了 Access的 t函数。通过Jet函数,它还可以访问其他的结构化查询语言(SQL)数据库。 b)DAO的四个组件包括:DAO工厂,DAO接口,一个DAO接口的简单类以及数 据传输对象 c)DAO层和 Service层的区别: Service层是业务逻辑层,DAo层是持久层接口, 与数据之间进行交互。 d)DAo设计模式具体应用( SQL Maps中的应用例子) Struts应用:允许对一个关系表执行 SELECT, NSERT. UPDATE和 DELETE的SoQL 请求。在这个应用中,使用 SQL Maps做持续性框架。 i.修改这个应用,将这个关系表储存在一个XML文件中而不是存在关系数据库 中,或者使用 Hibernate来实现 SELECT请求,而用 SQL Map来执行其他请求 因为 Hibernate提供了对高速缓存更好的支持。这样的修改很难实现,或者即 使我们能修改而实现了这个功能,也会是很混乱的解决方案。 ⅲ.更好的解决方法:建立一个 ContactDAo接口,在这个接口中定义处理 SELECT NSERT UPDATE,和 DELETE请求的事务方法。然后根据不同的事务逻辑建立不 同的类实现各个方法。所以可能会有一个类处理使用 SQL Maps同关系表进行
般有两个存储地,内存为暂存,因为电源关机就会数据丢失,如果需要反 复使用,就要持久保存,实现持久化了。持久化现在有多个途径,如数据 库和文件等 iii. 持久层是 J2EE 中实现持久化的一个层次,由于它和数据库等具体技术打 交道,而且不同数据库提供的接口不一致,因此,有 4 个指标来衡量持 久化技术的选择: 1. 性能 --> 高性能,最好能直接使用具体数据库特性 (好) 2. 通用 --> 可移植,在不同数据库之间移植(差) 3. 方便 --> 使用方便, o/R mapping 非常方便(好) 4. 安全 --> 事务机制好,很好地支持 CAID 等。(好) c) DAO 设计模式介绍 i. iBATIS 是一个开源对象映射持久框架程序。它是将对象映射到 SQL 语句中。DAO 是 iBATIS 两个重要核心框架之一。DAO 是 Data Access Objects 的缩写,也就是 数据访问对象。它的位置处于业务逻辑层和数据库资源之间。它的作用是抽象 封装所有对数据源的访问。DAO 负责与数据源连接以获取和存储数据。DAO 是 J2EE 标准开发模式之一。程序员利用 DAO 将底层的数据访问与高层的操作 逻辑分离开来。DAO 是一个应用程序接口,DAO 是 Data Access Object 数据访 问接口,数据访问:故名思义就是与数据库打交道。夹在业务逻辑与数据库资 源中间。 ii. 在核心 J2EE 模式中是这样介绍 DAO 模式的:为了建立一个健壮的 J2EE 应用, 应该将所有对数据源的访问操作抽象封装在一个公共 API 中。用程序设计的语 言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务 方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口, 并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。 iii. 几个例子: a) DAO 与微软的关系:DAO(数据访问对象)是一种应用程序编程接口(API), 存在于微软的 Visual Basic 中,它允许程序员请求对微软的 Access 数据库的访 问。DAO 是微软的第一个面向对象的数据库接口。DAO 对象封闭了 Access 的 Jet 函数。通过 Jet 函数,它还可以访问其他的结构化查询语言(SQL)数据库。 b) DAO 的四个组件包括:DAO 工厂,DAO 接口,一个 DAO 接口的简单类以及数 据传输对象。 c) DAO 层和 Service 层的区别:Service 层是业务逻辑层,DAO 层是持久层接口, 与数据之间进行交互。 d) DAO 设计模式具体应用(SQL Maps 中的应用例子) i. Struts 应用:允许对一个关系表执行 SELECT, INSERT, UPDATE 和 DELETE 的 SQL 请求。在这个应用中,使用 SQL Maps 做持续性框架。 ii. 修改这个应用,将这个关系表储存在一个 XML 文件中而不是存在关系数据库 中,或者使用 Hibernate 来实现 SELECT 请求,而用 SQL Map 来执行其他请求, 因为 Hibernate 提供了对高速缓存更好的支持。这样的修改很难实现,或者即 使我们能修改而实现了这个功能,也会是很混乱的解决方案。 iii. 更好的解决方法:建立一个 ContactDAO 接口,在这个接口中定义处理 SELECT, INSERT, UPDATE, 和 DELETE 请求的事务方法。然后根据不同的事务逻辑建立不 同的类实现各个方法。所以可能会有一个类处理使用 SQL Maps 同关系表进行
交互的情况,而另外一个类处理用XML文件存放关系表而不是关系数据库的 情况,等等。在项目中,根据实际的需要从不同的 ContactDAo中选择相应的 实现。这种关系见图: ava class 《] ava Class ⊙ JDBCContactDA0 C Contact a contactId int Us》 e addcontact() a firstName: String e update Contact () a lastName: String e deleteContact() e selectContact ( 《use》 《] ava Interface 《] ava classy I ContactD4O C XMLContactDAO Client <use e addcontact ( e addContact ( e update Contact() <1 e updateContact( e deleteContact() e delete Contact ( e selectcontact() e selectContact() 《] aya classy ⊙ SQLMapContactDAO e addcontact() e update Contact ( e deleteContact ( e selectContact()
交互的情况,而另外一个类处理用 XML 文件存放关系表而不是关系数据库的 情况,等等。在项目中,根据实际的需要从不同的 ContactDAO 中选择相应的 实现。这种关系见图:
具体步骤 a) Copy ibatis-dao-2 jar and ibatis- common -2. jar into WEB-INF/lib b) Create a SqlMap config In KtransactionManager type="JDBC Property JDBC Connecti onURL value="jdbc: db2: SAMPLE"/> Property name="JDBC Username alue="db2admin"/> Property name="JDBC Password dmin2db"/> ource transacti onManager> sqlMap resource="Contact xm1"> √ sqlMapConfi c) Create Contact DAO. java public interface ContactDAO extends DAo t public int insertcontact( Contact contact) public int update Contact(Contact contact); public Contact selectcontact(int contactId); public int delete Contact(int contactId);
iv. 具体步骤: a) Copy ibatis-dao-2.jar and ibatis-common-2.jar into WEB-INF/lib b) Create a SqlMapConfig.xml file in your Java source folder c) Create ContactDAO.java
d) Create SQLMapContactDAO java public class SQLMapcontactDAO extends SqIMapDao Template implements ContactDAo i public SQLMapContactDAO(DaoManager argo)i super(argo) oublic int deleteContact(int contactId)i return super. delete( deleteContact new Integer(contactId)) public int insertcontact(Contact contact)i Integer contactid =(Integer )super insert ( insertcontact, contact) return contact. getcontactIdo: public Contact selectcontact(int contactId)i return(Contact)super query Forobject("getcontact new Integer(contactId)); public int update Contact( Contact contact)i return super. update(update Contact contact)
d) Create SQLMapContactDAO.java
e) Modify method execute in Contact SelectionAction Contact contactForm=(Contact) form Reader reader= Resources. getR esourceAsReader( DAOMap xm" ); DaoManager daoManager DaoManager Builder. buildDaoManager(reader) ContactDAo contactDAo= (ContactDAO) daoManager. getDao( ContactDAO, class, " sqlmap"); request setAttribute(" contactDetail contactDAO. selectcontact( contactForm. getcontactIdo)) 旦有了 Reader对象来读取 DAOMap.xml,就能将它们读取至 DAOManagerBuilder. buildDaoManager(,返回一个 DaoManager实例,将来用于与 DAo框架进行交互。从理论上来说,应该在项目启动的时候初始化DAO框架,在 我们这个程序中,可以将这个模块放入 Struts插件中,但是为了简化这个例子,我 们将初始化模块放入 execute方法中。有了 DaoManager实例后,可以调用相应的 接口和存储实现类(在元素中的id属性值)的 getDaol方法。在我们的例子中,需要 个 SQLMapContactDAO的实例,所以以 ContactDAo为接口名称,“ sqlmap"为存 储机制。一旦实现了 SQLMapContact DAO实例,就可以在调用其中的事务方法。 e) SQL MAP XML映射文件是如何工作的 a) SQL MAP 首先说说 SQL Map的概念。就如上面介绍的那样, SQL Map APl让开发人员 可以轻易地将 Java Bean映射成 PreparedStatement的输入参数和 Result set结 果集。开发 SQL Map的想法很简单:提供一个简洁的架构,能够用20%的代 码实现80%」DBC的功能。然后我们来了解 SQL Map是如何工作? SQL Map提供了一个简洁的框架,使用简单的XML描述文件将 Java bean,Map 实现和基本数据类型的包装类( String, Integer等)映射成」DBC的 PreparedStatement。以下流程描述了 SQL Maps的高层生命周期:将一个对象 作为参数(对象可以是 Java bean,Map实现和基本类型的包装类),参数对象 将为SαL修改语句和查询语句设定参数值。 执行 mapped statement。这是 SQL Maps最重要的步骤。 SQL Map框架将
e) Modify method execute() in ContactSelectionAction.java 一旦有了 Reader 对 象 来 读 取 DAOMap.xml , 就 能 将 它 们 读 取 至 DAOManagerBuilder.buildDaoManager(),返回一个 DaoManager 实例,将来用于与 DAO 框架进行交互。从理论上来说,应该在项目启动的时候初始化 DAO 框架,在 我们这个程序中,可以将这个模块放入 Struts 插件中,但是为了简化这个例子,我 们将初始化模块放入 execute 方法中。有了 DaoManager 实例后,可以调用相应的 接口和存储实现类(在元素中的 id 属性值)的 getDao()方法。在我们的例子中,需要 一个 SQLMapContactDAO 的实例,所以以 ContactDAO 为接口名称,“sqlmap”为存 储机制。一旦实现了 SQLMapContactDAO 实例,就可以在调用其中的事务方法。 e) SQL MAP XML 映射文件是如何工作的 a) SQL MAP 首先说说 SQL Map 的概念 。就如上面介绍的那样,SQL Map API 让开发人员 可以轻易地将 Java Bean 映射成 PreparedStatement 的输入参数和 ResultSet 结 果集。开发 SQL Map 的想法很简单:提供一个简洁的架构,能够用 20%的代 码实现 80%JDBC 的功能。然后我们来了解 SQL Map 是如何工作? SQL Map 提供了一个简洁的框架,使用简单的 XML 描述文件将 Java Bean,Map 实现和基 本数据类 型的包 装类( String ,Integer 等)映射成 JDBC 的 PreparedStatement。以下流程描述了 SQL Maps 的高层生命周期: 将一个对象 作为参数(对象可以是 Java Bean,Map 实现和基本类型的包装类),参数对象 将为 SQL 修改语句和查询语句设定参数值。 i. 执行 mapped statement。这是 SQL Maps 最重要的步骤。SQL Map 框架将
创建一个 PreparedStatement实例,用参数对象为 PreparedStatement实例 设定参数,执行 PreparedStatement并从 Resultset中创建结果对象。 i.执行SQL的更新数据语句时,返回受影响的数据行数。执行查询语句时 将返回一个结果对象或对象的集合。和参数对象一样,结果对象可以是 Java bean,Map实现和基本数据类型的包装类。 下图描述了以上的执行流程。 Input sqlMapconfig. xml (Output) JavaBean JavaBean SQL Map Mapped (HashMap Statement Statement TreeMap.) TreeMap.) Statement "Primitive string Mapped Mapped Statemen State JDBC b)映射文件介绍 在整个 SQL MAP中,映射文件作为持久层中的主要部分,它是对数据库操作 的主要途径。它包含SoL语句,将输入参数( parameter)和返回结果( result) 直接映射至类。任何SαL语句都可看作是一组输入和输出。输入的值是参数 ( parameter),通常出现在 WHERE子句中。输出的值则是出现在 SELECT子句 中的列。 Output SELECT FIRST NAME, LAST NAME FROM EMPLOYEE WHERE EMPLOYEE NUMBER=1234 c)映射文件的构成 tatement SQL Map的核心概念是 Mapped Statement。 Mapped Statement可以使用 任意的SQL语句,并拥有 parameter map(输入)和 result map(输出) <statement id=statementName'" [parameter Class="some class Name
创建一个 PreparedStatement 实例,用参数对象为 PreparedStatement 实例 设定参数,执行 PreparedStatement 并从 ResultSet 中创建结果对象。 ii. 执行 SQL 的更新数据语句时,返回受影响的数据行数。执行查询语句时, 将返回一个结果对象或对象的集合。和参数对象一样,结果对象可以是 Java Bean,Map 实现和基本数据类型的包装类。 下图描述了以上的执行流程。 b) 映射文件介绍: 在整个 SQL MAP 中,映射文件作为持久层中的主要部分,它是对数据库操作 的主要途径。它包含 SQL 语句,将输入参数(parameter)和返回结果(result) 直接映射至类。任何 SQL 语句都可看作是一组输入和输出。输入的值是参数 (parameter),通常出现在 WHERE 子句中。输出的值则是出现在 SELECT 子句 中的列。 c) 映射文件的构成 i. Statement SQL Map 的核心概念是 Mapped Statement。Mapped Statement 可以使用 任意的 SQL 语句,并拥有 parameter map(输入)和 result map(输出) <statement id=”statementName” [parameterClass=”some.class.Name”]
[result Class=some class Name" [parameterMap="nameOfParameterMap" [resultMap="nameOfResultMap"] [cacheModel="nameofCache" elect* from PRoDUCT where PRD ID=[? #propertyName# order by [simple DynamicS 元素是个通用声明,可以用于任何类型的soQL语句。通常, 使用具体的 statement类型是个好主意。它包括 几种类型。具体 statement类型提供 了更直观的 XML DTD,并拥有某些元素没有的特性。 ⅱ.SQL语句 sQL显然是 mapped statement中最重要的部分,可以使用对于数据库和 JDBC Driver合法的任意SQL语句。只要」 DBC Driver支持,可以使用任意 的函数,甚至是多条语句。因为SL语句是嵌在XML文档中的,因此有 些特殊的字符不能直接使用,例如大于号和小于号( #valuet }> parameterClass属性的值是Jaa类的全限定名(即包括类的包名) parameterClass属性是可选的,但强烈建议使用。它的目的是限制输入参 数的类型为指定的Jaa类,并优化框架的性能。如果使用 parameter Map, 则没有必要使用 parameterClass属性。例如,如果要只允许Java类 examples. domain Product"作为输入参数,可以这样作: <statement id="statementName"parameter Class insert into PRODUCT values(#id#, #description#, #price#)
[resultClass=”some.class.Name”] [parameterMap=”nameOfParameterMap”] [resultMap=”nameOfResultMap”] [cacheModel=”nameOfCache”] > select * from PRODUCT where PRD_ID = [?|#propertyName#] order by [$simpleDynamic$] 元素是个通用声明,可以用于任何类型的 SQL 语句。通常, 使用具体的 statement 类 型 是 个 好 主 意 。 它 包 括 几种类型。具体 statement 类型提供 了更直观的 XML DTD,并拥有某些 元素没有的特性。 ii. SQL 语句 SQL 显然是 mapped statement 中最重要的部分,可以使用对于数据库和 JDBC Driver 合法的任意 SQL 语句。只要 JDBC Driver 支持,可以使用任意 的函数,甚至是多条语句。因为 SQL 语句是嵌在 XML 文档中的,因此有 些特殊的字符不能直接使用,例如大于号和小于号(<>)。幸运的是,解 决的办法很简单,只需将包含特殊字符的 SQL 语句放在 XML 的 CDATA 区 里面就可以了。 例如: #value# ]]> iii. parameterClass parameterClass 属性的值是 Java 类的全限定名(即包括类的包名)。 parameterClass 属性是可选的,但强烈建议使用。它的目的是限制输入参 数的类型为指定的 Java 类,并优化框架的性能。如果使用 parameterMap, 则没有必要使用 parameterClass 属性。例如,如果要只允许 Java 类 “examples.domain.Product”作为输入参数,可以这样作: insert into PRODUCT values (#id#, #description#, #price#)