【ACCESS精品源码栏目提醒】:网学会员在ACCESS精品源码频道为大家收集整理了“【精品】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 DescriptionExternal-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.DataMapperbinDebug 下。
创建的程序集是: 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 项目的 binDebug 目录下。
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 运行时 可以找到的地方。
这两个文件的默认位置取决于项目的类型, 如下表所示:indows 应用程序,类库,测试项目(使用 NUnit 或其它等 二进制文件夹(如/bin/debug),.dll 和 app.config 所价工具) 在目录 eb 应用程序 在程序根目录,即 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 FilesMicrosoft Visual Studio 8XmlSchemas(VS.NET 2005) 或 C:Program FilesMicrosoft Visual Studio .NET 2003Common7Packagesschemasxml(VS.NET 2003) 或 C:Program FilesMicrosoft Visual Studio .NETCommon7Packagesschemasxml(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 11,从而改变了 SQL 语句的真实用意。
如果用户输入的是 5 delete fromorders,那就更糟了,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。
尽管它也可以使用其 它名称,我们在这里还是遵循约定。
下面的代码清单演示了一个示例配置文件,我们将在后面的章节中进行讨论。
ltxml versionquot1.0quot encodingquotutf-8quotgt ltsqlMapConfig xmlnsquothttp://ibatis.apache.org/dataMapperquot xmlns:xsiquothttp://www.w3.org/2001/XMLSchema-instancequot gt lt-- Optional --gt ltproperties resourcequotproperties.configquot/gt ltsettingsgt ltsetting useStatementNamespacesquotfalsequot/gt ltsetting cacheModelsEnabledquottruequot/gt ltsetting validateSqlMapquotfalsequot/gt lt/settingsgt lt-- Not required if providers.config is located in default location --gt ltproviders embeddedquotresources.providers.config IBatisNet.Testquot/gt ltdatabasegt ltprovider namequotsqlServer1.1quot/gt ltdataSource namequotNPetshopquot connectionStringquotuser idusername passwordpassword data sourcedatasource databasedatabasequot/gt lt/databasegt ltaliasgt lttypeAlias aliasquotAccountquot typequotIBatisNet.Test.Domain.Account IBatisNet.Testquot /gt lttypeAlias aliasquotYesNoBoolquot typequotIBatisNet.Test.Domain.YesNoBoolTypeHandlerCallback IBatisNet.Testquot/ gt lt/aliasgt lttypeHandlersgt lttypeHandler typequotboolquot dbTypequotVarcharquot callbackquotYesNoBoolquot/gt lt/typeHandlersgt ltsqlMapsgt ltsqlMap resourcequotrootMaps/Account.xmlquot/gt ltsqlMap resourcequotrootMaps/Category.xmlquot/gt ltsqlMap resourcequotrootMaps/Product.xmlquot/gt lt/sqlMapsgt lt/sqlMapConfiggt在接下来的几个小节中, 我们将讨论 SqlMap.config 文件的详细配置选项。
在接下来的 3 章 5, 中, (4, 6) 我们将探索在 SqlMap.xml 文件中定义的映射语句 (Mapped Statement)。
然后在第 7 章,我们将详细讨论事务管理相关的内容。
3.6.2 ltpropertiesgt元素有时,配置文件中的同一个值会出现在多处。
通常情况下,我们将程序在服务器间迁移时,某些配置选项的值要进行修改。
为了更好地管理这些配置选项的值,我们可指定一个标准的属性文件(含有 namevalue 对),将 DataMapper 的部分配置转移到其中。
在属性文件中的值将成为 shell 变量,可以在 DataMapper 配 置文件和 Data Map 定义文件中使用。
例如,如果属性文件中包含了 ltxml versionquot1.0quot encodingquotutf-8quot gt ltsettingsgt ltadd keyquotUserIdquot valuequotsaquot /gt lt/settingsgt那么在 DataMapper 配置文件(SqlMap.config)中的任何元素都可以使用变量 UserId来插入值”sa”。
例如: ltdataSource namequotNorthwindquot connectionString”UIdUserId” 使用属性文件使生成、测试、部署的过程变得简单。
3.6.2.1 ltpropertiesgt的特性(attributes)Attribute Descriptionresource 指定要从应用程序根目录加载的属性文件。
ltpropertiesresourcequotproperties.configquot/gturl 指定属性文件的绝对路径 ltpropertiesurlquotc:WebMyAppResourcesproperties.configquot/gt ‐or‐ ltpropertiesurlfile://c:WebMyAppResourcesproperties.config/gtembedded 指定要从程序集的资源中加载的属性文件。
该特性的语法 为’extendednamespace.filename assemblyName’。
3.6.2.2 ltpropertygt元素及其特性我们可以同时指定几个不同属性文件,或者使用ltpropertygt元素直接向 SqlMap.config 文件添 加键值对。
例如: ltpropertiesgt ltproperty resourcequotmyProperties.configquot /gt ltproperty resourcequotanotherProperties.configquot /gt ltproperty keyquothost.configquot keyquotibatis.comquot /gt lt/propertiesgt Attribute Description resource 指定要从应用程序根目录加载的属性文件。
resourcequotproperties.configquot url 指定属性文件的绝对路径 urlquotc:WebMyAppResourcesproperties.configquot -or- urlquotfile://c:WebMyAppResourcesproperties.configquot embedded 指定要从程序集的资源中加载的属性文件。
该特性的语法 为’extendednamespace.filename assemblyName’。
embeddedquotproperties.configIBatisInAction.Ch03Webquot key 定义一个属性键(变量)名 Keyquotusernamequot value 为指定的属性定义其值。
3.6.3 ltprovidersgt元素在 ADO.NET 中,我们通过 Provider 来访问数据库系统。
对于一个数据库系统, 可以使用特定的 Provider,也可以使用通用的 ODBC Provider。
iBATIS 的 DataMapper 使用插件的方式来使用 Provider。
每一种 Provider 都表现为一个XML 描述元素, 位于 providers.config 中。
iBATIS 的 DataMapper 发行包包含了 一个标准的 providers.config,其中一共有 13 种 Provider 元素: lt--if supportLists--gtlt--endif--gtsqlServer1.0 - Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0 lt--if supportLists--gtlt--endif--gtsqlServer1.1 -Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1 lt--if supportLists--gtOleDb1.1 - OleDb provider available with .NET Framework 1.1 lt--if supportLists--gtlt--endif--gtOdbc1.1 - Odbc provider available with .NET Framework 1.1 lt--if supportLists--gtsqlServer2.0 -Microsoft SQL Server 7.0/2000/2005 provider available with .NET Framework 2.0 lt--if supportLists--gtlt--endif--gtOleDb2.0 - OleDb provider available with .NET Framework 2.0 lt--if supportLists--gt lt--endif--gtOdbc2.0 - Odbc provider available with .NET Framework 2.0 lt--if supportLists--gtoracle9.2 - Oracle provider V9.2.0.401 lt--if supportLists--gt lt--endif--gtoracle10.1 - Oracle provider V10.1.0.301 lt--if supportLists--gt lt--endif--gtoracleClient1.0 - MS Oracle provider V1.0.5 available with .NET Framework 1.1 lt--if supportLists--gtByteFx - ByteFx MySQL provider .