有了對iBATIS.NET配置系統的一些認識後,現在就先來簡單了解一下,iBATIS.NET是通過什麼的方式去調用映射文件的SQL語句的。這對我們接下來深入了解有很大的幫助。
對於簡單的iBatis應用場合來說,我想大部分都是集中在與SqlMapper對象打交道。這個類應該說是一個工具類,因為我們一般都是直接調用這個類的方法去執行QUID操作,但是它卻不是真正的去做這些事情。因為iBatis內部有很多的類,對象之間的關系是非常復雜的,如果讓客戶直接去使用它內部方法,無疑增加了使用的復雜性,同樣也會產生很多的冗余代碼。因此這裡它使用外觀設計模式,通過SqlMapper類封裝了iBatis執行數據庫訪問的復雜操作,包括打開一個會話(Session),獲取返回IMappedStatement對象實例,執行數據庫訪問,關閉連接等相關操作。這樣我們在使用iBatis API的時候就可以非常簡單調用的一個方法,就可以做所有的事情了。比如查詢接口public IList QueryForList(string statementName, object parameterObject),它的內部實現代碼是這樣的。
IList list1;
bool flag1 = false;
IDalSession session1 = this._sessionHolder.LocalSession;
if (session1 == null)
{
session1 = new SqlMapSession(this.DataSource);
session1.OpenConnection();
flag1 = true;
}
IMappedStatement statement1 = this.GetMappedStatement(statementName);
try
{
list1 = statement1.ExecuteQueryForList(session1, parameterObject);
}
catch
{
throw;
}
finally
{
if (flag1)
{
session1.CloseConnection();
}
}
return list1;
那這些代碼如果直接在客戶代碼中去實現,可想而知工作量會有多大。並且還法保證正確性。
以上簡單看了一個SqlMapper的作用,那該怎樣實例化這個對象呢?實例化它也是一個非常簡單的事情。在iBATIS.NET中,SqlMapper對象默認是一個單件模式的實現。通過Mapper類的靜態Instance屬性來實例化一個SqlMapper對象。這樣的設計可能有一部分是出於性能方面的考慮。因為在初始化SqlMapper對象,需要初始iBatis運行環境配置,讀取和初步解析包含的各個映射文件,所以在在系統運行時第一次調用iBATIS.NET API的時候,可能會需要比較長來處理這個配置。Mapper.Instance屬性的實現如下:
public static SqlMapper Instance()
{
if (Mapper._mapper == null)
{
lock (typeof(SqlMapper))
{
if (Mapper._mapper == null)
{
Mapper.InitMapper();
}
}
}
return Mapper._mapper;
}
所以在使用API的時候可以像下面的這麼簡單:
Mapper.Instance().Insert("ContentObject_DefaultInsert", p_dataObject);
當然,如果願意而且有必要的話,也完全可以由自己來實例化這個對象,我們可以直接使用DomSqlMapBuilder,它為我們提供這樣的擴展能力,通過它的多種實例方法都可以返回出SqlMapper對象:Build,Configure,ConfigureAndWatch。在需要用到多個數據庫或是多種不同數據庫類型的場合下,這種方法是非常有用的。
注意:在使用一個接口時,使用的statementName要在對應類型的statement類型。比如在使用Insert接口時,如果你指定的是一個select類型配置語句的話,那將會拋出異常。因為每一種statement類型都對應一種類型,比如如select 類型的配置語句對應的是SelectMappedStatement類,它是從MappedStatement繼承下來,而它的ExcuteInsert方法是這樣實現的
public override object ExecuteInsert(IDalSession session, object parameterObject)
{
throw new DataMapperException("Update statements cannot be executed as a query insert.");
}
這樣就保證了每一種語句類型的職責明確。
iBATIS.NET API基礎就向你介紹到這裡,希望對你了解iBATIS.NET API基礎有所幫助。