ITPub博客

首页 > 数据库 > 数据库开发技术 > 使用SQLMaps进行对象关系映射

使用SQLMaps进行对象关系映射

原创 数据库开发技术 作者:rainytag 时间:2007-06-23 16:09:50 0 删除 编辑
引论

随着Hibernate逐渐成为其他架构之首,现今的许多工作都是在对象关系(OR)映射域上进行。但是,那些对象关系映射工具有一个问题:大部分数据库管理员似乎对这些对象关系(OR)映射工具所产生的查询不放心。不幸的是,这些数据库管理员不了解,架构所产生的查询是多么的优越,并且使你的应用程序更加灵活。他们觉得随着数据库成为应用程序的主要瓶颈,应该完全控制SQL查询,以便他们能分析和调试以促进性能。

但有个问题是,如果不使用对象关系(OR)映射工具,那么你将花费很多资源在书面形式上和维护低级JDBC代码。由于以下原因,每个JDBC应用程序都将含有重复代码:
1.连接和事务管理。
2.设置java对象为查询参数。
3.转换SQL ResultSets 为 java 对象。
4.生成查询字符串。

iBatis 的 SQLMaps 架构帮助我们在相当大的程度上减少了正常情况下访问关系数据库的java代码的总量。它考虑到了当前三个比较关心的问题,所以它可以将一个简单的 JavaBean 对象映射到 PreparedStatement 参数和 ResultSet 值。SQLMaps 的原理其实很简单:提供一个简单的架构来提供80%的JDBC功能。

这篇文章是关于如何使用 SQLMaps 架构的进阶辅导。我们将建立一个简单的 Struts 应用程序并且用 SQLMaps 配置它为开始。接着,我们将演示如何执行基本的数据库操作比如 SELECT, INSERT, UPDATE 等等。然后,我们将演示 SQLMaps 为连接和事务管理提供的操作。在最后,我们将试着使用一些高级的 SQLMaps 功能部件比如缓存和分页。

SQLMaps 的基本思想

使用 SQLMaps 架构,你必须建立一个XML文件列出所有你希望在应用程序中执行的SQL查询。对于每个SQL查询,你来指定哪个java类可以交换参数和ResultSet(结果集)。

在你的java代码中,如果你想要执行一个特殊的查询,你需要创建一个对象来传递查询参数和必要的条件,然后传递这个对象和查询的名字让 SQLMaps 执行。一旦查询被执行,SQLMaps 将为你指定的接受查询结果的类创建一个句柄,并且将它和数据库返回的ResultSet 中的值存储在一起。

一个简单的使用SQLMaps的应用程序(Hello World)

我们将创建一个简单的Struts应用程序开始来演示什么是使用SQLMaps的应用程序所需要的。这个例子的代码是来自以下资源部分。在这个例子中,我们用一个Jsp页面要求用户输入contactId属性。一旦它被提交,我们用它在CONTACT 表中搜索一个连接,并且用另一个Jsp页面展示给用户。接下来一步一步说明:

1. 拷贝ibatis-sqlmap-2.jar 和 ibatis-common-2.jar 到你的 web-inf/lib 文件夹中。

2. 在你的java源文件夹中创建一个 SqlMapConfig.xml 文件,像这样:





value="COM.ibm.db2.jdbc.app.DB2Driver"/>
value="jdbc:db2:SAMPLE"/>
value="db2admin"/>
value="admin2db"/>





SqlMapConfig.xml 是SQLMaps的部署描述信息,包括以下元素:

是文件的根元素。被用来定义应用程序级别的设置;例如 useStatementNamespaces 属性被用来定义是否要用准备说明的全限定名。它可以有一些另外的属性用于控制缓存和初始化;要知道更进一步的细节请查看文档。

被用来定义你想要在你的应用程序中使用的事务管理。在我们的例程中,我们要用Connection 对象的 commit 和 rollback 方法来管理事务,所以我们用JDBC作为事项管理程序。它包含 作为子元素,用来定义你要使用的连接管理的类型。在我们的例程中,我们要用SQLMaps自带的连接池实现,如此我们将使用一个SIMPLE类型的数据源。为了建立连接池,SQLMaps要求像JDBC驱动名称,URL,和密码这些信息,因此,我们使用元素来传递这些信息。稍后,我们将更加详细地讨论各种各样可用的事务和连接管理选项。

元素被用来表明 SQLMap 配置文件。这些文件,如早先讨论的,列出了你希望执行的SQL查询。

3. 创建一个JavaBean类,Contact.java,有属性 firstName, lastName 和 contactId 和相应的get、set方法。这个类将被用来向ResultSet传递查询参数并读取值。

public class Contact implements Serializable{
private String firstName;
private String lastName;
private int contactId;
//Getter setter methods for firstName,
//lastName and contactId property
}


4. 建立一个Contact.xml文件,我们将在文件中列出所有要执行的与表Contact有关的SQL查询。


type="com.sample.contact.Contact"/">



文件中使用的标签如下:

是文件的根元素。正常情况下,你的应用程序将有不止一个表,由于你要把与不同表有关的查询分开成不同的名称空间(namespace), 元素就是被用来指定在此文件中查询应被放置的名称空间。

用来说明Contact 类的全限定名的一个简称。在此说明后,这个简称可以被用来替代全限定名。

在SQLMaps架构中 resultClass="contact" cacheModel="contactCache">
select FIRSTNAME as firstName,LASTNAME as lastName
from CONTACT where CONTACTID = #contactId#


每个查询都有一个不同的缓存模型,或者几个查询共享一个缓存。SQLMaps 提供不同缓存类型的可插入的架构。cacheModel 元素的type属性指明了应该使用的实现。

LRU: 当缓存满了的时候,从缓存中移出最少用到的元素。
FIFO: 当缓存满了的时候,将建立时间最长的对象移出缓存。
MEMORY: 使用java引用类型像SOFT, WEAK 和 STRONG 来管理缓存特性。它允许垃圾收集器来决定是驻留在内存还是被销毁。这种实现应该使用在可用内存少的应用程序中。
OSCACHE: 一个OSCache2.0缓存引擎的插件。需要将oscache.properties放在根文件夹中来配置OSCache。这个实现可以被用到分布式应用程序中。

请登录后发表评论 登录
全部评论

注册时间:2008-01-01

  • 博文量
    652
  • 访问量
    2207536