-
批量插入
- 输入类型(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()函数没