Mybatis+Oracle批量插入方法总结

文章介绍了在Oracle12c数据库GBK字符集环境下,使用MyBatisPlus遇到特殊符号乱码问题,以及批量插入时的限制。作者分享了两种解决方法,包括自定义SQL语句以避免字段数量不一致导致的错误,以及手动处理SqlSession进行事务控制的批量插入。第一种方法通过在`<foreach>`标签内使用`<choose>`处理空值,确保了批量插入的字段一致性。第二种方法涉及到了对SqlSession的管理,以控制批量插入的事务。尽管尝试了`BEGIN...END`语法和`INSERTALL`语法,但并未能成功解决问题。

最近因为处理Oracle 12c GBK字符集情况下特殊符号(如Ø等)的问题,无法使用mabatisPlus的saveBatch方法,需要在mapper.xml中手写方法,又受框架所限,有些语法不支持,耗费了几天时间,最终通过下面地第一种方式实现,特在此总结一下。

乱码问题解决方法参考拙作:

Oracle 12c gbk字符集下解决特殊符号乱码问题_Chrisf Zhang的博客-优快云博客 

方式一(可解决问题)

语法

insert into TableA(column1,column2)

(

select #{column1},#{column2} from dual

union all

select #{column1},#{column2} from dual

...

)

初次测试这种方式时,创建简单表可以实现,但在实际业务应用时,发现问题。union 的两侧要求字段数量一致,因为实际业务的不同,同一次批量插入的两条记录字段数量及具体的字段可能都不同,所以应用后报错。所以考虑手动创建session,循环插入后再关闭的方式处理。后来解决了union两侧字段数量不一致的问题,所以就没再使用手动创建session的方式,具体代码如下:

controller

    @ApiOperation("测试新增特殊符号-批量(方式七)")
    @PostMapping("/setCodes7")
    public void setCodes7(@RequestBody List<ZzCode> list){
        //方式七 用nvarcharHandler处理
        zzCodeMapper.setCodes7(list);
    }

 mapper

void setCodes7(List<ZzCode> list);

mapper.xml

    <!-- 方式七 (insert into select from union all select from...),指定处理jdbcTypeHandler-->
    <insert id="setCodes8">
        INSERT INTO ZZ_CODE(CODE, REMARK, CODE_NO)
        <foreach collection="list" item="zzCode" separator="union all" open="(" close=")">
           
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值