前言
Mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果需要插入更新的数据比较多,而且每次事务只提交一条数据,会造成非常大的数据库资源浪费,导致数据库性能、系统性能大幅度下降。
关于mybatis的批量插入,网上的多数示例多半是关于MySQL数据库的,关于Oracle数据库的例子比较少。本文将给大家介绍关于Oracle+Mybatis批量插入、更新和删除的相关内容,下面话不多说了,来一起看看详细的介绍吧。
1、插入
(1)第一种方式:利用<foreach>标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<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}
, '1'
,#{dto.sysSource,jdbcType=VARCHAR}
,#{dto.isquery,jdbcType=VARCHAR}
from dual
</foreach>) A
</insert>
|
注意:入参必须是list集合,sql语句中没有values;
(2)第二种方式:利用存储过程实现批量插入(验证过)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
< 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语句可以实现一条语句批量插入!
1
2
3
4
5
6
|
INSERT ALL
INTO USERINFO(userid,username) VALUES( '1001' , 'Tom' )
INTO USERINFO(userid,username) VALUES( '1002' , 'Black' )
INTO USERINFO(userid,username) VALUES( '1003' , 'Jetty' )
INTO USERINFO(userid,username) VALUES( '1004' , 'Cat' )
SELECT 1 FROM DUAL;
|
1
2
3
4
5
6
7
|
<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)第一种方式:同样是利用存储过程(网上搜索的,还是上面那个博客)
1
2
3
4
5
6
7
8
9
10
11
|
<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)第二种方式:利用条件实现(已验证)
1
2
3
4
5
6
|
<update id= "updateBatchByListStat" parameterType= "java.util.Map" >
update la_t_advfinished t1
set t1.list_stat= '07' ,
t1.modify_time =systimestamp
where t1.id in(<foreach collection= "ids" separator= "," item= "id" > '${id}' </foreach>)
</update>
|
注意:同样可以使用or的条件实现,类似于下面删除的sql;
3、删除
与更新第二种方式类似
1
2
3
4
5
6
7
8
|
<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>
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/dahaihh-2018/p/8259441.html