一、IBATIS.NET 官方网站
目前官方发布的
.NET
部分组件:
Source Revision 513437 [MD5] [PGP]
。
DataMapper
:通过配置映射关系的
xml
业务对象与
SQL
语句和存储过程进行映射。
DataAcces
:简单的说就是
IBatis
的数据访问层。
二、
IBATIS.NET
前言
IBATIS.NET 框架有助于帮助开发人员在利用.NET 进行应用程序开发时更好的使用数据库。IBATIS.NET DataMapper(数据映射)使用 XML 文件来存储数据库中的存储过程或者 SQL 语句,通过配置映射关系的xml业务对象与SQL语句和存储过程进行映射。因此,可以说 IBATIS.NET DataMapper 就是依赖于对象、XML、SQL。DataAcces简单的说就是IBATIS.NET的数据访问层。
在 IBATIS.NET DataMapper 框架下,既可以使用 SQL 基本语句,也可以使用存储过程。IBATIS.NET框架的目标就是用 20%的编码达到 80%的数据访问功能。
三、
IBATIS.NET DataMapper Version 1.6.1
的改进
(1)解决了带有 group by 的 Select 语句中 N+1 问题;
(2)通过<include/>节点标识,增加了对 SQL 片段的支持;
(3)增加了对字典查询 IDictionary<K, V> QueryForDictionary<K, V>(...) 的支持;
(4)允许存储过程无参数映射;
(5)删除了几个不再使用的方法:
Configure(XmlDocument document), Configure(),
Configure(string resource),
ConfigureAndWatch(ConfigureHandler configureDelegate),
ConfigureAndWatch(string resource, ConfigureHandler configureDelegate)
(6)允许通过扩展ISqlMapper+ ,允许使用自定义ISqlMapper;
(7)允许用户自定义缓存;
(
8
)原版本中的
QueryForPaginatedList
方法不再使用。
四、IBATIS.NET DataMapper 工作流程
说明:
(1)参数提供——把一个对象或者一个基本类型作为参数,这些参数用于运行 SQL 语句或存储过程运行时的参数。如果不需要参数,则可以省略。
(2)通过参数名称和在 XML 文档中定义的 SQL 语句或存储过程的名字执行数据映射,这个地方就是
IBATIS.NET 的奥妙所在。IBATIS.NET框架负责产生SQL 语句或存储过程,用我们提供的参数设置这些语句的变量值,然后执行语句并返回结果。
(3)在 update 操作语句中,返回受影响的行数。在查询语句中,返回一个对象或者一个对象集。
举例:
下面给出一个执行"insert” lineItem 对象命令代码的基本过程:
(1)
C#
Mapper.Instance().Insert("InsertLineItem",lineItem);
如果数据库中这个对象的表含有主键,则可以获取插入数据的主键值:
C#
int myKey = Mapper.Instance().Insert("InsertLineItem",lineItem);
(2)与"InsertLineItem"相关的 XML 描述文档:
<insert id="InsertLineItem" parameterClass="LineItem">
INSERT INTO [LinesItem]
(Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice)
VALUES
(#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#)
<selectKey type="post" resultClass="int" property="Id" >
select @@IDENTITY as value
</selectKey>
</insert>
<selectKey>
一节对于
SQL server
来说,标示将返回一个自动产生的主键值。
(3)如果需要获取多行数据,
IBATIS.NET 可以返回一个对象或者一个对象集合,每个对象对应数据行中的一行。
C#
IList productList = Mapper.Instance().QueryForList("selectProduct",categoryKey);
或者返回一个对象(一行):
C#
Product product = Mapper.Instance().QueryForObject("SelectProduct",productKey) as Product;
五、IBATIS.NET 对于工程是不是最好的选择?
IBATIS.NET是一种数据映射工具。它的作用就在把数据库查询与对象的属性间建立映射关系。如果将要开发的工程是基于业务对象(包括映射或数据字典对象),那么 IBATIS.NET可以算是个好的选择。当应用程序进行分层设计实现时,它更是个好的选择,这样的话,业务层就可以和用户界面层分开。
在上述情况下,Object/Relational Mapping(OR/M)工具也是个好的选择,如 NHibernate。但是 IBATIS.NET不是一个实体关系映射工具,它仅用于帮助程序人员建立实体和 SQL 语句或者存储过程间的映射。如果在实体和数据库表之间存在映射关系的话,OR/M 是个很好的工具。但是若映射关系是实体和数据库视图间的对应,而不是实体和基本表间的对应,则选择 OR/M 并不是很合适。如果能够编写出确定的数据库中的数据列和对象之间存在对应关系的 SQL 语句或者存储过程,则无论数据库中的数据是以哪种形式存储的,IBATIS.NET都可很好的支持。
一般来讲,下述情况下比较适合选择 OR/M 工具:
(1)对数据库有完全控制权;
(2)团队中没有数据库管理员;
(3)需要把数据库之外的问题域看作一个对象表格;
而在下属情况下,比较适合选择 IBATIS.NET:
(1)对数据库没有完全控制权,或者需要在数据库重构之后能够当作原来的数据库,继续合法访问这个它。
(2)团队中有数据库有管理员;
(3)数据库用于模拟问题域,应用程序的主要功能是帮助用户适用数据库模型;
六、
IBATIS .NET 开发指南
6.1、安装IBATIS.NET
其中,扩展 DataMapper 依赖于 Castle.DynamicProxy.dll 组件。
6.2、添加引用
IBATIS.NET组件和XML项项
根据工程的需要,向项目中添加所需的 IBATIS.NET组件的引用。既可以向 Windows、Web 项目应用程序中添加引用,也可以向类库工程中添加此组件。
IBatisNet.DataMapper.dll
IBatisNet.DataAccess.dll (可选的)
IBatisNet.Common.dll
Castle.DynamicProxy.dll
(1)在单独使用映射的情况下,只需要引用IBatisNet.DataMapper.dll;
(2)IBatisNet.Common.dll和Castle.DynamicProxy.dll 两个文件是在运行是必须的,.NET会自动添加对这两个组件的引用;
(3)如果使用Data Access 组件,则还需要添加对IBatisNet.DataAccess.dll 的引用;
完成了对组件的引用添加之后,必须向应用工程中添加三种类型的XML文档:
(1)providers.config ——DataMapper 使用此文件来确定工程使用的数据库提供者。
(2)SqlMap.xml ——一个数据映射文档,里面包含了 SQL查询。工程中会包含 1~n个数据映射文档,文件名命名如: Account.xml ,Product.xml。
(3)SqlMap.config ——这是一个DataMapper配置文档,它详细描述了工程中SqlMap.xml 文档和providers.config 文档的位置。还描述了DataMapper 的其它配置项,如caching。工程中的每种数据源公用同一个SqlMap.config 文档。
说明:
SqlMap.config 和providers.config必须放在运行DataMapper时能够找到的地方。根据工程类型的不同,这两个文件的默认存放位置有所不同。
Windows, Library--工程相应的/bin/debug目录下
Web--应用程序的根目录下
这两个文件并不是必须放在上表中所示的位置。DataMapper 提供了更加灵活方便的方式来确定其位置,后面会有相应的介绍。
6.3、在 Visual Studio.NET 环境中的集成
每一种配置文件(SqlMap.config, mappping file, providers.config)都与相应的架构文件相连。通过与架构文件的集成,就可以完成对 XML 文档格式进行验证,并在编辑这些文件时进行智能内容提示。
为了在.NET 环境中正确设置 XML 文件与架构文件的联系,需要把架构文件 SqlMap.xsd, SqlMapConfig.xsd, providers.xsd 放置在两个地方(选一种位置即可):
(1)VS.NET 工程中;
(2)VS.NET 的安装目录下;
根据.NET 版本不同,VS.NET 安装目录通常为:
C:\Program Files\Microsoft Visual Studio 10\Xml\Schemas for VS.NET 2010
或者
C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas for VS.NET 2008
或者
C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas for VS.NET 2005
或者
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xml for VS.NET 2003
或者
C:\Program Files\Microsoft Visual Studio .NET\Common7\Packages\schemas\xml for VS.NET 2002
进行了 XML 架构文件配置之后,在.NET 环境中就可以在编辑这些 XML 文档时自动进行内容语法验证和提示。重启就可以在VS IDE下编写配置文件时得到Intellisense的帮助,前提是配置的文件的第一个节点写正确的命名空间和XSD文件。
6.4、配置 DataMapper .NET
IBATIS.NET DataMapper 的配置是以命名为 SqlMap.config 的 XML 描述文件为中心进行的,该文件提供了数据源的详细内容、数据映射以及其它诸如 caching、事务、线程管理属性的内容。程序运行时,会调用 IBATIS.NET 库的一个类方法来分析 SqlMap.config 文件,分析完成之后,
IBATIS.NET 返回一个用于应用程序中 DataMapper 客户对象。
6.4.1
、
DataMapper
客户(
DataMapper clients
)
SqlMapper
类是
DataMapper
框架的核心,它是程序与
DataMapper
框架的
API
。通过创建
SqlMapper
类完成
DataMapper
客户的创建。每种配置文件对应一种数据库或者数据源。但在一个应用程序中可以使用多个
DataMapper
客户。通过创建多个配置文件,并在初始化
DataMapper
客
户的时候把配置文件名作为参数传递给框架,就可以完成在一个应用程序中使用多个
DataMapper
客户。对于多
DataMapper
客户应用系统的这些配置文件来说,可以使用不同的配置命名,而数据源却是同一个数据库,或者数据源是不同服务器上的不同数据库。那么就可以从一个
DataMapper
客户中读数据而向另一个
DataMapper
客户中写数据。下面首先来看一下
DataMapper
的配置文件。
6.4.2
、
DataMapper
配置文件(
SqlMap.XML
)
<?
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>
6.5、DataMapper 配置元素
6.5.1<properties>
在 XML 配置文件中,某些值会在多个元素中出现。当更新这些值时,如果到 XML 配置文件中去一一进行更改,不但繁琐而且容易遗漏或出错。为了帮助更好的管理这样的数值配置,我们可以单独在一个标准属性文件中定义这些值,并把此标准属性文件作为 DataMapper 的框架的一个组成部分。而且,在标准属性文件中定义的这些具有不同命名的值就可以在 DataMapper 配置文件和 Data Map 定义文件中使用。
例如:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<add key="username" value="albert" />
</settings>
那么在 DataMapper 所有的配置文件中就可以使用${username}格式来引用标准属性文件中 username 设置的值。
<dataSource connectionString="user id=${username};"
合理的使用标准属性文件可以简化工程的设计、调试和维护。
6.5.1.1<properties> attributes
<properties> 元素可以使用下表中的属性来确定标准属性文件的位置。
resource用于通过相对路径来确定标准属性文件的位置,文件路径是相对于应用程序的根目录而言的。例如:resource="properties.config"
url用于通过绝对物理路径来确定标准属性文件的位置。例如:url="c:\Web\MyApp\Resources\properties.config"
或者
embedded用于通过嵌入资源方式来确定标准属性文件的位置。嵌入属性的语法如下所示:'[扩展命名空间.]文件名,含有嵌入资源的组件名称' ,例如:embedded="Resources.properties.config,MyApp.Data"
6.5.1.2<property> 元素和属性
我们既可以声明一个或多个标准属性文件,也可以直接使用 <property> 元素在 SqlMap.config 文件中直接添加带有键(key)和键值(value)属性的<property> 元素。
<properties>
<property resource="myProperties.config"/>
<property resource="anotherProperties.config"/>
<property key="host" value="ibatis.com" />
</properties>
resource用于通过相对路径来确定标准属性文件的位置,文件路径是相对于应用程序的根目录而言的。例如:resource="properties.config"
url用于通过绝对物理路径来确定标准属性文件的位置。例如url="c:\MyApp\Resources\properties.config"
或者
embedded用于通过嵌入资源方式来确定标准属性文件的位置。嵌入属性的语法如下所示:'[扩展命名空间.]文件名,含有嵌入资源的组件名称' ,例如:embedded="Resources.properties.config,MyApp.Data"
key定义个属性变量,例如:key="username"
value设置属性变量的值,例如:value="mydbuser"