Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除
今天利用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
Mybatis 针对ORACLE和MYSQL的批量插入与多参数批量删除的更多相关文章
- Mybatis 插入与批量插入以及多参数批量删除
实体类: import java.io.Serializable; public class AttachmentTable implements Serializable { private sta ...
- MyBatis之Oracle、Mysql批量插入
Mybatis中Dao层 public interface UsersMapper { public void insertEntitys(List<UserEntity> users); ...
- mybatis中oracle转mysql
刚来公司实习,遇到的第一个任务就是这个,简单记录一下思路过程.人菜的很,没啥参考价值. 测试时: 将现有的oracle库转为mysql: 用的Navicat自带数据传输功能,简单粗暴 出现的问题: 1 ...
- C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入
1.首先我们做一下准备工作,在sql server和oracle分别建立一个Student表 oracle中 --创建Student表 -- create table Student( stuId n ...
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...
- SQLServer如何在批量插入后,获取批量插入的自增列的值
解决方法如下: Use the OUTPUT functionality to grab all the INSERTED Id back into a table. 使用output 功能获取所有插 ...
- mybatis中Oracle及mysql插入时自动生成主键以及返回主键
mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...
- springboot + mybatis 支持oracle和mysql切换含源码
1.springboot 启动类加入bean 如下 // DatabaseIdProvider元素主要是为了支持不同的数据库@Beanpublic DatabaseIdProvider getData ...
- Mybatis在oracle、mysql、db2、sql server的like模糊查询
<!-- oracle --> <select id="searchUserBySearchName" parameterType="java.lang ...
随机推荐
- PHP 5.5.38 + mysql 5.0.11 + zabbix3.0 + nginx 安装
PHP 5.5.38 + mysql 5.0.11 + zabbix3.0 + nginx 1.首先在安装好环境下安装 zabbix3.0情况下 2. yum install mysql-devel ...
- Nginx+phpfastcgi下flush 一下子全部输出问题
最近由于业务需要,需要使用php的flush输出缓存刷新,处理浏览器超时问题. 最初的测试代码如下: ob_start();//打开缓冲区for ($i=10; $i>0; $i--){ ech ...
- LeetCode 739. Daily Temperatures
原题链接在这里:https://leetcode.com/problems/daily-temperatures/description/ 题目: Given a list of daily temp ...
- BZOJ4145 [AMPPZ2014]The Prices
题意 你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j],求最小总费用. \(n \leq 100,m \leq 16\) 分析 ...
- UVA12716 GCD XOR 数论数学构造
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010682557/article/details/36204645 题目给你一个N,让你求 两个数 ...
- 微软Enterprise Library 4.1和Unity 1.2
说明 微软模式与实践团队今天发布了Enterprise Library 4.1和Unity 1.2版本,这次发布的主要新特性如下: 1. 支持Visual Studio 2008 SP1 2. Uni ...
- hdu 1724 Ellipse——辛普森积分
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1724 #include<cstdio> #include<cstring> #in ...
- angular-ui-bootstrap的弹出框定义成一个服务的实践(二)
定义一个弹出框的服务:alert_box defiine(["app"],function(mainapp){ mainapp.controller('ModalInstanceC ...
- 通过Authentication Challenge来信任自签名Https证书
在开发阶段我们我们经常使用自签名的证书来部署我们的后台rest api.但是在iOS中调用的时候就会因为证书不被信任而调用api不成功.这时候我们就需要通过实现某些网络回调函数来自定义证书的验证逻辑. ...
- volatile浅析
volatile的意思是不稳定的.易变的,但在多线程中却跟字面意思一毛钱关系没有.作为一个变量修饰符,它主要有两个作用:一个是告诉大家,该变量是一个在多个线程之间均可见的变量:另一个是告诉java虚拟 ...