Mybatis 針對ORACLE和MYSQL的批量插入與多參數批量刪除

  今天利用Mybatis的<for each>標籤作oracle的批量插入數據時,發現和MySQL數據庫有區別。在此記錄下,以防以後再踩坑。html

1、批量插入:java

1.controller:sql

/**
     * batchSaveAccountRole 批量給角色添加用戶
     *
     * @param role
     * @return R返回類型
     */
    @RequestMapping(value = "/batchSaveAccountRole", method = RequestMethod.PUT)
    @ResponseBody
    public R batchSaveAccountRole(@RequestBody List<RoleAccount> roleAccountList) {
        R r = R.ok();
        if (roleAccountList != null) {
            int row = roleService.batchSaveAccountRole(roleAccountList);
            r = R.ok(row + "");
        }
        return r;
    }

2.service:數據庫

public int batchSaveAccountRole(List<RoleAccount> roleAccountList) {
		return roleDao.batchSaveAccount2Role(roleAccountList);
}

3.dao:數組

int batchSaveAccount2Role(List<RoleAccount> roleAccountList);

4.mapper(Oracle):oracle

<insert id="batchSaveAccount2Role" parameterType="java.util.List">
     	INSERT INTO SYSTEM_ACCOUNT_ROLES (role_id, account_id)
     	<foreach close=")" collection="list" item="item" open="(" separator="union all">
			select
			#{item.roleId},#{item.accountId}
			from dual
	</foreach> 
</insert>

 

  在Oracle的版本中,有幾點須要注意的:app

 

  1.SQL中沒有VALUES;dom

 

  2.<foreach>標籤中的(selece ..... from dual);函數

 

  3.<foreach>標籤中的separator的屬性爲"UNION ALL",將查詢合併結果集。post

 

5.mapper(MySQL):

<insert id="batchSaveAccount2Role" parameterType="java.util.List">
     	INSERT INTO SYSTEM_ACCOUNT_ROLES (role_id, account_id) values
     	<foreach collection="list" item="item" separator=",">
		(#{item.roleId},#{item.accountId})
	</foreach> 
</insert>

2、批量刪除:

1.controller:

 /**
     * 根據角色批量刪除用戶
     *
     * @param ids 惟一ID列表
     * @return R 返回類型
     */
    @RequestMapping(value = "/batchDeleteAccount2Role", method = RequestMethod.PUT)
    @ResponseBody
    @GeckoAuthority(codes = {"GECKO_SYSTEM_ROLES_DELETE"})
    public R batchDeleteAccount2Role(@RequestBody List<RoleAccount> roleAccountList) {
    	 R r = R.ok();
         if (roleAccountList != null) {
             int row = roleService.batchDeleteAccount2Role(roleAccountList);
             r = R.ok(row + "");
         }
         return r;
    }

2.service:

public int batchDeleteAccount2Role(List<RoleAccount> roleAccountList) {
		String roleId = roleAccountList.get(0).getRoleId();
		return roleDao.batchDeleteAccount2Role(roleId,roleAccountList);
}

3.dao:

int batchDeleteAccount2Role(@Param("roleId")String roleId, @Param("list")List<RoleAccount> roleAccountList);

4.mapper:

<delete id="batchDeleteAccount2Role">
     	delete from SYSTEM_ACCOUNT_ROLES where role_id =  #{roleId} and account_id IN
        <foreach collection="list" item="item" open="(" close=")" separator=",">
            #{item.accountId}
        </foreach> 
</delete>

3、總結:

 1.<for each> 標籤的屬性:

屬性 描述
item 循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。
具體說明:在list和數組中是其中的對象,在map中是value。
該參數爲必選。
collection

要作foreach的對象,做爲入參時,List<?>對象默認用list代替做爲鍵,數組對象有array代替做爲鍵,Map對象沒有默認的鍵。
固然在做爲入參時可使用@Param("keyName")來設置鍵,設置keyName後,list,array將會失效。 除了入參這種狀況外,還有一種做爲參數對象的某個字段的時候。舉個例子:
若是User有屬性List ids。入參是User對象,那麼這個collection = "ids"
若是User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id"
上面只是舉例,具體collection等於什麼,就看你想對那個元素作循環。
該參數爲必選。

separator 元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用「,「隔開,避免手動輸入逗號致使sql錯誤,如in(1,2,)這樣。該參數可選。
open foreach代碼的開始符號,通常是(和close=")"合用。經常使用在in(),values()時。該參數可選。
close foreach代碼的關閉符號,通常是)和open="("合用。經常使用在in(),values()時。該參數可選。
index 在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選。

2.Oracle dual表的使用:

dual表是一個虛擬表,用來和select語句一塊兒使用。
一、查看當前用戶
select  user from dual
二、用來調用系統函數
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual ----獲得當前系統時間

select SYS_CONTEXT('USERENV','TERMINAL') from dual;--得到主機名

select SYS_CONTEXT('USERENV','language') from dual;--得到當前locale

select dbms_random.random from dual;--得到一個隨機數

三、獲得序列的下一個值或當前值,用下面語句

select your_sequence.nextval from dual;--得到序列your_sequence的下一個值

select your_sequence.currval from dual;--得到序列your_sequence的當前值

四、能夠用作計算器

select 7*9 from dual;

五、查空值
select  null extattrid,null extattrname from dual union all select  extattrid,extattrname from VExtAttrDetail where extattrsn in (22)

 詳見:http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html
相關文章
相關標籤/搜索