iBATIS In Action (三 )iBATIS的安装和配置

译注:本章讲解的是iBATIS的安装和配置,原书使用的是Java版本,与.NET版本的安装、配置过程不尽相同,因此这里直接就.NET版本进行说明。主要参考的是iBATIS官方的DataMapper Guide文档,本章的配置主要针对DataMapper,DataAccess的配置将出现在第10章。

iBATIS的安装过程快速而简单。它是一个类库,而不是应用程序,所以实际上并不需要安装,但要在应用程序中使用它还是要经过几个步骤。

如果您熟悉C#和ADO.NET,那么可能需要好好阅读本章为下面的一两章做好准备。首先,我们提供了安装和配置过程的概览,然后是该过程的详细说明。

要获取iBATIS,您有两种选择。可以下载二进制发行包,然后解压缩到一个目录中;也可以从Subversion资源库中获取一份源代码副本,手动生成它。不管采用哪种方式,最终得到的是相同的一组文件。

在得到iBATIS发行包之后,只要将需要的dll文件添加到应用程序引用中即可。

3.1 获取iBATIS发行包

3.1.1 二进制发行包

这是最快速、简单的方式。iBATIS已经预先生成好了,您只需要下载,解压缩,然后开始使用。

注意:iBATIS的二进制发行包可以在http://ibatis.apache.org/dotnetdownloads.cgi下载(这里可以下载到dll文件,源代码,实例和文档)。

3.1.2 由源代码生成

如果您有兴趣增强框架,修复bug,或者只是想通过亲自编译来了解您所得到的内容,那就可以从Subversion资源库获取一份副本,由源代码生成。第12章中我们将深入了解扩展iBATIS框架的细节,因此本节内容会比较简单,不过这些也足够您开始使用了。

注意:这里提到的Subversion(SVN)资源库是所有新的Apache项目使用的版本控制系统。Subversion是CVS的替代品。SVN的目的在于提供一个环境,使得在框架发生变化时,不用担心丢失源代码(因为每个开发人员都有一份副本,同时服务器上也存有多份拷贝)。

如果您希望更多地了解Subversion,可以访问它的主页http://subversion.tigris.org/

iBATIS的Subversion资源库地址为:http://svn.apache.org/repos/asf/ibatis/trunk/

3.2 发行包的内容

如果您获取的是源代码,那么会得到一个VS解决方案和几个C#项目。在source文件夹下有8个文件夹,构成了iBATIS.NET发行包。它们是:

 

Folder Name

Description

External-Bin

iBATIS项目所需的依赖项程序集。

IBatisNet.Common

该程序集包含了DataAccessDataMapper所共用的类。

IBatisNet.Common.Logging.Log4Net

Log4Net工厂适配器类。

IBatisNet.Common.Test

IBatisNet.Common的测试项目,可用于NUnit

IBatisNet.DataAccess

Data Access Objects框架。

IBatisNet.DataAccess.Extensions

包含一个C#项目,用于对DataAccess框架的扩展,如对NHibernate的支持。

IBatisNet.DataAccess.Test

DataAccess框架的测试项目,可用于NUnit

IBatisNet.DataMapper

DataMapper框架。

iBatisNet.DataMapper.Test

DataMapper的测试项目,可用于NUnit

 

您可以加载IBatisNet.2005.sln,生成所需的程序集。解决方案中有7个项目,应当能够顺利通过编译。我们需要的程序集位于\IBatisNet.DataMapper\bin\Debug下。创建的程序集是:

  • IBatisNet.Common.dll
  • IBatisNet.DataMapper.dll

DataMapper有一个外部依赖项:

  • Castle.DynamicProxy.dll(用于创建代理)

该dll在External-Bin文件夹中。

3.3 依赖项(略)

3.4 将iBATIS添加到应用程序

切换到您自己的应用程序,打开要使用DataMapper的项目。取决于解决方案的组织方式,项目有可能是Windows或Web应用程序,也可能是类库项目。这样可能需要项目添加一到两个引用:

  • iBatisNet.DataMapper.dll
  • iBatisNet.DataAccess.dll(可选的)
  • iBatisNet.Common.dll(隐含引用)
  • Castle.DynamicProxy.dll(隐含引用)

如果您使用的Mapper单例(singleton),那么唯一需要引用的是DataMapper程序集。IBatisNet.Common和Castle.DynamicProxy在运行时是需要的,但VS.NET会帮您解析这些依赖关系。如果使用Data Access Objects框架,那么还需要添加对DataAccess的引用。

如果您已经按前面说过的方式生成了iBatisNet,那么需要的三个程序集(IBatisNet.DataMapper.dll,IBatisNet.Common.dll,Castle.DynamicProxy.dll)都在DataMapper项目的bin\Debug目录下。

3.4.1 添加XML文件项

在添加了对程序集的引用后,下一步是向项目(可能是Windows,Web应用程序,类库或测试项目)中添加三种类型的XML文件。这些文件是:

  • providers.config – DataMapper在该文件中查找您选择的数据库Provider的定义。
  • SqlMap.xml – 包含了SQL查询的映射文件。您的项目中会包换一个或多个这种文件,其名称是自定义的,如Account.xml或Product.xml。
  • SqlMap.config – DataMapper配置文件,用于指定SqlMap.xml和providers.config文件的位置。同时还定义了其它的DataMapper配置选项,如缓存。我们需要为项目中的每个数据源编写一个SqlMap.config文件

不难理解,SqlMap.config和providers.config文件应放在DataMapper运行时可以找到的地方。这两个文件的默认位置取决于项目的类型, 如下表所示:

 

Windows应用程序,类库,测试项目(使用NUnit或其它等价工具)

二进制文件夹(如/bin/debug),.dllapp.config所在目录

Web应用程序

在程序根目录,即web.config所在处

 

3.4.2 与VS.NET集成

每一个配置文件(SqlMap.config,SQL 映射文件,providers.config)都与一个XML Schema文件关联。这种关联的好处在于,可以对文档进行验证(在运行时完成),使用编辑器的特性如智能感知/内容自动完成。

要在VS.NET的XML编辑器中的Schema和我们的配置文件之间建立关联,应该将Schema文件(SqlMap.xsd,SqlMapConfig.xsd,providers.xsd)添加到VS.NET项目或者VS.NET安装目录。显然第二种选择会让我们一劳永逸。VS.NET安装目录可能是:

C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas(VS.NET 2005)

C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml(VS.NET 2003)

C:\Program Files\Microsoft Visual Studio .NET\Common7\Packages\schemas\xml(VS.NET 2002)。

将Schema文件注册到VS.NET后,我们就可以在VS.NET中享用智能感知和配置文档验证了。


3.5 iBATIS和ADO.NET

对ADO.NET的深入讲解已经超出了本书的范围,但我们将从一个较高层次进行分析,以为本书的其它部分提供一个基础。

微软的ADO.NET的API是.NET中数据库连接的标准。ADO.NET定义了一组接口,数据库提供商需要为其数据库产品提供接口的实现(Provider),否则,开发人员无法使用,人们认为提供商的封闭是应该避免的反模式(anti-pattern)行为

3.5.1 释放ADO.NET资源

在使用ADO.NET时,容易发生获取资源,然后却忘记了正确地释放资源的问题。垃圾回收进程最终可能会释放它们,但这需要时间,而且没有保证。如果这些资源没有释放掉,应用程序最终可能会耗尽资源,进而崩溃。iBATIS框架帮助开发人员管理这些资源,从而减轻了开发人员的负担。开发人员不再需要担心资源的分配和释放,而是关注于他们需要的数据。但是,如果愿意,开发人员仍然可以手动地管理这些资源。

3.5.2 SQL注入

