iBatis.Net(C#)系列一:简介及运行环境
摘要:介绍iBatis.Net的基本情况和运行原理,运行环境中各参数的配置情况,并通过一个实例项目,详细讲解通过VS2012建立的C#项目中如何使用iBatis.Net。
关键词:iBatis.Net;C#语言;运行环境;实例
1 iBatis.Net简介
iBatis一词来源于"internet"和"abates"的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,现已成为以SQL为中心的持久化层框架。IBatis.Net是从iBatis的Java版本移植过来的.NET版本。目前项目地址为:http://code.google.com/p/mybatisnet/,可以通过项目网站下载其源代码。
iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO),其中最主要的是SQL Maps。和其它对象关系映射ORM,如Hibernate和Spring等"一站式"对象关系映射解决方案而言,iBatis则是一种"半自动化"的对象关系映射实现,它允许程序员自己控制SQL语句,为系统设计提供了更大的自由空间。
(1)SQL Maps
SQL Maps是这个框架中最重要的部分,它是整个iBATIS Database Layer的核心价值所在。通过使用SQL Maps你可以显著的节约数据库操作的代码量。SQL Maps使用一个简单的XML文件来实现从实体到SQL语句的映射。跟其它的框架或者对象关系映射工具相比,SQL Maps最大的优势就是简单。同时它需要学习的东西很少,在连接表或复杂查询时也不需要复杂的模式,使用SQL Maps,你可以自由的使用SQL语句。这种独特的数据映射模式(即Data Mapper),使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射来实现,并将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。
(2)Data Access Objects (DAO)
Data Access Objects允许你通过一个简单接口的来操作数据,从而隐藏了实现的细节。使用DAO,你可以动态配置你的应用程序来访问不同的实体存储机制。实际上DAO通过一个通用的API层把具体操作数据的细节封装了起来,使我们不再关心操作数据的细节,而把中心放在业务逻辑上,避免了ADO.NET的复杂性。如果你有一个复杂的应用需要用到几个不同的数据库,DAO可以让你建立一个一致的API,让系统的其他部分来调用。实现了应用系统的数据库无关性,是不是有点工厂模式的味道。
2 SQL Maps原理
提到SQL Maps原理,不得不提到官方帮助文档给出的一副图,如图1:
图1 iBatis的数据映射工作流程图
该图清晰的反映了iBatis的数据映射工作流程。左边是输入参数,中间为记录在sqlMap.xml文件里面的SQL映射语句被SQL Maps组件通过SqlMap.config配置文件读入,通过组件内封装的ADO.NET和数据库进行交互。输出右边的结果对象。
整个开发的重点就在XML描述的编写上,其他的工作由SQL Maps组件来完成,基本的步骤如下:
(1) 程序输入一个参数,无论是对象还是一个原生类型。参数将被用于设置SQL语句或存储过程的运行时的值
(2) 通过传送参数和在XML描述中的声明名字或者存储过程来执行映射。这一步将是关键的步骤。iBatis框架将会准备SQL语句声明或者存储过程,用参数设置运行时数据值,即带入运行数据值,执行SQL语句或者存储过程,返回结果。
(3) 和ADO.NET一样,当数据更新的时候,更新的行数将会被返回。当数据查询的时候,返回的将是一个对象或者对象的集合。结果对象或者对象的集合,可以是一个普通对象或者原生类型,通过XML描述中的参数来指定。
3 运行环境
iBatis基本的运行环境配置主要由两个文件组成,分别是SqlMap.config和providers.config。它们是必需的两个配置文件,基中SqlMap.config的功能类似于应用程序的web.config或者app.config,是iBatis核心的配置文件,靠他把XML描述文件载入给iBatis框架。默认情况下,需要把该文件放在应用程序的运行目录下并且保留它的文件名称。如果改变名称或者存放在其他目录,需要在程序里面额外手工指定。
providers.config是一个数据驱动提供类的配置文件,提供了如常见的Oracle、Sql Server、OleDb、Odbc、MySql和Informix等数据库的数据驱动,其他数据库可以通过增加相应的配置来添加。
SqlMap.config的结构如图2,包括以下一些主要的配置节,根据需要,有的配置节并不是必须的:
图2 SqlMap.config内容
(1) settings:包括有三个配置段:
<setting useStatementNamespaces="false"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="false"/>
useStatementNamespaces:是否使用语句命名空间,这里的命名空间指的是映射文件中sqlMap节点的namespace属性。即如果该参数设为"true", 语句调用时需追加命名空间,如:mapper.Update("TestApp.UpdatePost",post);否则直接通过语句名称调用即可,如mapper.Update("UpdatePost",post)。但这时一定要注意,此时需要保证所有映射文件中语句定义没有重名。可以通过变量来指定该参数设置,如:<setting useStatementNamespaces="${useStatementNamespaces}"/>,参数通过properties属性来指定,该值默认为"false"。
cacheModelsEnabled:配置是否启用iBatis的缓存机制,默认是"true"。
validateSqlMap:配置是否启用SqlMapConfig.xsd schema验证映射文件,默认是"false"。
(2) providers :配置数据驱动提供类配置文件的路径和文件名。可以通过resource(或url、embedded,它们分别是引用url和编译在程序中的资源文件)属性引用进来。如:<providers resource="providers.config"/>,这三种载入方法说明如下:
参数 |
描述 |
resource |
|
url |
|
embedded |
|
凡涉及到引用外部文件的都可以通过以上resource,url,embedded 三种方式实现。
(3) database :数据库的信息,包括使用哪些数据库驱动和数据库连接字符串的配置。provider参数定义数据库访问所使用的provider.config文件定义的provider;dataSource参数定义特定的数据库连接字符串。
(4) sqlMaps :指定XML映射文件的位置,配置中可以出现多个sqlMap节点,以指定项目内所包含的所有映射文件。如通过embedded方式指定<sqlMap embedded="sqlFile.xml, ConsoleApplication1" />。
(5) properties :配置一些常量属性,如:<property key="useStatementNamespaces" value="false"/>。如果这些属性有很多的话可以单独写一个文件里面,再通过resource(或url, embedded分别是引用url和编译在程序中的资源文件)属性引用进来
(6) alias : 类型别名的配置,为了使用更方便的使用类(类名更短),就需在这里进行别名的配置。如<alias><typeAlias alias="YesNoBool" type="IBatisNet.Test.Domain.YesNoBoolTypeHandlerCallback, IBatisNet.Test"/></alias>
(7) typeHandlers :定义数据库类型到dotnet数据类型的处理,不同的数据库都有一些特殊的数据库字段类型需要特殊处理,就可以通过这个功能实现。通过它为该类型取一个名字,并且指定对应的.NET类型来处理它。如 <typeHandlers> <typeHandler type="bool" dbType="Varchar" callback="YesNoBool"/> </typeHandlers>
以上就是Sqlmap.config的基本内容了。Provider.config文件的配置信息相对就很简单,IBatis.Net使用的是插件式结构来使用这些数据库提供程序,每一个Provider对应于providers.config文件中定义的一个provider项。提供程序要求安装相关类库,每一个provider元素都有"enabled"属性来控制是否启用这个providers。
4 日志处理
IBatis框架具有和Apache Log4Net一样的内部日志机制,记录了与数据库的交互情况。可以使用框架内置的三个记录器(NoOpLogger, ConsoleOutLogger, TraceLogger) ,或者使用像Apache Log4Net一样的外置记录包。为了让IBatis记录器工作, 必须在配置文件里 (App.Config 或者 Web.Config)配置一些节点:
注册IBatis日志处理节点和log4net节点
<configSections>
<sectionGroup name="iBATIS">
<section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
配置IBatis节点
<iBATIS>
<logging>
<logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">
<arg key="configType" value="inline"/>
</logFactoryAdapter>
</logging>
</iBATIS>
注意"<arg key="configType" value="inline" />",其Value值可以有以下几个选项:
inline :log4net 节点在App.Config或者Web.Config 文件中配置。
file:使用外置配置文件,需要configFile参数配合使用,<arg key="configFile" value="外部配置文件"。
file-watch: 与"file"一样,只是多了一个监视外部配置文件的变动功能,如果有变动则重新加载配置。
external:IBatis将不会尝试配置Log4Net。
需要特别注意一下,如果采用file-watch 外部文件配置的方式时,configFile 必须用绝对路径,不能使用相对路径。
以采用inline方式为例,我们只需要在App.config或者Web.Config中配置log4net节点,如下:
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.SimpleLayout" />
</appender>
<root>
<level value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
5 例子程序
官网上新加了一个例子程序ConsoleApplication1,可以下载来学习。为了使大家一步一步更明白项目建立过程,我们新建立一个例子程序。该例子程序功能为:通过网页输入查询参数,程序通过iBatis查询Oracle数据库信息,并把结果返回显示在页面上。
(1)建立项目
打开Visual Studio 2012,新建立一个ASP.NET Empty Web Application项目iBatisTest,Framework框架选4.0。
(2)添加引用
通过官方网站下载"IBatis.DataMapper.1.6.2.bin.zip"并解压,在项目中添加下面dll的引用:IBatisNet.Common.dll和IBatisNet.DataMapper.dll。因为要访问Oracle数据库,还需要在项目中引入System.Data.OracleClient.dll。
(3)添加IBatis环境配置文件
把解压目录下的providers.config和sample.SqlMap.config拷贝到项目根目录,并把sample.SqlMap.config改名为SqlMap.config,把两个文件加入项目。本例子程序采用"System.Data.OracleClient"连接Oracle数据库,打开providers.config,找到名称为"oracleClient1.0",修改enabled参数为"true"启用该数据库驱动配置。
(4) 建立表
在Oracle数据库中建立xxzx.post表,脚本如下:
CREATE TABLE XXZX.POST
(
ID NUMBER(10,0),
USERNAME VARCHAR2(100),
POSTTIME DATE
);
插入测试数据,insert into XXZX.POST (id,username,posttime)values(10,'管理员',sysdate);
(5)添加XML映射描述文件
向项目新增XML文件Post.xml,修改XML文件内容,如图3所示
图3 XML映射文件
(6)编写调用程序
向项目新增Web Form文件default.aspx,在页面添加控件,如图4
图4 Web页面
在default.aspx.cs增加IBatisNet.DataMapper的using应用。增加查询按钮控件事件,代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
ISqlMapper mapper = Mapper.Instance();//得到ISqlMapper实例
int para = Convert.ToInt32(TextBox1.Text);
string str = mapper.QueryForObject<string>("GetPostByID", para); //调用QueryForObject方法
Label1.Text = str;
}
编译项目,特别注意,因为是64位操作系统下,安装的Oracle客户端也是64位,需要修改调试环境,采用操作系统IIS来调试。具体操作为,打开项目属性栏,选择Web选项卡,去掉Use IIS Express选项。Project Url栏输入http://localhost/iBatisTest。
运行项目时还是会提示数据库驱动程序不对,这是因为安装的System.Data.OracleClient.dll版本和providers.config中记录的版本不一致,通过Assembly读取System.Data.OracleClient.dll文件FullName,并把该值填入providers.config文件oracleClient1.0驱动的assemblyName参数。读取代码如下:
Label2.Text = System.Reflection.Assembly.LoadFile(@"E:\IBatis.Net\文章\iBatisTest\iBatisTest\System.Data.OracleClient.dll").FullName;
运行程序,在ID值框里面输入"10",点击查询按钮,就会返回正确的查询值,结果如图5:
图5 程序运行界面
(7)增加日志记录
加入IBatisNet.Common.Logging.Log4Net.dll引用,根据IBatis日志处理机制,在web.config文件里面注册IBatis日志处理节点和log4net节点,配置IBatis节点和log4net,注意注册IBatis日志处理节点和log4net节点需放在是根 <configuration> 元素的第一个子元素。
再次运行并执行程序,在根目录就会生成log.txt文件,文件里面记录的IBatis运行是的调试信息,内容如图6所示:
图6 日志内容
一个完成的例子程序就完成了,以上程序在Windows7(64位)+VS2012+Oracle 11g(64位)上测试通过。通过例子程序我们可以看出,只要配置好XML映射文件,程序调用时只需要简单的几行代码就可以实现对数据库的查询操作,大大的简化了对ADO.NET的操作。这也是IBatis给我们带来的便捷和高效。