AI智能
改变未来

oracle+mybatis批量的插入,更新,删除等等操作

  • 批量插入

  • 输入类型(parameterType)为简单的list类型, list里面可以是map(List<Map<.string,object>),可以是对象类型(List<user>)

先介绍 mybatis 中foreach循环的属性问题

1.    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.    如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

 

[code]    <insert id=\"insertBatch\" parameterType=\"list\">INSERT INTO USER_ROLE (ACTIONID,USERID,ROLEID,REMARK)<foreach collection=\"list\" item=\"copyEmp\" separator=\"UNION ALL\">SELECT #{copyEmp.actionid},#{copyEmp.userid},#{copyEmp.roleid},#{copyEmp.remark}FROM dual</foreach></insert>

注意:parameterType=list , collection=list  这里都指定为list类型, 还可以是(array,map,…)等

如果是传入一个对象类型(List<user>),那么parameterType=list改为parameterType=\”com.cf.shopdemo.entity.UserRole\”,collection还是指定为list  

 

这里还牵扯到一个 oracle的关键字  union all  有重并集 ,下面我们介绍一下这几种并集

A、UNION (无重并集):当执行UNION 时,自动去掉结果集中的重复行,并以第一列的结果进行升序排序。

B、UNION ALL (有重并集):不去掉重复行,并且不对结果集进行排序。

C、INTERSECT  (交集):取两个结果集的交集,并且以第一列的结果进行升序排列。

      select   id,name,job  from worker 

      INTERSECT

      select  empno,ename,job  fromemp;

D、MINUS  (差集):只显示在第一个集合中存在,在第二个集合中不存在的数据。并且以第一列的结果进行升序排序

 

  • 输入类型(parameterType)为map类型,map里面可以有一个list集合,还有别的插入的条件,比如说表名是动态的

 parameterType=map, map里面的键,对应表名和collection=\”键\” ,下面的例子,

map里面的键就是{\”tableName\”:\”aaaa\”},{\”list\”,存集合}, 如果这里的键list改为 arrList,那么collection=\”arrList\”

[code]    <insert id=\"insertBatch\" parameterType=\"map\">INSERT INTO ${tableName} (ACTIONID,USERID,ROLEID,REMARK)<foreach collection=\"list\" item=\"copyEmp\" separator=\"UNION ALL\">SELECT #{copyEmp.actionid},#{copyEmp.userid},#{copyEmp.roleid},#{copyEmp.remark}FROM dual</foreach></insert>
  • 还可以用到 exists / not exists函数, 用来判断主键是否存在, 存在则不执行插入操作,

 

  • 还可以插入的时候,如果这条数据主键存在就去更新,不存在就去插入

使用到merge into 关键字

[code]    <insert id=\"insOrUpdRole\" parameterType=\"com.cf.shopdemo.entity.RolePath\">MERGE INTO ROLE_PATH T1 USING<trim prefix=\"(\" suffix=\") T2\"><foreach collection=\"list\" item=\"item\" separator=\"UNION ALL\">SELECT#{item.authorid,jdbcType=VARCHAR} AS AUTHORID,#{item.roleid,jdbcType=VARCHAR} AS ROLEID,#{item.resourceid,jdbcType=VARCHAR} AS RESOURCEID,#{item.authorized,jdbcType=VARCHAR} AS AUTHORIZED,#{item.remark,jdbcType=VARCHAR} AS REMARKFROM DUAL</foreach></trim><trim prefix=\"ON (\" suffix=\")\">T1.ROLEID=T2.ROLEID andT1.RESOURCEID=T2.RESOURCEID</trim>WHEN MATCHED THENUPDATE SETT1.AUTHORIZED=T2.AUTHORIZED,T1.REMARK=T2.REMARKWHEN NOT MATCHED THENINSERT(AUTHORID,ROLEID,RESOURCEID,AUTHORIZED,REMARK)VALUES(T2.AUTHORID,T2.ROLEID,T2.RESOURCEID,T2.AUTHORIZED,T2.REMARK)</insert>

 

  • 还还可以从一个表A往B表批量复制数据

要注意的就是字段名称 和字段位置和字段类型要匹配上插入时最重要的就是注意主键冲突, 所以 在这个过程中,第一步是要挑选出两张表的差集ID,然后拿这个ID去A表中挑选出正确的数据,在插入, 看一下下面这个描述

A表(1,2,3,4)  =>  B表(2,3)   差集  =>A表(1,4)  插入到B表

 

INSERT INTO B(

WELL_ID,

STIM_ID,

START_DATE

) SELECT

A .WELL_ID,

A .STIM_ID,

A .START_DATE

FROM

A

INNER JOIN (

SELECT

WELL_ID,

STIM_ID

FROM

A

WHERE

WELL_ID IN (

\’JDl1ZpmyAN\’,

\’JD9vDsvrcY\’,

\’JDh2Cl7O1n\’

)

MINUS

SELECT

WELL_ID,

STIM_ID

FROM

B

) b ON A .well_id = b.WELL_ID

AND A .stim_id = b.STIM_ID

 

试着去理解吧,很那说清楚  = = 

经常在插入时会遇到字段长度的问题, 特别是主键. 会用到一些基本oracle函数,

比如拼接函数,cancat(值,\’ 拼接参数 \’),注意是只能拼接一次, 还有 \’值\’ || \’拼接参数 \’

比如截取字符串函数 substr(起始位置,截取多少位);

INSTR(源字符串,要查找的子字符串,起始位置,源字符串中第几次出现的子字符串)查找字符串位置

replace(源字符串, 被替换的str1, 替换的str2) 将strSource中的str1替换成str2

decode函数, decode(A,B,C,D) A是参数或者表达式, 判断是否等于B,等于B则返回C的值,

不等于则返回D, D属于缺省显示的值,

 

 

  • 批量更新

采用的是begi end; 加上foreach形成代码块,进行批量更新, 配合<set> <if> 标签一起使用

 

 

  • 批量删除

删除的方法很多, 可以是使用 IN, 可以使用begin end;代码块 可以使用or关键字, (id=1 or id=2)

error code [17004]; 无效的列类型; 此错误表示你不能为空的参数 是空的!

检查键是否正确,

to_date(\’20171220\’,\’yyyymmdd\’) 指向某个时间, 第一个参数是选择的时间

,第二个参数是时间的格式

–Oracle trunc()函数的用法

/**************日期********************/

1.select trunc(sysdate) from dual –2013-01-06 今天的日期为2013-01-06

2.select trunc(sysdate, \’mm\’) from dual –2013-01-01 返回当月第一天.

3.select trunc(sysdate,\’yy\’) from dual –2013-01-01 返回当年第一天

4.select trunc(sysdate,\’dd\’) from dual –2013-01-06 返回当前年月日

5.select trunc(sysdate,\’yyyy\’) from dual –2013-01-01 返回当年第一天

6.select trunc(sysdate,\’d\’) from dual –2013-01-06 (星期天)返回当前星期的第一天

7.select trunc(sysdate, \’hh\’) from dual –2013-01-06 17:00:00 当前时间为17:35 

8.select trunc(sysdate, \’mi\’) from dual –2013-01-06 17:35:00 TRUNC()函数没

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » oracle+mybatis批量的插入,更新,删除等等操作