今天利用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对象没有默认的键。
当然在作为入参时可以使用@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语句一起使用。
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
 

												

Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除的更多相关文章

  1. Mybatis 插入与批量插入以及多参数批量删除

    实体类: import java.io.Serializable; public class AttachmentTable implements Serializable { private sta ...

  2. MyBatis之Oracle、Mysql批量插入

    Mybatis中Dao层 public interface UsersMapper { public void insertEntitys(List<UserEntity> users); ...

  3. mybatis中oracle转mysql

    刚来公司实习,遇到的第一个任务就是这个,简单记录一下思路过程.人菜的很,没啥参考价值. 测试时: 将现有的oracle库转为mysql: 用的Navicat自带数据传输功能,简单粗暴 出现的问题: 1 ...

  4. C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入

    1.首先我们做一下准备工作,在sql server和oracle分别建立一个Student表 oracle中 --创建Student表 -- create table Student( stuId n ...

  5. 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解

    SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...

  6. SQLServer如何在批量插入后,获取批量插入的自增列的值

    解决方法如下: Use the OUTPUT functionality to grab all the INSERTED Id back into a table. 使用output 功能获取所有插 ...

  7. mybatis中Oracle及mysql插入时自动生成主键以及返回主键

    mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...

  8. springboot + mybatis 支持oracle和mysql切换含源码

    1.springboot 启动类加入bean 如下 // DatabaseIdProvider元素主要是为了支持不同的数据库@Beanpublic DatabaseIdProvider getData ...

  9. Mybatis在oracle、mysql、db2、sql server的like模糊查询

    <!-- oracle --> <select id="searchUserBySearchName" parameterType="java.lang ...

随机推荐

  1. {Reship}{Socket}C#简单应用

    This article come frome here ======================================================================= ...

  2. Google服务,你都用了多少?

    今天无意中发现这些东西,Google提供的服务还真是多,大家经常用到的不知道有哪些呢?就我个人而言,经常用到的就是Google搜索,Gmail邮箱,还有Google论坛了. Google Ad Sen ...

  3. psd文件导出为图片教程

    美术给过来PSD文件好多层啊.怎么挨个把需要的图片导出来呢. 1. 选中 要导出的图片的图层 2.ctrl+N 新建个文档  然后把图片拉到 新的里面 然后点图像-裁剪 确定就行了,然后ctrl+s保 ...

  4. new/delete和malloc/free区别

    相同点: 都可用于申请动态内存和释放内存 不同点: 操作对象有所不同. 本质区别: malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符,对象在创建的同时要自动 ...

  5. 莫名其妙的js基础学习!

    JavaScript基本组成部分: 1,ECMAScript:js的语法标准,基本的变量,运算符,函数,if语句,for语句等 2,DOM:操作网页上的元素API,比如盒子的移动,变色,轮播图等. 3 ...

  6. 4.Python爬虫小案例

    1.网络爬虫定义:按照一定的规则,自动的抓取网站信息的程序或者脚本. 2.流程:request打开url得到html文档==浏览器打开源码分析元素节点==通过BeautifulSoup得到想要的数据= ...

  7. CentOS 6.5 下MySql主从、主主配置

    参考网站: http://blog.csdn.net/faye0412/article/details/6280761 http://blog.csdn.net/kk185800961/article ...

  8. 设计WEB数据库(学习)

    设计WEB数据库 1.考虑建模的实际对象 为现实世界的实体和关系建立模型 在上面情况下考虑建表呢? 答:如果有一组属于同一类型的数据,就可以根据这些数据创建表 2.避免保存冗余数据 原因:a.空间的浪 ...

  9. Unit07: 状态管理-Session

    Unit07: 状态管理-Session web package web; import java.io.IOException; import java.io.PrintWriter; import ...

  10. STM32的启动过程分析

    对于stm32的启动过程一直心存疑惑.今天找了很多资料,进行了一个大致的分析. 1.cortex M3的复位过程(来自官方资料) 上述开机启动流程比较详细,内容较为全面,但部分步骤可以省略(红字可省略 ...