溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iBATIS ParameterMap如何配置

發(fā)布時間:2021-12-07 10:50:31 來源:億速云 閱讀:140 作者:小新 欄目:編程語言

這篇文章主要介紹了iBATIS ParameterMap如何配置,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

iBATIS ParameterMap就是針對在用ADO.NET進(jìn)行數(shù)據(jù)庫訪問操作中,最麻煩的就是準(zhǔn)備DbCommand必須為它添加DbParameter,特別是當(dāng)要傳的參數(shù)特別多的情況下,數(shù)據(jù)訪問層的很多代碼都是花在那里的問題所提出的一種解決方案,基于XML的配置,把字段名和對象的屬性對應(yīng)起來,通過運行時的一些工作,自動為DbCommand提供它所需的參數(shù)集合。從而避免了我們直接寫很多重復(fù)代碼。

在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﹥

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

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

所需的參數(shù)的提供方式如下:

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

并且,在iBATIS中還會指出各個參數(shù)的類型:

[@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映射元素可以指定每個屬性對應(yīng)的列,它的類型和對應(yīng)的數(shù)據(jù)庫的類型,還可以指定當(dāng)它為空值時的默認(rèn)值,具體可以參看官方文檔。但是可以看到,我們期待它能和內(nèi)聯(lián)參數(shù)一樣的使用方法,如上配置的那樣。可是行不行呢?從程序的執(zhí)行結(jié)果來看,是不可以的。由于之前在配置SQL語句的時候基本都是使用內(nèi)聯(lián)參數(shù)沒有特別注意到這點。在使用Parameter Map的時候是不能用#property#的形式顯示地指定要使用的屬性參數(shù),只能通過“?”,順序替代每一個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對應(yīng)哪個屬性,那如果把上面的parameter元素調(diào)換一下,那么EmployeeID所對應(yīng)的參數(shù)值就發(fā)生變化了。同時,也是這個原因,通過這種方式的參數(shù)映射,就無法重復(fù)利用每個參數(shù)了。如果仔細(xì)觀察會發(fā)現(xiàn),既然都指定了column屬性了,那它為什么不會自動去配置呢?其實在這邊column屬性是不起作用的,它只會作用在執(zhí)行存儲過程的時候。也就是說上面的Parameter元素中的column屬性不是必須的。下面是一個存儲過程的例子:

﹤procedure id="Employee_InsertWithProcedure" parameterMap="Employee_InsertParameterMap2" resultClass="int"﹥       InsertEmployee   ﹤/procedure﹥

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

﹤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﹥

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

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

但是當(dāng)我把他們的位置調(diào)換了一下。它的結(jié)果如下:

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

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

***總結(jié)列出幾點ParameterMap需要特別注意的幾個細(xì)節(jié):

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

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

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

4.在為存儲過程傳參過程要特別注意,參數(shù)映射與存儲過程的參數(shù)之間的順序?qū)?yīng)要正確。而且必須為提供與存儲過程足夠的參數(shù)(parameter配置足夠多),即使存儲過程的部分參數(shù)已經(jīng)有默認(rèn)值了。否則將拋出System.ArgumentOutOfRangeException異常。

5.正常情況下,應(yīng)該盡量使用內(nèi)聯(lián)參數(shù)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“iBATIS ParameterMap如何配置”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI