Mybatis批量插入Oracle数据库

博客讲述了Mybatis批量插入时,原本适用于Mysql的操作在Oracle数据库中报错的问题。指出该批量插入语句语法在MySQL适用,在Oracle不适用。并给出解决办法,如去除SQL中values关键字、用select...from dual包裹foreach语句、将foreach中separator值设为union all,修改后可正常入库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

今天在Mybatis批量插入时出现了一点问题。本来Mybatis批量插入Mysql的操作在Oracle数据库中突然报错了。具体的操作如下:

@Insert({ "<script>",
        "insert into tr_wy_proj_mo_rela(PROJECTID,RULE_CONTENT) values ",
        "<foreach collection='nelist' index='index' item='item' separator=','>",
        "(#{item.projectid,jdbcType=VARCHAR}, #{item.rule_content,jdbcType=VARCHAR})",
        "</foreach>",
        "</script>" })
void insertShieldProMoRela(@Param(value="nelist") List<Map<String, Object>> nelist);

具体报错如下:

于是上网搜了一些资料,终于找到了原因。

首先先解释一下,上面的批量插入语句最终会翻译成以下语句:

insert into tr_wy_proj_mo_rela(PROJECTID,RULE_CONTENT) values (?, ?) ,(?, ?);

这种语法在MySQL数据库中是支持的,但是在Oracle数据库中却不适用。 

可以通过如下方法来解决:

1、去除SQL中values关键字;

2、foreach中的语句需要select...from dual包裹;如下:

select #{item.projectid,jdbcType=VARCHAR}, #{item.rule_content,jdbcType=VARCHAR} from dual 

3、foreach中的separator的值要是union all,union all就是对select查询的结果数据进行合并。

最终修改成如下:

@Insert({ "<script>",
        "insert into tr_wy_proj_mo_rela(PROJECTID,RULE_CONTENT) ",
        "<foreach collection='nelist' index='index' item='item' separator='UNION ALL'>",
        "select #{item.projectid,jdbcType=VARCHAR}, #{item.rule_content,jdbcType=VARCHAR} from dual ",
        "</foreach>",
        "</script>" })

这样就能正常入库了!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值