项目背景:设计到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. linux 查看文件方法

    vi 文件名 #编辑方式查看,可修改cat 文件名 #显示全部文件内容more 文件名 #分页显示文件内容tail 文件名 #仅查看尾部,还可以指定行数head 文件名 #仅查看头部,还可以指定行数s ...

  2. javaMail实现收发邮件(四)

    JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操作,在介绍这些类之前,我们先来了解下邮件接收API的体系结构,JavaMai API中定义了一个java.mail.Store类 ...

  3. dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件

    该问题是由于电脑环境变量配置错误所导致.最初在网上查找的方法,是在系统环境变量path中添加以下语句: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\ ...

  4. ExpandableListView解析JSON数据

    效果图:                                       说明:刚开始使用这个控件我花费了3天的时间,但是一直都没有达到预期的效果,要么就是直接全部不显示,要么就是数据累加 ...

  5. Servlet第一篇(Tomcat)

    Tomcat 什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 提供能够 ...

  6. 画布Canvas 画笔Paint

    package com.example.m_evolution.View; import android.content.Context; import android.graphics.Canvas ...

  7. 【手机端判断】PC_to_M自写

    var current_url = window.location.href; var replace_url = [ ['笔试简章','http://beijing.ysedu.com/zt/bjt ...

  8. jvm排查问题常用命令及注释

    本文将介绍JDK自带的JVM排查工具.其提供的排查工具有: (1)jps:JVM Process Status Tool,显示系统内所有的JVM进程: (2)jstat:JVM Statistics ...

  9. nohup python 没有print输出

    nohup python -u crake.py >run.log 2>&1  &

  10. java搭建SSM的Web开发框架-整合这3者用到的配置文件

    1./WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmln ...