程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> iBATIS.NET API基礎淺析

iBATIS.NET API基礎淺析

編輯:關於JAVA

有了對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基礎有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved