自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iBATIS ParameterMap配置實(shí)例淺析

開(kāi)發(fā) 后端
iBATIS ParameterMap是能夠優(yōu)化訪問(wèn)數(shù)據(jù)庫(kù)操作而存在的,那么本文就向你介紹iBATIS ParameterMap的基本情況。

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

在Employees_ParameterMap.xml配置文件中:

  1. select id="Employees_SelectWithParameterClass" parameterClass="Employee" resultClass="Employee" listClass="ArrayList"﹥  
  2.  
  3.     SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName#  
  4.  
  5. ﹤/select﹥ 

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

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

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

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

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

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

對(duì)于下面這個(gè)配置:

  1. select id="Employees_SelectWithParameterMap1" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList"﹥  
  2.  
  3.         SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = #EmployeeID# OR LastName = #LastName# OR Country = #Country#  
  4.  
  5.     ﹤/select﹥ 

它所使用的ParameterMap配置如下:

  1. ﹤parameterMap class="Employee" id="Employee_SelectParameterMap"﹥  
  2.  
  3.     ﹤parameter column="EmployeeID" property="EmployeeID" dbType="int" type="int" direction="Input"/﹥  
  4.  
  5.     ﹤parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/﹥  
  6.  
  7.     ﹤parameter column="Country" property="Country" dbType="nvarchar" type="string" direction="Input"/﹥  
  8.  
  9. ﹤/parameterMap﹥ 

在每一個(gè)Parameter映射元素可以指定每個(gè)屬性對(duì)應(yīng)的列,它的類型和對(duì)應(yīng)的數(shù)據(jù)庫(kù)的類型,還可以指定當(dāng)它為空值時(shí)的默認(rèn)值,具體可以參看官方文檔。但是可以看到,我們期待它能和內(nèi)聯(lián)參數(shù)一樣的使用方法,如上配置的那樣??墒切胁恍心兀繌某绦虻膱?zhí)行結(jié)果來(lái)看,是不可以的。由于之前在配置SQL語(yǔ)句的時(shí)候基本都是使用內(nèi)聯(lián)參數(shù)沒(méi)有特別注意到這點(diǎn)。在使用Parameter Map的時(shí)候是不能用#property#的形式顯示地指定要使用的屬性參數(shù),只能通過(guò)“?”,順序替代每一個(gè)parameter元素,如下:

  1. select id="Employees_SelectWithParameterMap2" parameterMap="Employee_SelectParameterMap" resultClass="Employee" listClass="ArrayList"﹥  
  2.  
  3.             SELECT EmployeeID,LastName,FirstName FROM Employees WHERE EmployeeID = ? OR LastName = ? OR Country = ?  
  4.  
  5. ﹤/select﹥ 

可以看到,由于沒(méi)有明顯地指出EmployeeID對(duì)應(yīng)哪個(gè)屬性,那如果把上面的parameter元素調(diào)換一下,那么EmployeeID所對(duì)應(yīng)的參數(shù)值就發(fā)生變化了。同時(shí),也是這個(gè)原因,通過(guò)這種方式的參數(shù)映射,就無(wú)法重復(fù)利用每個(gè)參數(shù)了。如果仔細(xì)觀察會(huì)發(fā)現(xiàn),既然都指定了column屬性了,那它為什么不會(huì)自動(dòng)去配置呢?其實(shí)在這邊column屬性是不起作用的,它只會(huì)作用在執(zhí)行存儲(chǔ)過(guò)程的時(shí)候。也就是說(shuō)上面的Parameter元素中的column屬性不是必須的。下面是一個(gè)存儲(chǔ)過(guò)程的例子:

  1. ﹤procedure id="Employee_InsertWithProcedure" parameterMap="Employee_InsertParameterMap2" resultClass="int"﹥  
  2.  
  3.     InsertEmployee  
  4.  
  5. ﹤/procedure﹥ 

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

  1. ﹤parameterMap class="Employee" id="Employee_InsertParameterMap2"﹥             
  2.  
  3.     ﹤parameter column="LastName" property="LastName" dbType="nvarchar" type="string" direction="Input"/﹥  
  4.  
  5.     ﹤parameter column="FirstName" property="FirstName" dbType="nvarchar" type="string" direction="Input"/﹥  
  6.  
  7. ﹤/parameterMap﹥ 

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

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

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

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

也就是對(duì)儲(chǔ)存過(guò)程也是一樣的,參數(shù)映射關(guān)系仍然與parameter元素的順序息息相關(guān)的。Column屬性仍然沒(méi)有顯示出它的作用。所以使用ParameterMap還有是有一定的局限性的。但是對(duì)存儲(chǔ)過(guò)程來(lái)說(shuō),就必須使用這樣的方式,因?yàn)樗恢С諴arameterMap為它提供參數(shù),而不支持內(nèi)聯(lián)參數(shù)。

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

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

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

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

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

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

iBATIS ParameterMap相關(guān)的情況就介紹到這里,希望通過(guò)這樣的介紹對(duì)你掌握iBATIS ParameterMap的設(shè)計(jì)有點(diǎn)啟發(fā)。

【編輯推薦】

  1. iBATIS.NET執(zhí)行存儲(chǔ)過(guò)程實(shí)例詳解
  2. iBATIS一對(duì)多映射解析
  3. iBATIS的多對(duì)多映射配置淺析
  4. iBATIS.NET API基礎(chǔ)淺析
  5. iBATIS映射文件基礎(chǔ)淺談
責(zé)任編輯:仲衡 來(lái)源: cnblogs
相關(guān)推薦

2009-07-21 11:12:00

iBATIS配置

2009-07-22 15:01:01

iBATIS SQLM

2009-07-24 17:20:59

iBatis配置

2009-07-17 16:49:18

iBATIS XML配

2009-07-22 11:11:39

iBATIS分頁(yè)實(shí)例ObjectDataS

2009-07-22 11:27:36

iBATIS模糊查詢

2009-07-17 17:45:56

iBATIS Spri

2009-07-21 11:17:46

iBATISDAO的配置

2009-07-22 16:27:24

iBATIS配置類iBATIS操作類

2009-07-17 10:20:24

iBATIS實(shí)例

2009-07-21 17:39:50

iBATIS的多對(duì)多映

2009-07-15 17:58:07

iBATIS 動(dòng)態(tài)映射

2009-07-16 10:23:30

iBATIS工作原理

2009-07-22 10:42:59

iBATIS Cach

2009-07-17 10:32:45

iBATIS MapB

2009-07-22 10:03:11

iBATIS Resu

2009-07-16 09:14:26

iBATIS DAO

2009-07-20 18:00:16

iBATIS DAO事

2009-07-15 17:19:31

iBATIS Ecli

2009-07-20 17:01:11

Struts2.0+i
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)