目录
方法一
Mapper接口:
/**
* 批量新增
*
* @param
* @return
*/
int insertSelect(@Param("sjJymcList") List<SjJymc> sjJymcList);
对应的XML:(SJ_JYMC_SEQ是为该表创建的序列,作为其主键)
<insert id="insertSelect" parameterType="java.util.List">
BEGIN
<foreach collection="sjJymcList" item="SjJymc" index="index" separator="">
insert into sj_jymc(ID,BEAN_ID,JYFS_ID,FIELD_NAME,FILED_DESC,STATUS,ISDELETE,CREATE_ID,CREATE_TIME)
VALUES(
SJ_JYMC_SEQ.NEXTVAL,
#{SjJymc.beanId,jdbcType=INTEGER},
#{SjJymc.jyfsId,jdbcType=VARCHAR},
#{SjJymc.fieldName,jdbcType=VARCHAR},
#{SjJymc.filedDesc,jdbcType=VARCHAR},
#{SjJymc.status,jdbcType=INTEGER},
#{SjJymc.isdelete,jdbcType=INTEGER},
#{SjJymc.createId,jdbcType=INTEGER},
#{SjJymc.createTime,jdbcType=DATE} );
</foreach>
COMMIT;
END;
</insert>
注:insert标签一定要添加: useGeneratedKeys="false" ,否者会报错。
缺点:不管批量插入多少条数据,返回的影响行数总为-1。
方法二
dao接口:
int insertBatch(List<P> pos);
对应的XML:
<insert id="insertBatch" parameterType="list" useGeneratedKeys="false" databaseId="oracle">
insert into table_name (
ID,
FIELD_ONE,
FIELD_TWO,
FIELD_THREE
)
<foreach collection="pos" item="item" index="index" separator="UNION ALL">
select get_seq_next('seq_name'),
#{item.fieldOne, jdbcType = ???},
#{item.fieldTwo, jdbcType = ???},
#{item.fieldThree, jdbcType = ???} from dual
</foreach>
</insert>
注:table_name即表名;seq_name为自增序列名;get_seq_next()是个oracle函数,用来获取序列的下一个值,虽然按理说直接seq_name.nextval就可以了,但是这里会报错。
附:get_seq_next()函数:
CREATE OR REPLACE
function get_seq_next (seq_name in varchar2) return number
is
seq_val number ;
begin
execute immediate 'select '|| seq_name|| '.nextval from dual' into seq_val ;
return seq_val ;
end;
缺点:不能直接调用序列的nextval方法,需要另外加一个生成主键的oracle函数。
参考链接: