1、插入

(1)第一种方式:利用<foreach>标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过)

 <insert id="insertBatchLaTContactRecord" parameterType="java.util.Map">
<selectKey resultType="java.lang.Long" keyProperty="dto.id" order="BEFORE">
select seq_LA_T_CONTACT_RECORD.nextval as id from dual
</selectKey>
insert into la_t_contact_record
(
id ,
contract_id ,
contacter_add_name ,
contacter_add_type ,
contact_add_phone ,
contact_add_home_address ,
contact_add_work ,
contact_add_work_address ,
create_by ,
create_time ,
modify_by ,
modify_time ,
validate_state ,
sys_source ,
isquery
)
select seq_LA_T_CONTACT_RECORD.NEXTVAL,A.* from(
<foreach collection="list" item="dto" index="index" separator="UNION ALL">
select
#{dto.contractId,jdbcType=VARCHAR}
,#{dto.contacterAddName,jdbcType=VARCHAR}
,#{dto.contacterAddType,jdbcType=VARCHAR}
,#{dto.contactAddPhone,jdbcType=VARCHAR}
,#{dto.contactAddHomeAddress,jdbcType=VARCHAR}
,#{dto.contactAddWork,jdbcType=VARCHAR}
,#{dto.contactAddWorkAddress,jdbcType=VARCHAR}
,#{dto.createBy,jdbcType=DECIMAL}
,systimestamp
,#{dto.modifyBy,jdbcType=DECIMAL}
,#{dto.modifyTime,jdbcType=TIMESTAMP}
,''
,#{dto.sysSource,jdbcType=VARCHAR}
,#{dto.isquery,jdbcType=VARCHAR}
from dual
</foreach>) A
</insert>

  注意:入参必须是list集合,sql语句中没有values;

(2)第二种方式:利用存储过程实现批量插入(验证过)

 <insert id="insertPlanRepaymentOtherfeeBatch" parameterType="java.util.List">
begin
<foreach collection="list" item="item" index="index">
insert into lb_t_plan_repayment_otherfee
(
id ,
key ,
value ,
term ,
contract_id,
PAY_ORDER,
FEE_NAME,
INTO_ID
)
values(SEQ_LB_T_PLAN_REPAY_OTHERFEE.nextval
,#{item.key,jdbcType=VARCHAR}
,#{item.value,jdbcType=VARCHAR}
,#{item.term,jdbcType=DECIMAL}
,#{item.contractId,jdbcType=VARCHAR}
,#{item.payOrder,jdbcType=DECIMAL}
,#{item.feeName,jdbcType=VARCHAR}
,#{item.intoId,jdbcType=VARCHAR}
);
</foreach>
end;
</insert>

  注意:入参仍然是list集合,sql中有values,本质是利用存储过程实现批量插入;

(3)第三种方式:使用特殊的sql语句(网上搜到的,待验证) 

  参考博客:http://blog.csdn.net/w_y_t_/article/details/51416201

  

  下面这条sql语句可以实现一条语句批量插入!

 INSERT ALL
INTO USERINFO(userid,username) VALUES('','Tom')
INTO USERINFO(userid,username) VALUES('','Black')
INTO USERINFO(userid,username) VALUES('','Jetty')
INTO USERINFO(userid,username) VALUES('','Cat')
SELECT 1 FROM DUAL;
 <insert id="batchInsertUser" parameterType="java.util.ArrayList">
INSERT ALL
<foreach collection="list" item="userList" index="index">
INTO USERINFO(userid,username) VALUES(#{userList.userid},#{userList.username})
</foreach>
SELECT 1 FROM DUAL
</insert>

  注意:当list的size大于500时,会失败;

2、更新

(1)第一种方式:同样是利用存储过程(网上搜索的,还是上面那个博客)

 <update id="batchUpdateUser" parameterType="java.util.ArrayList">
<foreach collection="list" item="userlist" index="index" open="begin" close=";end;" separator=";">
UPDATE USERINFO T
<set>
T.USERID = #{userlist.userid,jdbcType=VARCHAR},
T.USERNAME = #{userlist.username,jdbcType=VARCHAR},
</set>
WHERE
T.USERID = #{userlist.userid,jdbcType=VARCHAR}
</foreach>
</update>

(2)第二种方式:利用条件实现(已验证)

 <update id="updateBatchByListStat" parameterType="java.util.Map">
update la_t_advfinished t1
set t1.list_stat='',
t1.modify_time =systimestamp
where t1.id in(<foreach collection="ids" separator="," item="id">'${id}'</foreach>)
</update>

  注意:同样可以使用or的条件实现,类似于下面删除的sql;

3、删除

与更新第二种方式类似

 <delete id="deleteAttractions" parameterType="java.util.List">
delete from ATTRACTIONS
<where>
<foreach collection="list" index="index" item="item" open="(" separator="or" close=")">
id=#{item.id}
</foreach>
</where>
</delete>

Oracle+Mybatis批量插入,更新和删除的更多相关文章

  1. oracle+mybatis批量插入踩坑记

    最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下: 一.常用的两种sql写法报错 1.insert ... values ... <insert ...

  2. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  3. oracle mybatis批量插入,无匹配找默认

    批量插入<insert id="insertIndi" parameterType="java.util.HashMap" useGeneratedKey ...

  4. Oracle + Mybatis批量插入数据,xml.mapper种的写法

    1,把表中去年所有的信息全部复制作为今年的数据,即查询出去年所有的数据然后复制插入 <insert id="cover" parameterType="java.l ...

  5. springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例

    案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入.其实类似的场景还 ...

  6. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  7. mybatis批量插入oracle时报错:unique constraint (table name) violated

    mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.

  8. mybatis批量插入、批量删除

    mybatis 批量插入 int addBatch(@Param("list")List<CustInfo> list); <insert id="ad ...

  9. mybatis oracle mysql 批量插入时的坑爹问题--需谨记

    mybatis oracle mysql 批量插入一.oracle的批量插入方式insert into db(id, zgbh, shbzh) select '1', '2', '3' from du ...

随机推荐

  1. Xamarin版的C# SVG路径解析器

    原文:Xamarin版的C# SVG路径解析器 Xamarin版的C# SVG路径解析器,对SVG的Path路径进行解析,其中包括: 主程序SvgPathParser.cs, 相关接口定义:ISour ...

  2. RAC7——vip的理解

    VIP特点: 1 VIP是在clusterware安装最后阶段,通过脚本VIPCA创建的: 2 VIP作为一个Nodeapps类型的CRS Resource注册到OCR中,并由CRS维护状态: 3 V ...

  3. linux php添加ftp扩展模块

    linux php添加ftp扩展模块 进入源码目录cd php-5.2.13/ext/ftp#运行phpize生成configure/usr/local/php/bin/phpize./configu ...

  4. MFC信号量使用指南

    DEMO程序:TestSemaphore_DEMO.rar 源代码:TestSemaphore_SRC.rar ---关键代码如下--- void CTestSemaphoreDlg::OnBnCli ...

  5. Java Web Service 学习笔记

    一.服务端 1. 创建Java工程 2. 创建接口HostipalServiceInterface package ws_server; import javax.jws.WebMethod; imp ...

  6. Openwrt TTL线刷

    1.接通串口,网线: 2.打开串口软件SecureCRT: 3.按复位键,不断地出现信息: 4.2秒内按任意键停下来,出现uboot> 5.输入httpd 6.打开网页,输入ip 7.开始更新, ...

  7. linux sh文件提示 no such file or directory

    Linux执行.sh文件,提示No such file or directory的问题的解决方法 12-06-28 16:59作者:love__coder Linux执行.sh文件,提示No such ...

  8. 学习笔记之Visual Studio Team Services

    VSTS and TFS Documentation | Microsoft Docs https://docs.microsoft.com/en-us/vsts/index?view=vsts#pi ...

  9. springMVC 是单例还是的多例的?

    曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答当然是多例,要不然controller类中的非静态变量如何保证是线程安全的,这样想起似乎是对的,但是不知道( ...

  10. 最近比赛中遇到的几道dp题

    1.2015 icpc 长春-H-Partial Tree(据说是完全背包,但我觉得不像) 一.题意 给定$n$个点,每一个点$i$的权值为关于度数$d_i$的函数$f(d_i),$让你构建一棵树,使 ...