项目有需求,百度了很久,反正他们说的方法,我都没成功,我也不知道是不是我写代码的姿势不正确,没办法只能自己想法子了

我们这个项目用到了通过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批量新增数据,回填主键的更多相关文章

  1. Oracle批量新增数据最佳实践

    一.需求描述 现在的项目改造过程中,从国产的Gbase数据库改造为Oracle数据库,遇到一个问题有的业务操作需要批量新增数据. 这也是一个比较常规的操作,有很多地方确实需要一次性新增多条数据.Gba ...

  2. myBatis获取批量插入数据的主键id

    在myBatis中获取刚刚插入的数据的主键id是比较容易的 , 一般来说下面的一句话就可以搞定了 , 网上也有很多相关资料去查. @Options(useGeneratedKeys = true, k ...

  3. mybatis 获取新增数据的主键

    <insert id="insert" parameterType="com.mmall.pojo.Shipping" useGeneratedKeys= ...

  4. oracle批量新增更新数据

    本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 ...

  5. mybatis学习之路----mysql批量新增数据

    原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...

  6. mybatis批量插入并返回主键(序列)-oracle

    需求:批量插入数据,并返回每条数据的主键(序列),因为这里是采用序列生成唯一的主键的, 其实oracle批量 插入操作有几种,网上百度都是有相关资源的.但是笔者现在的需求是,不仅批量插入数据后,并返回 ...

  7. mybatis+oracle添加一条数据并返回所添加数据的主键问题

    最近做mybatis+oracle项目的时候解决添加一条数据并返回所添加数据的主键问题 controller层 @RequestMapping("/addplan") public ...

  8. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  9. MyBatis基础入门《十三》批量新增数据

    MyBatis基础入门<十三>批量新增数据 批量新增数据方式1:(数据小于一万) xml文件 接口: 测试方法: 测试结果: =============================== ...

随机推荐

  1. 安卓APP在线升级

    安卓APP在线升级 通过IDHTTP组件在线下载APP到手机中,然后自动安装这个APP程序. 1)在线下载APP程序 需引用单元: {$IFDEF ANDROID} FMX.Helpers.Andro ...

  2. IIS URL Rewriting and ASP.NET Routing

    IIS URL Rewriting and ASP.NET Routing With the release of the URL Rewrite Module for IIS and the inc ...

  3. Flutter移动电商实战 --(46)详细页_自定义TabBar Widget

    主要实现详情和评论的tab provide定义变量 自己做一个tab然后用provide去控制 定义两个变量来判断是左侧选中了还是右侧选中了.并定义一个方法来接受参数,修改是左侧还是右侧选中的状态值 ...

  4. php Class 'ZipArchive' not found怎么解决?

      情况1: 服务器php zip模块没有安装 情况2: Php.ini 中Php zlip扩展没有开   文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎留言.评论

  5. Python中的子进程并发

    date: 2019-06-16   22:35:33 author: headsen chen notice:个人原创 实例代码: import os,time time.sleep(1) from ...

  6. Android 摇一摇监听实现

    package com.loaderman.androiddemo; import android.content.Context; import android.hardware.Sensor; i ...

  7. requests与urllib.request

    requests很明显,在写法上与urllib.request不同,前者多一个 S.导入包时:import requestsimport urllib.requesturllib.request请求模 ...

  8. initGanttView

    void TeslaManage::initGanttView() { if (vcGanttObject ==NULL) { vcGanttObject = new VCGantt(this); g ...

  9. 测试理论03-svn-缺陷及报告-jira

    回顾--用例设计方法 边界值(三个点,使用步骤) 判定表(适用,四个组成部分,规则,使用) 因果图(适用,四个符号,使用) 正交表(定义,特性,L_n(m^k),因素,水平,使用,工具allpairs ...

  10. Day4作业:蛋疼CRM系统

    先上流程图,还得27寸4K显示器,画图各种爽: ReadMe: 运行程序前的提示: 1.抱歉,你得装prettytable模块...... 2.还得抱歉,如果shell中运行,最好把字体调得小点,表格 ...