一,Mybatis Oracle实现批量插入
<insert id="insertUserBatch" parameterType="java.util.List">
INSERT INTO table_user (
id, user_code, user_name
)
<foreach collection="userList" item="item" index="index" separator="UNION ALL">
select
#{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR},
#{item.userName,jdbcType=VARCHAR}
from dual
</foreach>
</insert>
即,Oracle实现批量插入需要借助 dual(其中的一种方式)。这样实现是没有任何问题的。
二,问题
在单条数据插入时,当表中数据有字段当插入数据超过varchar2的长度(4000)时会报 “ORA-01461-仅能绑定要插入LONG列的LONG值”,这个时候只需要将该字段由varchar2类型改成blob类型(mysql)或者clob类型(Oracle)就可以了。但是注意这个是用没有实现批量插入的sql实现:
<insert id="insertUser" parameterType="com.orient.user">
INSERT INTO table_user (
id, user_code, user_name
) values(
#{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR},
#{item.userName,jdbcType=VARCHAR}
)
</insert>
但是用“一”中的方式批量进行插入时即便是将类型改变过来也是报此错误,其主要原因是虚表dual中的字段类型是long类型的,所以还是会报错。
三,解决方案
<insert id="insertUserBatch" parameterType="java.util.List">
begin
<foreach collection="userList" item="item" index="index" separator=";">
INSERT INTO table_user (
id, user_code, user_name
) values(
#{item.id,jdbcType=VARCHAR}, #{item.userCode,jdbcType=VARCHAR},
#{item.userName,jdbcType=VARCHAR}
)
</foreach>
;end;
</insert>
即,不用能借助dual表实现,通过sql拼接的方式(脚本)实现。这样就不会报这样的错误了!