iBatis.Net有關ParameterMap的用法

來源:互聯網
上載者:User

在用Ado.Net進行資料庫訪問操作中,最麻煩的就是準備DbCommand必須為它添加DbParameter,特別是當要傳的參數特別多的情況下,資料訪問層的很多代碼都是花在這裡。iBatis的ParameterMap配置就是針對這個問題所提出的一種解決方案,基於xml的配置,把欄位名和對象的屬性對應起來,通過運行時的一些工作,自動為DbCommand提供它所需的參數集合。從而避免了我們直接寫很多重複代碼。

在Employees_ParameterMap.xml設定檔中:

<select id="Employees_SelectWithParameterClass" parameterClass="Employee" resultClass="Employee" listClass="ArrayList">

    SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName#

</select>

使用的是內聯參數映射的方式,語句的在執行查詢時只需為它提供Employee類型的對象,它就會自動去讀自己需要的EmployeeID,LastName屬性的值,返回查詢結果。在執行時它所執行的語句如下:

[SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID =  @param0  OR LastName =  @param1]

所需的參數的提供方式如下:

[@param0=[EmployeeID,12], @param1=[LastName,8bbb7bfb-c]]

並且,在iBatis中還會指出各個參數的類型:

[@param0=[Int32, System.Int32], @param1=[String, System.String]]

對於下面這個配置:

<select id="Employees_SelectWithParameterMap1" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList">

        SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName# OR Country = #Country#

    </select>

它所使用的ParameterMap配置如下:

    <parameterMap class="Employee" id="Employee_SelectParameterMap">

        <parameter column="EmployeeID" property="EmployeeID" dbType="int" type="int" direction="Input"/>

        <parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/>

        <parameter column="Country" property="Country" dbType="nvarchar" type="string" direction="Input"/>

    </parameterMap>

在每一個Parameter映射元素可以指定每個屬性對應的列,它的類型和對應的資料庫的類型,還可以指定當它為空白值時的預設值,具體可以參看官方文檔。但是可以看到,我們期待它能和內聯參數一樣的使用方法,如上配置的那樣。可是行不行呢?從程式的執行結果來看,是不可以的。由於之前在配置SQL語句的時候基本都是使用內聯參數沒有特別注意到這點。在使用Parameter Map的時候是不能用#property#的形式顯示地指定要使用的屬性參數,只能通過“?”,順序替代每一個parameter元素,如下:

<select id="Employees_SelectWithParameterMap2" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList">

            SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = ? OR LastName = ? OR Country = ?

    </select>

可以看到,由於沒有明顯地指出EmployeeID對應哪個屬性,那如果把上面的parameter元素調換一下,那麼EmployeeID所對應的參數值就發生變化了。同時,也是這個原因,通過這種方式的參數映射,就無法重複利用每個參數了。如果仔細觀察會發現,既然都指定了column屬性了,那它為什麼不會自動去配置呢?其實在這邊column屬性是不起作用的,它只會作用在執行預存程序的時候。也就是說上面的Parameter元素中的column屬性不是必須的。下面是一個預存程序的例子:

<procedure id="Employee_InsertWithProcedure" parameterMap="Employee_InsertParameterMap2" resultClass="int">

    InsertEmployee

</procedure>

    InsertEmployee接受兩個參數@LastName和@FirstName。我給它提供的映射參數如下:

<parameterMap class="Employee" id="Employee_InsertParameterMap2">          

    <parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/>

    <parameter column="FirstName" property="FirstName" dbType="nvarchar" type="string" direction="Input"/>

</parameterMap>

    上面這樣的配置的結果是(其中逗號後面的是值):

[@LastName=[LastName,9a8bc059-3], @FirstName=[FirstName,46887db0-2]]

但是當我把他們的位置調換了一下。它的結果如下:

[@LastName=[ FirstName,9a8bc059-3], @FirstName=[LastName,46887db0-2]]

也就是對儲存過程也是一樣的,參數映射關係仍然與parameter元素的順序息息相關的。Column屬性仍然沒有顯示出它的作用。所以使用ParameterMap還有是有一定的局限性的。但是對預存程序來說,就必須使用這樣的方式,因為它只支援ParameterMap為它提供參數,而不支援內聯參數。

最後總結列出幾點ParameterMap需要特別注意的幾個細節:

1.在配置ParameterMap的時候,如果傳入的參數對像是中繼資料類型(int,string etc),那麼在配置Parameter元素的時候,property的屬性名稱使用value。通過這種情況主要使用在為儲存指定參數的情況下。

2.如果ParameterMap中配置的parameter元素不包含在傳入參數對象中(屬性或IDictionary對象的一個key,value項),將會產生異常,而不管在statement中有沒有用到。

3.在使用parameterMap的extends屬性時,它將會繼承extends值對應的parameterMap配置,並且會繼承它的所有的參數映射,並且順序是從繼承的那配置為基準開始計算。這個在需要用到extends屬性的時候要特別注意。

4.在為預存程序傳參過程要特別注意,參數映射與預存程序的參數之間的順序對應要正確。而且必須為提供與預存程序足夠的參數(parameter配置足夠多),即使預存程序的部分參數已經有預設值了。否則將拋出System.ArgumentOutOfRangeException異常。

5.正常情況下,應該盡量使用內聯參數。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.