另一个常见的问题(在Web应用程序中更易出现)是SQL注入,它使得应用程序不以开发人员所期望的方式执行SQL。如果程序使用字符串拼接来构造SQL语句,但没有正确地过滤参数,恶意的用户传入的参数会改变查询的内容。考虑类似于select * from product where id = 5这样的例子。如果这里的5直接来自用户的输入,然后同select * from product where id =拼接,那么用户可以输入5 or 1=1,从而改变了SQL语句的真实用意。如果用户输入的是5; delete from orders,那就更糟了,SQL语句会乖乖地查询一条记录,然后将orders清空。灵活性也带来了风险,因此如果不正确地使用了iBATIS,我们的程序仍有可能会受到SQL注入的攻击。但是,iBATIS通过使用Parameter提高了程序受到此类攻击的难度(Parameter)。

只有那些使用显式的SQL字符串置换语法的语句是有风险的。考虑下面这个例子,该语句接受动态的表名和列名:

SELECT * FROM $TABLE_NAME$ WHERE $COLUMN_NAME$ = #VALUE#

这种语句在某些情况下很灵活,也很有用,却易受到SQL注入的攻击,因此要慎重使用。这不是iBATIS的问题,这样的语句无论如何执行总会面临这种问题。因此对于那些动态构造的语句,如果会受用户输入的影响,一定要对用户的输入进行验证。

3.5.3 降低复杂性

ADO.NET非常强大,同时也是层次很低的API。为了帮助您更好地理解iBATIS有哪些好处,我们做个比较。(请参看 2.2节 工作原理中的例子)

3.6 iBATIS的配置(continued

在第2章中,我们简要地浏览了iBATIS的配置(那个例子实在简单,如果您没有阅读那一节内容也不必担心)。在本节中,我们将创建SQL Map配置文件。这个文件是iBATIS的核心,如图3.1所示。

图3.1描述了iBATIS的配置,其中SqlMapConfig文件是一切的核心。

3.6.1 SQL Map配置文件

由图3.1可以清楚地看到,SQL Map配置文件(SqlMap.config)iBATIS配置的核心。从数据库连接到使用的SqlMap文件的相关配置都由此文件提供。

注意:上面说的核心配置文件名称通常为SqlMap.config。尽管它也可以使用其它名称,我们在这里还是遵循约定。

下面的代码清单演示了一个示例配置文件,我们将在后面的章节中进行讨论。

<?xml version="1.0" encoding="utf-8"?> 
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" 
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" >

  
<!-- Optional -->
  
<properties resource="properties.config"/>

  
<settings>
    
<setting useStatementNamespaces="false"/>
    
<setting cacheModelsEnabled="true"/>
    
<setting validateSqlMap="false"/>
  
</settings>

  
<!-- Not required if providers.config is located in default location -->
  
<providers embedded="resources.providers.config, IBatisNet.Test"/>

  
<database>
    
<provider name="sqlServer1.1"/>
    
<dataSource name="NPetshop" 
                connectionString
="user id=${username};
                password=${password};
                data source=${datasource};
                database=${database};"
/>
  
</database>

  
<alias>
    
<typeAlias alias="Account" type="IBatisNet.Test.Domain.Account, IBatisNet.Test"/>
    
<typeAlias alias="YesNoBool"
         type
="IBatisNet.Test.Domain.YesNoBoolTypeHandlerCallback, IBatisNet.Test"/>
  
</alias>

  
<typeHandlers>
    
<typeHandler type="bool" dbType="Varchar" callback="YesNoBool"/>
  
</typeHandlers>

  
<sqlMaps>
    
<sqlMap resource="${root}Maps/Account.xml"/>
    
<sqlMap resource="${root}Maps/Category.xml"/>
    
<sqlMap resource="${root}Maps/Product.xml"/>
  
</sqlMaps> 
</sqlMapConfig>

 

在接下来的几个小节中,我们将讨论SqlMap.config文件的详细配置选项。在接下来的3章(4,5,6)中,我们将探索在SqlMap.xml文件中定义的映射语句(Mapped Statement)。然后在第7章,我们将详细讨论事务管理相关的内容。

3.6.2 <properties>元素

有时,配置文件中的同一个值会出现在多处。通常情况下,我们将程序在服务器间迁移时,某些配置选项的值要进行修改。为了更好地管理这些配置选项的值,我们可指定一个标准的属性文件(含有name=value对),将DataMapper的部分配置转移到其中。在属性文件中的值将成为shell变量,可以在DataMapper配置文件和Data Map定义文件中使用。例如,如果属性文件中包含了

<?xml version="1.0" encoding="utf-8" ?>    
<settings>
    
<add key="UserId" value="sa" />
</settings>

 

那么在DataMapper配置文件(SqlMap.config)中的任何元素都可以使用变量${UserId}来插入值”sa”。例如:

<dataSource name="Northwind" connectionString=”UId=${UserId};”

 

使用属性文件使生成、测试、部署的过程变得简单。

3.6.2.1 <properties>的特性(attributes

 

Attribute

Description

resource

指定要从应用程序根目录加载的属性文件。

<properties resource="properties.config" />

url

指定属性文件的绝对路径

<properties url="c:\Web\MyApp\Resources\properties.config" />
-or-
<
properties url=file://c:\Web\MyApp\Resources\properties.config />

embedded

指定要从程序集的资源中加载的属性文件。该特性的语法为’[extendednamespace.]filename, assemblyName’


3.6.2.2 <property>元素及其特性

我们可以同时指定几个不同属性文件,或者使用
<property>元素直接向SqlMap.config文件添加键值对。例如:

<properties>
    
<property resource="myProperties.config" />
    
<property resource="anotherProperties.config" />
    
<property key="host.config" key="ibatis.com" />
</properties>

Attribute

Description

resource

指定要从应用程序根目录加载的属性文件。

resource="properties.config"

url

指定属性文件的绝对路径

url="c:\Web\MyApp\Resources\properties.config"

-or-

url="file://c:\Web\MyApp\Resources\properties.config"

embedded

指定要从程序集的资源中加载的属性文件。该特性的语法为’[extendednamespace.]filename, assemblyName’

embedded="properties.config, IBatisInAction.Ch03Web"

key

定义一个属性键(变量)名

Key="username"

value

为指定的属性定义其值。


3.6.3 <providers>元素

ADO.NET中,我们通过Provider来访问数据库系统。对于一个数据库系统,可以使用特定的Provider,也可以使用通用的ODBC ProvideriBATISDataMapper使用插件的方式来使用Provider。每一种Provider都表现为一个XML描述元素,位于providers.config中。iBATISDataMapper发行包包含了一个标准的providers.config,其中一共有13Provider元素:

  • <!--[if !supportLists]--><!--[endif]-->sqlServer1.0 - Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0
  • <!--[if !supportLists]--><!--[endif]-->sqlServer1.1 -Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1
  • <!--[if !supportLists]-->OleDb1.1 - OleDb provider available with .NET Framework 1.1
  • <!--[if !supportLists]--><!--[endif]-->Odbc1.1 - Odbc provider available with .NET Framework 1.1
  • <!--[if !supportLists]-->sqlServer2.0 -Microsoft SQL Server 7.0/2000/2005 provider available with .NET Framework 2.0
  • <!--[if !supportLists]--><!--[endif]-->OleDb2.0 - OleDb provider available with .NET Framework 2.0
  • <!--[if !supportLists]--> <!--[endif]-->Odbc2.0 - Odbc provider available with .NET Framework 2.0
  • <!--[if !supportLists]-->oracle9.2 - Oracle provider V9.2.0.401
  • <!--[if !supportLists]--> <!--[endif]-->oracle10.1 - Oracle provider V10.1.0.301
  • <!--[if !supportLists]--> <!--[endif]-->oracleClient1.0 - MS Oracle provider V1.0.5 available with .NET Framework 1.1
  • <!--[if !supportLists]-->ByteFx - ByteFx MySQL provider V0.7.6.15073
  • <!--[if !supportLists]--> <!--[endif]-->MySql - MySQL provider V1.0.4.20163
  • <!--[if !supportLists]-->SQLite3 - SQLite.NET provider V0.21.1869.3794
  • <!--[if !supportLists]--> <!--[endif]-->Firebird1.7 - Firebird SQL .NET provider V1.7.0.33200
  • <!--[if !supportLists]-->PostgreSql0.7 - Npgsql provider V0.7.0.0
  • <!--[if !supportLists]-->iDb2.10 - IBM DB2 iSeries provider V10.0.0.0

注意:如果您使用的是SQL Server 2005,那么可以打开MARSMultiple Active Result Set)选项,即设置allowMARS=”true”,并在连接字符串中添加MultipleActiveResultSets=true

providers.config文件位于DataMapper发行包的根目录。

一种Provider可能会需要您未安装的类库。因此,provider元素提供了enabled特性,这样可以将那些不用的Provider禁用。一个Provider还可以标记为”default”

标准的providers.config文件中,sqlServer1.1设置为defaultsqlServer1.0则被禁用。除了sqlServer1.1OleDb1.1Odbc1.1,其它的Provider默认情况下都被禁用了。因此在使用Provider前记住检查一下它的enabled特性值

重要:如果使用的数据库是MySQL,推荐使用ByteFx Provider。可以从MySQLNet站点(http://sf.net/projects/mysqlnet)下载。如果您可以接受它的license,就可以在项目中添加对其的引用,然后打开ByteFx Provider

providers.config文件期望的默认位置:

Windows应用程序,类库,测试项目(使用NUnit或其它类似工具)

程序集文件(dll)所在目录(app.config所在目录)

Web应用程序

程序根目录(web.config所在目录)

要使用该文件,您可以将其拷贝至期望的默认位置,或者是相对于项目根目录的相对路径,或指定url(绝对路径),还可以作为项目的嵌入资源。如果将其放在期望的默认位置,那么<providers>元素可以省略。

3.6.3.1 <providers>的特性

 

Attribute

Description

resource

指定providers.config文件相对于应用程序根目录的相对路径。因为根目录因项目类型而有所不同,因此最好使用属性文件来表示相对路径。

resource=”${root}providers.config”

url

指定providers.config文件的绝对路径

url="c:\Web\MyApp\Resources\ providers.config" />

-or-

url=file://c:\Web\MyApp\Resources\providers.config />

embedded

指定要从程序集的资源中加载的providers.config文件。该特性的语法为’[extendednamespace.]filename, assemblyName’

embedded=”Resources.providers.config, MyApp.Data”

 

3.6.4 <settings>元素

框架中有三个默认的设置(选项值)。对一个应用程序合适的设置可能会不适合于另一个程序。在<settings>元素中我们可以配置这些选项,对相应的DataMapper实例进行优化。每一个<settings>特性都有一个默认值,因此,您可以省略其中的特性甚至是整个<settings>元素。<settings>的特性值及其含义为:

Attribute

Description

cacheModelsEnabled

该选项在全局范围内启用或禁用一个DataMapper实例的所有Cache Model。这在调试时可能会很方便。

ExamplecacheModelsEnabled=true

默认值 true(启用)

useStatementNamespaces

如果启用该选项,那么在引用映射语句时必须总是使用完全限定的名称,即Sql Map的命名空间和语句的id。如queryForObject(“Namespace.statementId”)

ExampleuseStatementNamespaces=false

默认值 false(禁用)

validateSqlMap

该选项在全局范围内启用或禁用了针对Sql Map文件的校验。这在调试时可能会很方便。

ExamplevalidateSqlMap=true

默认值 false(禁用)

useReflectionOptimizer

该选项在全局范围内启用或禁用在访问C#对象属性或字段对反射的使用。反射优化器会提供获取、生成、实例化参数和返回结果对象的类型。

ExampleuseReflectionOptimizer =true

默认值 true(启用)


3.6.5 <typeAlias>元素

通过<typeAlias>元素,我们可以指定一个简短的别名来代替完全限定的类名。例如:

<typeAlias alias="Category" type="IBatisInAction.Domain.Category, IBatisInAction.Domain" />

这样,我们只要使用
Category就可以引用正确的类了。

注意:在iBATIS.NET中,在Data Map定义文件中,我们可以为<alias>元素指定零个或多个<typeAlias>元素。

3.6.5.1 <typeAlias>的特性

 

Attribute

Description

alias

该元素的唯一性名称

alias=”Category”

type

要代替类型的完全限定名称

type="IBatisInAction.Domain.Category, IBatisInAction.Domain"


3.6.5.1.1 type特性

在指定type特性时,它的值必须为下列形式的完全限定类型名称:

type="[namespace.class], [assembly name],
     Version=[version], Culture=[culture],
     PublicKeyToken=[public token]"

比如:

type="MyProject.Domain.LineItem, MyProject.Domain,
     Version=1.2.3300.0, Culture=neutral,
     PublicKeyToken=b03f455f11d50a3a"

强类型名称是必须的,尽管下面的形式也是合法的:

<typeAlias alias="Category" type="IBatisInAction.Domain.Category, IBatisInAction.Domain" />

3.6.5.1.2
预定义的类型别名

iBATIS
框架提供了一组预定义的类型别名,它们在DataMapper配置文件和Sql Map文件中可以使用,如下表所示:

 

CLR Type

Alias

System.ArrayList

list

System.Boolean

Boolean, bool

System.Byte

Byte, byte

System.Char

Char, char

System.DateTime

dateTime, date

System.Decimal

Decimal, decimal

System.Double

Double, double

System.Guid

guid

System.Hashtable

map, hashmap, hashtable

System.Int16

Int16, short, Short

System.Int32

Int32, int, Int, integer, Integer

System.Int64

Int64, long, Long

System.SByte

SByte, sbyte

System.Single

Float, float, Single, single

System.String

String, string

System.TimeSpan

N/A

System.UInt16

Short, short

System.UInt32

Uint, uint

System.UInt64

Ulong, ulong

 

3.6.6 <typeHandler>元素

<typeHandler>元素用于对自定义类型处理器(Custom Type Handler)的配置。Custom Type Handler扩展了DataMapper的功能,可以处理如下的情形:特定于数据库Provider的类型,数据库Provider未处理的类型,在特定程序中特殊设计。

<typeHandler type="guid" dbType="Varchar" callback="GuidVarchar" />

 

注意:在Data Map配置文件的<typeHandlers>元素中,可以包含零个或多个<typeHandler>元素。

3.6.6.1 <typeHandler>元素的特性

<typeHandler>元素有三个特性:

Attribute

Description

type

引用要处理类型的名称。

type="guid"

dbType

指定要处理的dbType

dbType="Varchar"

如果希望type handler代替iBATIS中默认type handler,那么可以省略该特性。

callback

Custom type handler类的别名。

callback="GuidVarchar"


3.6.7 <database>元素

<database>元素包含与数据库系统配置相关的子元素,它们是<provider><datasource>

3.6.7.1 <provider>元素

如果已经设置了默认的Provider,那么<provider>元素可以省略。否则,如果有好几个Provider是可用的,我们可以使用<provider>元素进行配置。

<provider name="sqlServer2.0" />

 

3.6.7.2 < datasource>元素

<datasource>元素指定了ADO.NET连接字符串。下面是针对SQL ServerOracleAccessMySqlPostgreSQL数据库的例子。

<!-- The ${properties} are defined in an external file, -->
<!-- but the values could also be coded inline. -->

<!-- Connecting to SQL Server -->
<database>
  
<provider name="sqlServer1.1" />
  
<dataSource name="NPetstore" default="true" 
       connectionString
="data source=(local)\NetSDK;database=${database};
       user id=${username};password=${password};"
/>
</database>

<!-- Connecting to Oracle -->
<database>
  
<provider name="oracleClient1.0"/>
  
<dataSource name="iBatisNet" 
       connectionString
="Data Source=${datasource};User Id=${userid};Password=${password}"/>
</database>
 
<!-- Connecting to Access -->
<database>
  
<provider name="OleDb1.1" />
  
<dataSource name="NPetstore" default="true" 
       connectionString
="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=${database}"/>
</database>

<!-- Connecting to a MySQL database --> 
<database>
  
<provider name="ByteFx" />
  
<dataSource name="NPetstore" default="true" 
       connectionString
="Host=${host};Database=${database};
       Password=${password};Username=${username}"
 />
</database>

<!-- Connecting to a PostgreSQL database --> 
<database>
  
<provider name="PostgreSql0.7" />
  
<dataSource name="NPetstore" default="true" 
       connectionString
="Server=${server};Port=5432;User Id=${userid};Password=${password};
       Database=${database};"
 />
</database>

3.6.8 <sqlMap>元素

在日常开发中,我们的工作大部分会于Data Map文件相关。这些文件定义了实际的SQL语句和存储过程,其中也包含了参数和返回结果的定义。随着应用程序规模的增大,我们可能会有多个Data Map。为了更好地组织这些Data Map,我们可以创建多个Data Map定义文件,然后在DataMapper配置文件中对它们进行统一引用。对于一个DataMapper实例,它所使用的所有Data Map定义文件都要包含在配置文件中。

下面的例子说明了如何加载(引用)一组Data Map定义文件。注意<sqlMap>元素是<sqlMaps>元素的子元素。

<!-- Relative path from the project root directory using a property variable -->
<sqlMaps>
    
<sqlMap resource="${root}Maps/Account.xml"/>
    
<sqlMap resource="${root}Maps/Category.xml"/>
    
<sqlMap resource="${root}Maps/Product.xml"/>
</sqlMaps>

<!-- Embedded resources using [extendednamespace.]filename, assemblyname -->
<sqlMaps>
    
<sqlMap embedded="Maps.Account.xml, MyApp.Data"/>
    
<sqlMap embedded="Maps.Category.xml, MyApp.Data"/>
    
<sqlMap embedded="Maps.Product.xml, MyApp.Data"/>
</sqlMaps>

<!-- Full URL with a property variable -->
<sqlMaps>
    
<sqlMap url="C:/${projectdir}/MyApp/Maps/Account.xml"/>
    
<sqlMap url="C:/${projectdir}/MyApp/Maps/Category.xml"/>
    
<sqlMap url="C:/${projectdir}/MyApp/Maps/Product.xml"/>
</sqlMaps>

 

提示:因为应用程序的根目录位置因项目类型而异(WindowsWeb或类库),所以在使用<sqlMap>resource特性时最好使用属性变量(在属性文件中定义)来指定相对路径。将变量定义在一个文件中会更容易维护(注意上面的${projectdir}${root})。

3.7 小结

安装iBATIS的过程相当简单。在本章中,我们查看了两种获取框架的方法,然后是它的安装和配置。因为iBATIS被设计为简单易用,它的依赖项很少,也容易进行扩展来使用其它工具。

ADO.NET非常强大,同时也是层次很低的API,对其编写可靠(solid)的代码比较困难。使用iBATIS,您可以大大减少面对数据库组件(component)时的复杂性,而更多地关注于业务逻辑。

我们查看了iBATIS配置的一个简单例子——可能是最简单的例子了!在下章中,我们会更详细地讨论如何配置它,还有让它更好地与应用程序集成。

在本章中,我们还查看了iBATIS的配置文件(sqlMap.config)。在使用任何框架的时候,对它的基础有个好的理解都是必要的。本章就是提供了iBATIS DataMapper基础的内容,或者说是给出了一个快速参考文档。

在本章放一张书签吧,当你遇到麻烦时回来看看。如果你在这里没找到答案,那可能需要再到其它章看看了。

 

posted @ 2011-04-08 17:25  永不放弃-Jack wu  阅读(963)  评论(0编辑  收藏  举报