今天利用Mybatis的<for each>标签做oracle的批量插入数据时,发现和MySQL数据库有区别。在此记录下,以防之后再踩坑。

一、批量插入:

1.controller:

/*** batchSaveAccountRole 批量给角色添加用户** @param role* @return R返回类型*/@RequestMapping(value = "/batchSaveAccountRole", method = RequestMethod.PUT)@ResponseBodypublic 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
 

转载于:https://www.cnblogs.com/liuyk-code/p/7874497.html

Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除相关推荐

  1. Mybatis中Oracle和Mysql的Count字段问题

    Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...

  2. mysql pmt函数,Mybatis中Oracle和Mysql的Count字段问题

    Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...

  3. c mysql批量插入优化_MySQL实现批量插入以优化性能的教程

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  4. 批量插入数据到mysql_批量插入数据到 MySQL的几种方式

    packagecom.sb.test;import java.sql.*;importjava.util.Random;/*** 批量操作+事务提交 **/ public classJdbcInser ...

  5. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  6. mysql批量插入跟更新_Mysql批量插入和更新的性能

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  7. php mongodb 批量插入,MongoDB不支持批量插入

    mongodb的结构与关系型数据库不同,它类似树状结构,可以很方便对每个分支进行操作,但它没有像mysql那样insert(value.value.value...)那样的语法,也不支持transac ...

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

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

  9. mybatis里oracle与MySQL的insert_update

    需求:gisdata表中插入数据,如果wxid数据存在就更新,不存在就插入 Mysql的mybatis配置 1 <?xml version="1.0" encoding=&q ...

最新文章

  1. DAVID-GO-记录
  2. -webkit-font-smoothing
  3. 中山大学2016年硕士研究生入学考试复试基本分数线
  4. 成功解决 python 不是内部或外部命令,也不是可运行的程序或批处理文件
  5. VMware Tools安装和卸载
  6. C++的继承知识点重温
  7. Win32汇编——钩子
  8. ajax js java省市三级联动菜单,javaweb--json--ajax--mysql实现省市区三级联动(附三级联动数据库)(示例代码)...
  9. IEEE 802.15.4g协议介绍
  10. Google 2018 更新内容
  11. cad插入块_如何实现CAD图纸块的插入及合并操作
  12. 右键文件一直转圈卡死
  13. “大狼狗加密专家”使用简介
  14. 2022年国家社会/自然科学基金立项名单
  15. 保卫萝卜迅玩版53关php,保卫萝卜迅玩版 28关 | 手游网游页游攻略大全
  16. multisim中运放在哪找
  17. js给动态添加的元素添加属性
  18. Mandala Coloring Book Game ver 1.2 - 曼陀羅著色遊戲U3D源碼
  19. 1.1「Motoko——Basic concepts and terms Mutable state」
  20. 公共关系礼仪实务章节测试题——社会关系和公共关系(六)

热门文章

  1. MATLAB数学计算与工程分析范例教程,MATLAB数学计算与工程分析范例教程
  2. python执行命令并返回结果集_Python接口测试结果集实现封装比较
  3. cwntos新建目录挂载磁盘_centos挂载磁盘及扩展根目录
  4. 深圳网络推广公司介绍几点新网站优化守则!
  5. 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制
  6. jsonp跨域原理_【网站技术解读①】Javascript实现跨域请求
  7. python内置数据结构教程_python课程第二周 内置数据结构——列表和元组
  8. 怎么查询redis缓存的数据_阿里开发十年写出这份「Redis简明教程」+「Redis实战」请你查收...
  9. html调用js进行MD5加密,js实现md5加密
  10. 光流 速度_[论文笔记] FlowNet 光流估计