ibatis 學習記錄

今年,做xx項目,分到一小塊c/s功能的編寫。爲 綜合告警——維護建議。功能很簡單,既做一個控件(由於本項目,出發點是以插件的形式來爲不同的地區提供不同的),顯示各類維護建議等等。系統中用到了ibatis,所以,在此記錄下學習和使用的過程總結。

基本知識就不說了,只記錄下一些錯誤。

1:如我們配置一個resultMap時,有這樣的話。

 <result property="VendorID" column="vendor_id"/>

請確保property後面的引號裏面沒有空格。

2:在系統中,要用到這樣的sql

 <select id="GetAlarmAdviceIdById"  resultClass="int" parameterClass="string">
      SELECT count(*) as rowCount FROM TAP_ALARM_PROPOSE WHERE ID=#ID#
    </select>

  int t = (int)mSqlMap.QueryForObject(GET_ALRAMaDVICE_ID_BY_Id, alarmAdvice.ID);

呵呵,查了n久的網,沒看到有這樣的sql的使用,記錄下:

parameterClass :爲傳入的參數。

resultClass :爲返回的結果。

3.如下異常的處理:

 The error occurred while loading SqlMap .
- initialize type alias
- The error occurred in .
...

以下是引用別人的文章: (地址:http://matrix.foresee.cn/blogs/simon/archives/cat_technic.html)

在用 iBatisNet 做 Sql 映射的時候, 發現一個疑似 Bug 的特性:

我用一個 Library Assembly 來放置所有的 Domain 文件, 用另一個 Assembly 來放置執行文件 (Exe) 和 Maps Xml 文件。發現: iBatisNet 不能自動載入 Domain 所在的 Assembly, 如果我在初始化 SqlMap 之前沒有引用過 Domain 所在的 Assembly, 則會拋出如下異常:
- The error occurred while loading SqlMap .
- initialize type alias
- The error occurred in .
...

如果我在初始化 SqlMap 之前引用了 Domain 裏的任一個類, 比如 new 一個 Domain 實例, 則不會拋出該異常.

經跟蹤 iBatisNet 源代碼, 找到了這個問題的原因, 問題出在 IBatisNet.Common 的 Utilities/TypeResolver.cs 的 public virtual Type Resolve (string typeName) 方法, 它在解析 Map 文件定義的 Map 類型的時候, 要根據逗號分隔符來找到 Assembly Name 載入, 如果定義的 Type 沒有逗號和逗號後的 Assembly Name 就會在 AppDomain 的 Assembly 裏找, 因爲此前沒有載入過 Domain Assembly 所有就會報錯。解決辦法很簡單, 在定義 Map 文件的時候把類型寫全就是了, 例如:


< typeAlias alias="ClassA" assembly="DomainAssembly.dll" type="DomainAssembly.ClassA" / >

改成
< typeAlias alias="ClassA" assembly="DomainAssembly.dll" type="DomainAssembly.ClassA, DomainAssembly" / >

這樣就不會再要求初始化 SqlMap 前 AppDomain 一定要載入 Domain Assembly 了。這不是 Bug, 是 IBatisNet 給的例子沒有這麼做而誤導了羣衆。

 

發佈了38 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章