天天看點

MyBatis批量操作

前言:在項目中遇到了需要批量操作資料表的情況,筆者遇到的是更新操作。但在mybatis中批量操作有多種,是以在此對mybatis中的批量操作以及其注意點進行總結。

1.批量插入操作

批量插入,傳入的是一個List對象的集合,是以在mapper檔案中需要用循環的方式進行操作,具體格式如下:

<insert id="insertBatch" parameterType="java.utils.List">
       insert into tablename (xxx,xxx,xxx)
       values
        /*collection的屬性值為接口中對應的參數名稱
          (#{item.xxx},#{item.xxx},#{item.xxx}
           通過屬性的方式取得對應的值,注意小括号的使用
        */
       <foreach collection="listxxx" item="item" separator=",">
           (#{item.xxx},#{item.xxx},#{item.xxx})
       </foreach>
 </insert>      

mapper檔案對應的接口形式如下:

public void insertBatch(@Param("listxxx") List<xxx> listxxx);      

2.批量更新操作

批量更新操作,筆者總結了下面兩種方式:

①使用循環update形式【這種方式需要特别注意,需要在資料庫連接配接字元串中增加allowMultiQueries=true,不然會報異常】

<update id="batchUpdate" parameterType="java.util.List">

        <foreach collection="list" index="index" item="item" separator=";">
            update t_demo_user set
            <if test="item.userName!=null">
               user_name=#{item.userName},
            </if>
            <if test="item.gender!=null">
                gender=#{item.gender}
            </if>
             where user_id=#{item.userId}
        </foreach>
 </update>      

②使用 case 形式

<update id="batchUpdate" parameterType="java.util.List">
        UPDATE  t_demo_user
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="user_name= case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.userName !=null">
                        when user_id=#{item.userId} then #{item.userName}
                    </if>
                </foreach>
            </trim>
            <trim prefix="gender= case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.gender !=null">
                        when user_id=#{item.userId} then #{item.gender}
                    </if>
                </foreach>
            </trim>
        </trim>
        where user_id in
        <foreach collection="list" item="item" index="index" separator="," open="(" close=")">
            #{item.userId}
        </foreach>
</update>      

總結

通過以上方式可實作批量插入與批量更新,但是筆者并沒有進行效率方面的測試,也可能直接批處理效率更高。

by Shawn Chen,2018.8.8日,下午。

=========================================================

比你優秀的人比你還努力,你有什麼資格不去奮鬥!

__一個有理想的程式員。