最近因为处理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=")">

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

被折叠的 条评论
为什么被折叠?



