今天利用Mybatis的<for each>標簽做oracle的批量插入數據時,發現和MySQL數據庫有區別。在此記錄下,以防之后再踩坑。
一、批量插入:
1.controller:
/**
* 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):
<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的版本中,有幾點需要注意的:
1.SQL中沒有VALUES;
2.<foreach>標簽中的(selece ..... from dual);
3.<foreach>標簽中的separator的屬性為"UNION ALL",將查詢合並結果集。
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>
二、批量刪除:
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>
三、總結:
1.<for each> 標簽的屬性:
| 屬性 | 描述 |
| item | 循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。 具體說明:在list和數組中是其中的對象,在map中是value。 該參數為必選。 |
| collection | 要做foreach的對象,作為入參時,List<?>對象默認用list代替作為鍵,數組對象有array代替作為鍵,Map對象沒有默認的鍵。 |
| 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語句一起使用。
1、查看當前用戶
select user from dual
2、用來調用系統函數
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;--獲得一個隨機數
3、得到序列的下一個值或當前值,用下面語句
select your_sequence.nextval from dual;--獲得序列your_sequence的下一個值
select your_sequence.currval from dual;--獲得序列your_sequence的當前值
4、可以用做計算器
select 7*9 from dual;
5、查空值
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
