译注:本章讲解的是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 |
该程序集包含了DataAccess和DataMapper所共用的类。 |
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),.dll和app.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
Provider。iBATIS的DataMapper使用插件的方式来使用Provider。每一种Provider都表现为一个XML描述元素,位于providers.config中。iBATIS的DataMapper发行包包含了一个标准的providers.config,其中一共有13种Provider元素:
- sqlServer1.0 - Microsoft SQL Server 7.0/2000
provider available with .NET Framework 1.0
- sqlServer1.1 -Microsoft SQL Server 7.0/2000
provider available with .NET Framework 1.1
- OleDb1.1 - OleDb provider available with
.NET Framework 1.1
- Odbc1.1 - Odbc provider available with .NET
Framework 1.1
- sqlServer2.0 -Microsoft SQL Server 7.0/2000/2005
provider available with .NET Framework 2.0
- OleDb2.0 - OleDb provider available with
.NET Framework 2.0
- Odbc2.0 - Odbc provider available with .NET
Framework 2.0
- oracle9.2 - Oracle provider V9.2.0.401
- oracle10.1 - Oracle provider V10.1.0.301
- oracleClient1.0 - MS Oracle provider V1.0.5
available with .NET Framework 1.1
- ByteFx - ByteFx MySQL provider V0.7.6.15073
- MySql - MySQL provider V1.0.4.20163
- SQLite3 - SQLite.NET provider V0.21.1869.3794
- Firebird1.7 - Firebird SQL .NET provider
V1.7.0.33200
- PostgreSql0.7 - Npgsql provider V0.7.0.0
- iDb2.10 - IBM DB2 iSeries provider V10.0.0.0
注意:如果您使用的是SQL
Server 2005,那么可以打开MARS(Multiple
Active Result Set)选项,即设置allowMARS=”true”,并在连接字符串中添加MultipleActiveResultSets=true。
providers.config文件位于DataMapper发行包的根目录。
一种Provider可能会需要您未安装的类库。因此,provider元素提供了enabled特性,这样可以将那些不用的Provider禁用。一个Provider还可以标记为”default”。
标准的providers.config文件中,sqlServer1.1设置为default,sqlServer1.0则被禁用。除了sqlServer1.1,OleDb1.1和Odbc1.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。这在调试时可能会很方便。
Example:cacheModelsEnabled=”true”
默认值
:true(启用) |
useStatementNamespaces |
如果启用该选项,那么在引用映射语句时必须总是使用完全限定的名称,即Sql
Map的命名空间和语句的id。如queryForObject(“Namespace.statementId”);
Example:useStatementNamespaces=”false”
默认值
:false(禁用) |
validateSqlMap |
该选项在全局范围内启用或禁用了针对Sql
Map文件的校验。这在调试时可能会很方便。
Example:validateSqlMap=”true”
默认值
:false(禁用) |
useReflectionOptimizer |
该选项在全局范围内启用或禁用在访问C#对象属性或字段对反射的使用。反射优化器会提供获取、生成、实例化参数和返回结果对象的类型。
Example:useReflectionOptimizer
=”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
Server,Oracle,Access,MySql和PostgreSQL数据库的例子。
<!-- 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>
提示:因为应用程序的根目录位置因项目类型而异(Windows,Web或类库),所以在使用<sqlMap>的resource特性时最好使用属性变量(在属性文件中定义)来指定相对路径。将变量定义在一个文件中会更容易维护(注意上面的${projectdir}和${root})。
3.7
小结
安装iBATIS的过程相当简单。在本章中,我们查看了两种获取框架的方法,然后是它的安装和配置。因为iBATIS被设计为简单易用,它的依赖项很少,也容易进行扩展来使用其它工具。
ADO.NET非常强大,同时也是层次很低的API,对其编写可靠(solid)的代码比较困难。使用iBATIS,您可以大大减少面对数据库组件(component)时的复杂性,而更多地关注于业务逻辑。
我们查看了iBATIS配置的一个简单例子——可能是最简单的例子了!在下章中,我们会更详细地讨论如何配置它,还有让它更好地与应用程序集成。
在本章中,我们还查看了iBATIS的配置文件(sqlMap.config)。在使用任何框架的时候,对它的基础有个好的理解都是必要的。本章就是提供了iBATIS
DataMapper基础的内容,或者说是给出了一个快速参考文档。
在本章放一张书签吧,当你遇到麻烦时回来看看。如果你在这里没找到答案,那可能需要再到其它章看看了。
在下面几章中,我们使用的.NET
API都非常短小,而框架的行为会因您的配置有所不同。我们会继续查看每一个配置选项,并使用更多的上下文和代码示例。 |