2.4 决策3:访问数据库
无论怎样组织和封装业务逻辑,最终你必须从数据库存取数据。在标准J2EE应用程序里,你主要有两种选择:JDBC,这需要进行大量低层的编码;实体bean,难用而且缺少有分量的特性。相比之下,使用轻量级框架最令人兴奋的是,你可以选择新的更强大的方式访问数据库,能显著减少必须编写的数据库访问相关代码量。下面,让我们来具体分析一下。
2.4.1 直接使用JDBC存在什么问题
近来,对象/关系型数据库映射框架(如JDO和Hibernate)和SQL映射框架(如iBATIS)的异军突起并非毫无根据。实际上,它们是Java社区反复受挫于JDBC的产物。为了理解新近框架产生的动因,让我们先探讨一下直接使用JDBC存在的问题。对多数应用程序来说,直接使用JDBC并非上佳选择,主要有如下3个原因。
n 开发和维护SQL困难而且耗时——一些开发人员发现编写大型、复杂的SQL语句相当困难。为反映数据库模式的变化,及时更新SQL语句也可能相当耗时。你需要仔细权衡,为了使用JDBC,损失可维护性是否值得。
n SQL缺少可移植性——由于常常需要使用数据库专有的SQL,应用程序如要处理多种数据库,你就必须编写多个版本的SQL语句,维护可能成为噩梦。即使实际应用中你
的应用程序只用到一种数据库,但由于SQL缺少可移植性,有可能因此妨碍你使用更简单、更快捷的内存数据库,如对Hypersonic结构化查询语言数据库引擎(HSQLDB)进行测试。
n 编写JDBC代码耗时而且容易出错——为获取连接、创建和初始化制备语句(Prepared Statement),并通过关闭连接和制备语句进行清理,你必须编写大量样板代码。你还必须编写代码实现Java对象和SQL语句之间的映射。JDBC代码编写起来枯燥无味,而且容易出错。
如果你的应用程序必须直接执行SQL语句,那么前两个问题就不可避免。有时,为取得最佳性能,你必须用上SQL的十八般武艺,甚至包括厂商提供的专有特性。或者,出于各种业务上的原因,你的DBA可能要求完全控制应用程序执行的SQL语句,这样一来,你就无法使用那些即时(on the fly)生成SQL语句的持久层框架。通常,公司在其关系型数据库上的投入非常巨大,以致于与数据库协作的应用程序反倒显得不那么重要了。引用iBATIS in Action作者的一段话,有时“数据库,甚至SQL本身的生命周期比应用程序源代码还长,甚至在应用程序经历了多个版本后,它们仍然健在。有些情况下,应用程序已经用另一种语言重新编写,而SQL和数据库却仍变化不大”。如果直接使用SQL把你搞得焦头烂额,算你走运,有个框架可以直接执行SQL,而且比JDBC更易使用。当然了,那就是iBATIS。
2.4.2 使用iBATIS
我开发过的所有企业Java应用程序都直接执行SQL。早期的应用程序只使用SQL,后来则使用了持久层框架,并在一些组件里使用SQL。一开始,我使用普通的JDBC执行SQL语句,不过后来,我通常自己编写小型框架处理JDBC使用中比较枯燥的部分。Spring的JDBC类我也用过一段时间,它们可以消除大量样板代码。但是无论是我自己编写的框架还是Spring类,在将Java类映射成SQL语句时都存在问题,这正是我与iBATIS不期而遇时激动不已的原因。
除了能让应用程序与连接和制备语句彻底隔绝外,iBATIS还能用XML描述符文件把JavaBean映射成SQL语句。它使用Java bean的内省机制将bean属性映射到制备语句占位符,并从ResultSet构建bean。iBATIS还支持数据库生成主键,自动加载相关对象,实现缓存及延迟加载。这样一来,
iBATIS就消除了执行SQL语句带来的大量苦差事。在后面几章,包括第9章里,你会发现iBATIS可以显著简化执行SQL语句的那部分代码。你不必再编写大量低层JDBC代码,只需编写XML描述符文件,并调用一些iBATIS API即可。
2.4.3 使用持久层框架
当然,iBATIS无法解决开发和维护SQL带来的开销,也不能弥补SQL缺少可移植性的不足。要避免这些问题,只有使用持久层框架,它可以将领域对象映射到数据库上。持久层框架提供创建、获取和删除对象的API。当应用程序游历对象之间的关系时,它能自动从数据库加载对象,并在事务结束时自动更新数据库。持久层框架通过对象/关系映射可以自动生成SQL,一般这种映射由XML文档指定,该文档定义怎样将类映射到表,属性映射到字段,以及怎样将关系映射成外键和连接表。
EJB 2也有持久层框架的功能有限的形式:实体bean。不过,EJB 2实体bean的不足实在太多,并且开发和测试也极其枯燥乏味。因此,应该尽量少用EJB 2实体bean。此外,正如我在第10章里描述的,目前还不确定EJB 3将解决多少不足。
两种最流行轻量级持久层框架是Sun公司标准JDO[JSR12][JSR243]和开源项目Hibernate。两者都提供POJO类的透明持久化。你可以直接使用POJO类开发和测试自己的业务逻辑,不用担心持久化,然后把这些类映射到数据库模式。此外,这两种框架都可以在应用服务器里面和外面运行,从而进一步简化开发。用Hibernate和JDO进行开发比用旧式的EJB2的实体bean要舒服得多。
本书有好几章描述怎样有效使用JDO和Hibernate。在第5章,你将学习如何使用JDO持久化领域模型。第6章则讨论如何使用Hibernate持久化领域模型。在第11章,你将学习如何使用JDO和Hibernate高效查询大型数据库及处理庞大的结果集。
除了决定怎样访问数据库外,你还必须决定如何处理数据库并发。下面让我们分析一下并发处理为何重要,以及可用的选项。
原文:http://book.csdn.net/bookfiles/367/10036714013.shtml