轉載請注明http://www.cnblogs.com/13590/archive/2013/02/27/2934580.html
摘要:介紹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給我們帶來的便捷和高效。