iBatis.Net 详细使用手册 无止境 QQ 1326773142
IBatis.Net 详细使用手册
iBatis.Net 详细使用手册 无止境 QQ 1326773142
目 录
IBATIS.NET 系列(1) 总览 ......................................................................................... 1
IBATIS.NET 系列(2) 配置运行环境和日志处理 ..................................................... 4
IBATIS.NET 系列(3) 映射文件基础 ......................................................................... 9
IBATIS.NET 系列(4) IBATISNET API 基础 .......................................................... 13
IBATIS.NET 系列(5) PARAMETERMAP .............................................................. 16
IBATIS.NET 系列(6) RESULTMAP ........................................................................ 20
I
iBatis.Net 详细使用手册 无止境 QQ 1326773142
iBatis.Net 系列(1) 总览
学习和使用 Ibatisnet 已经有一段时间了,前段时间也有写过一些与 iBatis 相
关的 Blog。也答应过一些朋友要比较全面地介绍一下 iBatis,分享自己的学习过
程和使用经验,记录一些常见且容易出现的问题。但由于前段时间一直在准备考
试,而且当前的项目时间进度也比较紧,所以一直迟迟未能开始,在这里表示歉
意,希望现在开始不会晚。不过最近社区(博客园)好消息不断,我发现越来越
多的人开始关注 iBatis 了,并且也有热心网友在极力推广,如果您已经对它已经
有一些了解了,那么更推荐您去阅读 ShanYou 的文章,他写的文章可能更加适
合您。我本人也是一名初学者,这里记录的一些东西可能不会有很多的理论知识
(理论知识还不够扎实),更多的可能是突出自己学习过程中需要很长时间来解
决的一些问题,或者是个人认为特别重要,并且容易忘记的细节。水平有限,出
现错误在所难免,如在这过程中不当之处敬请愿谅,并请不啬赐教。
废话一翻后,进入今天的正题。今天的主题是 Introduction,非官方正式介绍
的中文版,更多详细的介绍请参阅官方文档。我们要使用它就必须要知道它是干
什么用的,能为我们做哪些工作,开发效率如何,执行效率如何,技术难度怎么
样。
提到 iBatis,大家可能会与 ORM 技术联系起来。是的,没错,它与 ORM 技
术有一定程度上的联系,但是更确切地讲,它并不是一种很正统的 ORM 解决方
案。因为它不像 NHibernate 那样,具备全自动的数据操作,包括查询,插入,
更新,删除;也没有像它那样,与数据库的约束关系有紧密的联系(对 NHiber
nate 的了解不多,如果有不妥之处,希望能留下你们的臭鸡蛋,等着下回用)。
iBatis 为我们提供了一种更为灵活的方便的可控的方式去实现类 ORM(Object/Rel
ation Mapping)的解决方案。我们需要自己来控制 SQL 语句,这样做有好处在于,
我们可以更灵活地根据我们的需求,编写更加具备性能,功能优势的 SQL 语句,
但它的缺点同样明显,我们还是需要管理和编写 SQL 语句。但是值得感到高兴
1
iBatis.Net 详细使用手册 无止境 QQ 1326773142
的是,我们只需要提供这些 SQL 语句,和为它提供它所需的参数外,接下来的
事情就无需我们参与了。这也是 iBatis 最核心的功能,也是它为我们所做最多的
工作了。根据配置好的 SQL 语句和参数条件,它会动态生成一条可执行的 SQL
语句,然后根据具体传进来的参数值,为这些 SQL 参数提供不同的具体值。然
后根据配置好的数据访问驱动,自动为 DbCommand 添加 DbParameter,自动执
行 SQL 语句,使用 IDataReader 返回出数据集,生成并返回一个或多个强类型数
据类对象(数据集用 IList 集合对象表示)。我曾经在 Community Server 中也见
过类似的返回强类型数据对象的实现,但是需要很多的代码,与直接返回 DataT
able 相比,重复代码会更多。所有的这些在 iBatis 中,只需要提供一个配置文件,
调用它提供的 SqlMapper 实例对象中的方法就可以很简单容易地实现了。当然你
也许会说,那这样如果系统比较大的话,可能就需要很多的配置文件了。是的,
又陷了另一个极端了。怎么办呢?没办法,鱼和熊掌不能兼得啊。这里还不得不
重点强调一下,如果你是经常在存储过程中拼接 SQL 语句的话,那我就更加推
荐你马上就开始使用 iBatis 吧。
提到数据操作,就不能不提到数据的安全性和完整性问题了,也就是数据操
作的事务问题。如果你是直接使用 Ado.net 进行事务操作的话,那您可能需要写
更多的代码了,当然我们可以使用 Enterprise Library 来简化我们的工作。那现在
通过一段简单的代码也看一下在 iBatis 中该如何实现事务吧:
using ( IDalSession session = sqlMap.BeginTransaction() )
{
Item item = (Item) sqlMap.QueryForObject("getItem", itemId);
item.Description = newDescription;
sqlMap.Update("updateItem", item);
session.Complete(); // Commit
}
就这么简单的代码,它就会帮我们自动管理事务了。这期间如果出现异常,
我们仍然可以捕获到异常信息。
2
iBatis.Net 详细使用手册 无止境 QQ 1326773142
OK,通过上面的介绍,我们已经能够了解到一个大概了。总结一下,它帮我
们自动管理和执行 SQL 语句,并且返回强类型的数据对象。从上面的一段简单
的代码中,你可能已经感觉到了它的使用有多么的简单!并且如果需要的还能够
返回生成的 DbCommand,支持我们通过它返回 DataTable 或者其它的 Ado 操作
返回。但是,这时你会马上产生另一个疑虑了,我们的工作还是很多啊,比如编
写数据类和配置文件,可能工作量并不亚于直接使用 Ado.net 返回 DataTable 所
写的代码,并且会更加的没有技术含量。所以,对于这些的代码,我们尽量能通
过一些代码生成工具(我是使用 CodeSmith)自动生成大部分,然后再根据我们
需要进行修改。
再来看看执行效率吧,尽管 iBatis 或多或少用到反射技术,但由于使用配置
文件的形式,性能影响已经降到最低了。我曾经做过一个测试,用它添加多条记
录和使用 UpdateDataSet 成批提交数据(相同的数据)的方式进行过比较,总体时
间效率不会更差,反而会更快一点。
最后不得不再提一点,它的缓存机制做得很好,相同的 SQL 语句,可以根
据不同的条件值,缓存用这个条件执行查询时的输出数据。它的缓存过期策略是
封闭的。详细细节,相信随着深入会有所涉及。
对它的介绍就先告一段落了,下一篇将会首先介绍一下它的配置工作环境,
重点在于介绍如何使用 log4net 记录日志。
3
iBatis.Net 详细使用手册 无止境 QQ 1326773142
iBatis.Net 系列(2) 配置运行环境和日志处理
现在我开始介绍一下 iBatis 的配置和日志处理吧。
iBatis 基本的运行环境配置主要由两个文件组成,分别是 SqlMap.config 和 P
roviders.config。它们是必需的两个配置文件,其中 SqlMap.config 的功能类似于
web.config 或者 app.config,是 iBatis 核心的配置文件,它的存放路径也跟应用程
序配置文件一样,必须放在应用程序的运行目录下(通常是 bin/debug 目录下)并
且它的文件名是保留的,不可改变的。而 Providers.config 是一个数据驱动提供
类的配置,它的文件名是可以随意改变的,因为通过 SqlMap.config 的一个配置
节点
可以配置它的引用。
(本人认为:SqlMap.config 和 providers.config 都可以改名,只需配置合理就
可以了)
SqlMap.config 包括以下一些主要的配置节,根据需要,有的配置节并不是
必须的:
1.properties :可以根据需要配置一些常量属性。如果这些属性有很多的话可以
单独写一个文件里面,再通过 resource(或 url, embedded 分别是引用 url 和编译
在程序中的资源文件)属性引用进来。如:
这个配置节是可选的。
2.settings:包括有三个配置段:
4
iBatis.Net 详细使用手册 无止境 QQ 1326773142
useStatementNamespaces:在文档中说明它的作用是配置在使用语句 ID 的时
候要不要加命名空间,例中${useStatementNamespaces}就是使用 properties 中的
一个属性,默认是 false。
cacheModelsEnabled 是配置要不要启用 iBatis 的缓存模型,默认是 true。
validateSqlMap 是配置要不要启示验证映射文件,默认是 false。
3.providers :配置数据驱动提供类配置文件的路径和文件名。
4.database :数据库的信息,包括使用哪些数据库驱动和数据连接字符串的配置。
connectionString 里至少含四部分内容:
1.Data Source=数据库名字;
2.Persist Security Info=True;
3.User ID=用户名;
4.Password=密码;”
5.alias :类型别名的配置,为了使用更方便的使用类(类名更短),就需在这里
进行别名的配置。
6.typeHandlers :这个就相对比较复杂些了,到目前我也没有使用到。从字面上
理解,它是一个类型的处理器,它的作用是当你使用的数据库当中有 iBatis 不支
持或不认识的字段(或者不希望默认的处理方式),那就可以为它取一个名字,
并且指定对应的.NET 类型来处理它。
5
iBatis.Net 详细使用手册 无止境 QQ 1326773142
7.sqlMaps :用来包含当前已经写好的,并且需要用到的数据类映射文件。
-->
-->
以上就是 Sqlmap.config 的基本内容了。
注意:以上凡是涉及到引用外部文件的都支持 resouce,url,embedded 三种方式。
Providers.config 的配置类很简单,在默认的 Providers.config 中已经有很多不
同数据库的数据驱动,而在 SqlMap.config 的 database 配置的 provider 属性就是
使用 Providers.config 中已有的不同驱动中的一个。以下是添加一个 Ado.net 2.0
数据访问驱动: