今天折騰了一下午的批量插入,差點沒辦法就用迴圈插入了,本人認為這是最不智能的一種做法了...不過最終還是搞定了..
下面給大家說幾點需要注意的地方.
我利用了iterate標籤來做的.有哪位大蝦有更好的方法一定要賜教.
先看iterate標籤幾個屬性的介紹:
prepend-加在open指定的符號之前的符號,添加在語句的前面(可選)
property-類型為ArrayList的用於遍曆的元素, 這個必須是一個IList類型(可選)
open-整個遍曆內容體開始的字串,用於定義括弧(可選)
close-整個遍曆內容體結束的字串,用於定義括弧(可選)
conjunction-每次遍曆內容之間的字串,可以空格,AND或OR(可選)
我上文中寫到得集合是ArrayList,因為IBatis.net貌似支援的集合類型只有ArrayList,貌似還不支援泛型集合,我今天搞了半天這裡.
配置批量插入的設定檔
<!--大量匯入資料-->
<insert id="AddTmpResource" parameterClass="ArrayList">
<iterate conjunction=" " open="" close="" >
<![CDATA[
<insert id="AddTest" parameterClass="ArrayList">
<iterate conjunction=" " open="" close="" >
insert into test ([tid], [tna]) values
(#[].tid#, #[].tna#)
</iterate>
</insert>
]]>
</iterate>
</insert>
說明:
parameterClass="ArrayList" 這裡一定要是ArrayList ,IBatis.net只識別這種集合類型.
<iterate conjunction=" " open="" close="" > 因為我要迴圈插入,所以這裡全部留空了,conjunction 這個一定要帶一個空格.
#[].PhoneNum# 這種格式其實就是遍曆時候的運算式,理解為 ArrayList[i].PhoneNum,之前看了一些java中的批量插入,[]之前需要放上變數名,額..這裡不要放,否則會報錯.
$[].TableName$ 我把資料庫也設定能動態,也為了說明 # 和$ 有什麼不同.
‘#’ 可以簡單理解為預留位置,類似於ADO.NET的參數化, ‘$’ 可以理解為拼接字串,用這種時候千萬要注意sql注入.
C#代碼就很簡單了..
IList arraylist = new ArrayList(); var comInput1 = new ComInput(); //繼承於IDiction<string,string> comInput1.SetPm("tid", "4"); comInput1.SetPm("tna", "4444444444"); arraylist.Add(comInput1); var comInput2
= new ComInput(); comInput2.SetPm("tid", "2"); comInput2.SetPm("tna", "2222"); arraylist.Add(comInput2); var comInput3 = new ComInput(); comInput3.SetPm("tid", "3"); comInput3.SetPm("tna", "3333333333");
arraylist.Add(comInput3); // var dao = new BaseDao(); BaseDao.SqlMapper.Insert("OrderOnline_News.AddTest", arraylist); //OrderOnline_News.AddTest啟用了ibatis.net命名空間,
當然上文提到的TableName也在這個集合中.
批次更新,子查詢都可以用這個標籤iterate.關鍵要注意的是.net中的集合!
還有更好的批量插入資料的方法的朋友不妨賜教一下..
難道IBatis.Net 不支援泛型嗎?知道的說說噢..