mybaits实现oracle批量新增数据,回填主键
项目有需求,百度了很久,反正他们说的方法,我都没成功,我也不知道是不是我写代码的姿势不正确,没办法只能自己想法子了
我们这个项目用到了通过Mapper,通用Mapper里通过OracleProvider 实现批量插入,好像可以通过KeySql注解可以自动生成主键,
生成的sql里有这个
<bind name="country_idGenIdBind" value="@tk.mybatis.mapper.genid.GenIdUtil@genId(record, 'countryId', @tk.mybatis.mapper.additional.insertlist.UUIdGenId@class, 'demo_country', 'country_id')"/>
本想想使用通过Mapper的,但是KeySql是通过Mapper的类,而我的实体类是放在api的模块里的,为了保持api模块里代码的纯净,不想使用它的方法
虽然用不了他们的代码,但是可以用他的方法,自己写sql,在forEach里加上bind标签,再自定义类实现属性注入,代码如下:
<foreach collection="list" item="item" open="(" close=")" separator="union">
<bind name="build_idGenIdBind" value="@com.xx.mybaits.Abc@a(item, 'field','SEQ_XX')"/>
select
#{item.field} as field
</foreach>
Abc的实现方法
/**
* @param target 传输对象
* @param property 需要设置的属性名
* @param seqName 生成id的序列名
*/
public static void generateId(Object target, String property, String seqName) throws Exception {
if (StringUtils.isBlank(seqName)) {
throw new Exception("序列名不可为空!");
}
if (target != null) {
Field field = FieldUtils.getDeclaredField(target.getClass(), property, true);
Object fieldValue = field.get(target);
if (fieldValue == null) {
SequenceMapper sequenceMapper = SpringContext.getBean(SequenceMapper.class);
Long nextSeq = sequenceMapper.getNextSeq(seqName);
Class<?> fieldType = field.getType();
if (fieldType.equals(Integer.class)) {
field.set(target, Integer.parseInt(nextSeq.toString()));
return;
}
field.set(target, nextSeq);
}
}
}
这里需要注意的是,myBaits默认是开启一级缓存的,需要把一级缓存关闭,否则循环查询序列时,返回的值不变,通过分布式系统时,一级缓存也会导致问题
mybaits实现oracle批量新增数据,回填主键的更多相关文章
- Oracle批量新增数据最佳实践
一.需求描述 现在的项目改造过程中,从国产的Gbase数据库改造为Oracle数据库,遇到一个问题有的业务操作需要批量新增数据. 这也是一个比较常规的操作,有很多地方确实需要一次性新增多条数据.Gba ...
- myBatis获取批量插入数据的主键id
在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...
- mybatis 获取新增数据的主键
<insert id="insert" parameterType="com.mmall.pojo.Shipping" useGeneratedKeys= ...
- oracle批量新增更新数据
本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 ...
- mybatis学习之路----mysql批量新增数据
原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...
- mybatis批量插入并返回主键(序列)-oracle
需求:批量插入数据,并返回每条数据的主键(序列),因为这里是采用序列生成唯一的主键的, 其实oracle批量 插入操作有几种,网上百度都是有相关资源的.但是笔者现在的需求是,不仅批量插入数据后,并返回 ...
- mybatis+oracle添加一条数据并返回所添加数据的主键问题
最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...
- MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...
- MyBatis基础入门《十三》批量新增数据
MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...
随机推荐
- java之map遍历
java开发中常常会用到遍历,所以下边就列举四种map的遍历方法. public class testMap { public static void main(String[] args) { Ma ...
- python3 与linux间的小知识
1 1秒启动一个下载器 python -m http.server laso@laso-beta03 ms_product]$ python3 -m http.server Serving HTTP ...
- CRF 初步了解
国外有一个很著名的条件随机场的教程,是英文的,原文: http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields ...
- keras Dense 层
文档地址:https://keras.io/layers/core/#dense keras.layers.Dense(units, activation=None, use_bias=True, k ...
- iptables+ipset自动封闭和解封频繁访问web服务的恶意IP
转载于互联网 iptables直接针对ip进行封禁,在ip数量不大的时候是没什么问题的,但当有大量ip的时候性能会严重下降,iptables是O(N)的性能.而ipset就像一个集合,把需要封 ...
- Flutter中的事件广播event_bus的基本使用
官方包参考地址: https://pub.dev/packages/event_bus https://github.com/marcojakob/dart-event-bus 1.pubspec.y ...
- ES6深入浅出-2 新版函数:箭头函数 2 视频-2.视频 箭头函数杂谈
杂谈coffeescript 箭头函数抄的是谁? coffeescript 双箭头的形式 箭头函数简洁的语法 数组内每一个值都平方一下 Map的写法 箭头函数的写法 平方后,每一个值再加1 numbe ...
- pytorch0.4.1安装
pytorch官网:https://pytorch.org/ 这里安装pytorch0.4.1版本(最新版本为1.3.0系列,但是在跑github上的一些项目时会不断地报“ UseWarinig:Le ...
- hadoop第一次面到hr(品友互动)
第一次“北漂” 准备了一个星期的Hadoop,把林子雨老师的视频刷了一遍,翻出了好久没用的小本本,密密麻麻的记了一大堆.刷了网上能找到的Hadoop的所有面试题(这个真的很重要) 然后,启程,北上,还 ...
- sonarqube-jenkins-config
Sonar Config .Jenkinsfile config stage('SonarQube analysis') { steps { script { scannerHome = tool ' ...