1. 程式人生 > >mybatis 批量更新(物件集合)

mybatis 批量更新(物件集合)



Mybatis批量更新

批量操作就不進行贅述了。減少伺服器與資料庫之間的互動。網上有很多關於批量插入還有批量刪除的帖子。但是批量更新卻沒有詳細的解決方案。

實現目標

這裡主要講的是1張table中。根據不同的id值,來update不同的property。

資料表:1張。Tblsupertitleresult。錯題結果統計。

表結構:

表中每一條資料必須通過兩個欄位來確定:userHhCode+titleId

需要批量更新的欄位是:correctDate,result,checkState。

1批量更新的sql語句

         我用的資料庫是mysql。其他資料庫的sql語句也都大同小異。

         用mybatis的mapper-xml進行組裝sql之前需要寫出批量操作的sql語句。

Sql:

update tblsupertitleresult set result =case

when (userHhCode=2001 and titleId=1)then  90

when (userHhCode=2001 and titleId=2)then  70

end

,checkState = case 

when (userHhCode=2001 and titleId=1)then  80

when (userHhCode=2001 andtitleId=2)then  120

end

where (userHhCode=2001 and titleId=1) or(userHhCode=2001 and titleId=2)

關於這個批量更新的sql語句做一個簡單的解釋。

要更新userHhCode=2001,titleId=1和userHhCode=2001 ,titleId=2的兩條資料。

當userHhCode=2001,titleId=1時,將result設定為90,checkState設定為80

當userHhCode=2001,titleId=2時,將result設定為80,checkState設定為120.

這是mysql語句。執行沒有問題。接下來就是mybatis的mapper-xml

Mybatis中mapper-xml

這裡,首先介紹實體類。

public classWrongTitle {

    //manipulatetable of tblsupertitleresult

    privateString titleId;

    privateString titleIdNew;

    privateString result;

    privateString checkState;

    privateString isCollect;

    privateString times;

    privateString wrongDate;

    privateString wrongNum;

    privateString collectDate;

    privateString userHhCode;

    privateString correctDate;

    privateString tid;// teacher who will review this wrong title

    privateString paperTitleId;

getter和set方法省略。

好了現在開始介紹mybatis裡面的幾個標籤。由於一些原因,mybatis的技術文件和使用者指南所介紹得並不詳細。

<foreach>標籤:foreach元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,

index指定一個名字,用於表示在迭代過程中,每次迭代到的位置,

open表示該語句以什麼開始,

separator表示在每次進行迭代之間以什麼符號作為分隔符,

close表示以什麼結束,

在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:

1.如果傳入的是單引數且引數型別是一個List的時候,collection屬性值為list;

2.如果傳入的是單引數且引數型別是一個array陣列的時候,collection的屬性值為array;

3.如果傳入的引數是多個的時候,我們就需要把它們封裝成一個Map了,當然單引數也可以封裝成map,實際上如果你在傳入引數的時候,在MyBatis裡面也是會把它封裝成一個Map的,map的key就是引數名,所以這個時候collection屬性值就是傳入的List或array物件在自己封裝的map裡面的key;

關於以上三種collection的用法。百度上有很多帖子。這裡不進行贅述。

<trim>標籤:有四個屬性:

Prefix指的是<trim></trim>所包含的部分(body)以什麼開頭。

prefixOverrides指<trim>中如果有內容時可忽略(body)前的匹配字元。

suffix指的是<trim></trim>所包含的部分(body)以什麼結尾。

suffixOverrides指<trim>中如果有內容時可忽略(body)後的匹配字元。

接下來直接上:

Mapper-xml

    <update id="batchUpdate">

            update tblsupertitleresult

            <trim prefix="set" suffixOverrides=",">

            <trim prefix="checkState =case" suffix="end,">

                <foreach collection="list" item="i"  index="index">

                        <if test="i.checkState!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.checkState}

                        </if>

                </foreach>

             </trim>

             <trim prefix=" correctDate =case"  suffix="end,">

                <foreach collection="list" item="i"  index="index">

                        <if test="i.correctDate!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.correctDate}

                        </if>

                </foreach>

             </trim>

             <trim prefix="result =case"  suffix="end,"  >

                <foreach collection="list"item="i" index="index">

                        <if test="i.result!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.result}

                        </if>

                </foreach>

             </trim>

             </trim>

            where

            <foreach collection="list" separator="or"item="i" index="index" >

             (userHhCode =#{i.userHhCode} andtitleId=#{i.titleId})

         </foreach>

</update>

接下來就是dao:

public interface DatacenterDAO{

// batch update super title_result_view

       public intbatchUpdate(List<WrongTitle> list );

Test類

public classTestBatch {

    /**

    * @param args

    */

    public static voidmain(String[] args) {

       ApplicationContext  context = newClassPathXmlApplicationContext("applicationContext.xml");

       DatacenterDAO dao = context.getBean(DatacenterDAO.class);

       ArrayList<WrongTitle> list = newArrayList<WrongTitle>();

       WrongTitle t1=new WrongTitle();

       WrongTitle t2=new WrongTitle();

       WrongTitle t3=new WrongTitle();

       WrongTitle t4=new WrongTitle();

       t1.setTitleId(3+"");

       t2.setTitleId(4+"");

       t3.setTitleId(5+"");

       t4.setTitleId(6+"");

       t1.setUserHhCode(2001+"");

       t2.setUserHhCode(2001+"");

       t3.setUserHhCode(2001+"");

       t4.setUserHhCode(2001+"");

       t1.setCheckState(5+"");

       t2.setCheckState(6+"");

       t3.setCheckState(7+"");

       t4.setCheckState(8+"");

       t1.setResult(10+"");

       t2.setResult(12+"");

       t3.setResult(14+"");

       t4.setResult(16+"");

       list.add(t1);

       list.add(t2);

       list.add(t3);

       list.add(t4);

       int i=dao.batchUpdate(list);

       System.out.println("操作了"+i+"行資料");

}

執行結果截圖: