项目背景:设计到excel导入,数据量也比较大,保证性能的情况下还要考虑到:如果数据中有这条数据的主键,则更新(update),不存在的情况,执行插入(insert)。

mybatis代码:

<insert id="saveOrUpdateBatch"  parameterType="java.util.List">
MERGE INTO T_KA02 T
USING (
<foreach collection="list" item="item" index="index" separator="union" >
SELECT
#{item.socSrtDireCd,jdbcType=VARCHAR} AS socSrtDireCd,
#{item.socSrtDireNm,jdbcType=VARCHAR } AS socSrtDireNm,
#{item.doseForm,jdbcType=VARCHAR } AS doseForm,
#{item.ruleUseDm,jdbcType=VARCHAR} AS ruleUseDm
FROM DUAL
</foreach>) T1
ON (T1.socSrtDireCd= T.SOC_SRT_DIRE_CD)
WHEN MATCHED THEN
UPDATE SET T.SOC_SRT_DIRE_NM=T1.socSrtDireNm,
T.DOSE_FORM=T1.doseForm,
T.RULE_USE_DM=T1.ruleUseDm
WHEN NOT MATCHED THEN
INSERT
(SOC_SRT_DIRE_CD,SOC_SRT_DIRE_NM,DOSE_FORM,RULE_USE_DM)
VALUES
(T1.socSrtDireCd,T1.socSrtDireNm,T1.doseForm,T1.ruleUseDm)
</insert>

遇到的问题:

如果数据量太大,则拼接sql时抛异常,大致是说sql语句太长,获取不到完整的套接字。这时候,可以采用分批来执行的方式。我的处理方式大致如下:

  @Override
public void saveOrUpdateBatch(List<DrugsCatalog> list) {
int count=0;
int bufSize=200;
List<DrugsCatalog> tmpList=new ArrayList<>();
int j=0;
for (int i = 0; i < list.size(); i++) {
j++;
tmpList.add(list.get(i));
if(j==bufSize){
int save = drugsCatalogMapper.saveOrUpdateBatch(tmpList);
count+=save;
tmpList.clear();
j=0;
}
}
int save2 = drugsCatalogMapper.saveOrUpdateBatch(tmpList);
count+=save2;
log.info("成功导入数据"+count+"条!");
}

这是,完美解决批量保存或更新问题。

mybatis 中使用oracle merger into的更多相关文章

  1. Mybatis中实现oracle的批量插入、更新

    oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...

  2. mybatis中的oracle和mysql分页

    这段时间一直在用mybatis+spring+springMVC的框架,总结点东西吧. mybatis的oracle分页写法: <?xml version="1.0" enc ...

  3. mybatis中mysql和oracle的差异

    1.applicationContext.xml中的配置差异: 在applicationContext.xml的数据源dataSource的配置中,mysql数据库需要心跳包的配置,而oracle中不 ...

  4. mybatis中oracle转mysql

    刚来公司实习,遇到的第一个任务就是这个,简单记录一下思路过程.人菜的很,没啥参考价值. 测试时: 将现有的oracle库转为mysql: 用的Navicat自带数据传输功能,简单粗暴 出现的问题: 1 ...

  5. Mybatis使用- Mybatis JdbcType与Oracle、MySql数据类型对应列表 ; Mybatis中javaType和jdbcType对应关系

    Mybatis JdbcType与Oracle.MySql数据类型对应列表  Mybatis JdbcType Oracle MySql JdbcType ARRAY     JdbcType BIG ...

  6. Oracle使用MyBatis中RowBounds实现分页查询

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...

  7. mybatis中Oracle分页语句的写法

    最近一段时间使用oracle数据库查询分页, 用的是springboot. Oracle数据库中没有像mysql中limit的写法, 只能换其他方式写. 考虑到oracle中的ROWNUM变量, 使用 ...

  8. ORACLE中关于使用between在MyBatis中取不同的区间值和取反

    最近在项目中使用between取不同的区间值问题,由于区间跨度大,而且区间多,又是前端传过来的参数,所以使用in和exists比较麻烦.然后就考虑使用between.现将使用方法记录一下. 假如表有个 ...

  9. 批量插入数据(基于Mybatis的实现-Oracle)

    前言:做一个数据同步项目,要求:同步数据不丢失的情况下,提高插入性能. 项目DB框架:Mybatis.DataBase:Oracle. -------------------------------- ...

随机推荐

  1. python字符串 列表 元组 字典相关操作函数总结

    1.字符串操作函数 find 在字符串中查找子串,找到首次出现的位置,返回下标,找不到返回-1 rfind 从右边查找 join 连接字符串数组 replace 用指定内容替换指定内容,可以指定次数 ...

  2. Nagios监控配置文件及监控流程

    1.安装路径/usr/local/nagios/下存在etc.bin.sbin.share.var 这五个目录.Nagios 各个目录用途说明如下: bin Nagios 可执行程序所在目录 etc ...

  3. windows安装tf

    https://www.cnblogs.com/lvsling/p/8672404.html

  4. JDBC四种驱动程序

    四种JDBC驱动程序 JDBC-ODBC桥驱动程序(JDBC-ODBC Bridge Driver) 此类驱动程序由JDBC-ODBC桥和一个ODBC驱动程序组成.其工作原理是,通过一段本地C代码将J ...

  5. docker容器跑redis

    命令行配置: $ docker search redis $ docker pull docker.io/redis $ mkdir -p /redis/etc/conf /redis/lib  /r ...

  6. Commons Daemon procrun stdout initialized

    参考 https://blog.csdn.net/qq_19865749/article/details/69664979 jvm路径错误

  7. Jupyter Notebook 快捷键使用指南

    因为使用Jupyter Notebook用鼠标选择菜单影响效率,遂将快捷命令记录于此 转自:http://blog.konghy.cn/2017/05/04/jupyter-notebook-hotk ...

  8. netty(七) Handler的执行顺序

    Handler在netty中,无疑占据着非常重要的地位.Handler与Servlet中的filter很像,通过Handler可以完成通讯报文的解码编码.拦截指定的报文.统一对日志错误进行处理.统一对 ...

  9. centos7修改系统语言

    编辑文件:vim /etc/locale.conf LANG="en_US.UTF-8"    ##表示为英文 LANG="zh_CN.UTF-8"    ## ...

  10. 从零开始学spring cloud(二) -------- 开始使用Spring Cloud实战微服务

    1.准备工作 2.服务提供者与服务消费者 3.服务发现与服务注册 服务发现: 服务注册表: 服务注册表是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心.服务注册表提供查询API和管理 ...