最近做项目遇到一个挺操蛋的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。

先来看一下最终我是怎么实现的:

<insert id="batchInsertLine" parameterType="HashMap"> 

          <![CDATA[
INSERT INTO tg_fcst_lines(${lineColumn})
select result.*,sq_fcst_lines.nextval from(
]]>
<foreach collection="lineList" item="item" index="index" separator="union all" >
(select
<foreach collection="item" index="key" item="_value" separator=",">
#{_value}
</foreach>
from dual)
</foreach>
<![CDATA[) result]]>
</insert>

由于数据表不确定,所以我无法确定我要insert的字段,由于是批量insert,确定value值也挺费劲。

我传给mybatis的参数是一个map:

	Map insertMap = new HashMap();
insertMap.put("lineColumn",lineColumn);
insertMap.put("lineList", lineList);

lineColumn是一个字符串,lineList是一个list:

List<Map> lineList = new ArrayList();

lineList里存放的是map,map的键对应数据表的字段,值是你要insert的值,这样就可以通过foreach取出list的值作为insert语句的value,但由于map是无序的,存放的顺序和

遍历时取值的顺序不一定一致,所以为了确保insert字段和值可以一一对应,可以通过遍历一次map来取出key拼接一个字符串作为insert的字段

String lineColumn = "";     //拼接的SQL,作为insert语句的一部分
Map<String,String> lineMap = lineList.get(0);
for (String key : lineMap.keySet()) {
lineColumn +=key+",";
}
lineColumn +="LINE_ID";

这里的line)id是一个自增的字段,在语句中直接写序列会报错,所以先遍历list将取出的值作为result,在取出result的所有值,连同序列一起作为insert的值。

在取值的时候使用两个foreace嵌套来实现,外层的foreach遍历list,里层的foreach遍历map,

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle+mybatis 使用动态Sql在要insert的字段不确定的情况下实现批量insert的更多相关文章

  1. Java-MyBatis:MyBatis 3 动态 SQL

    ylbtech-Java-MyBatis:MyBatis 3 动态 SQL 1.返回顶部 1. 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架 ...

  2. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  3. mybatis 使用动态SQL

    RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...

  4. Oracle数据库之动态SQL

    Oracle数据库之动态SQL 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:一种为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大 ...

  5. MyBatis框架——动态SQL、缓存机制、逆向工程

    MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...

  6. MyBatis探究-----动态SQL详解

    1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...

  7. 在Oracle中执行动态SQL的几种方法

    转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...

  8. 利用MyBatis的动态SQL特性抽象统一SQL查询接口

    1. SQL查询的统一抽象 MyBatis制动动态SQL的构造,利用动态SQL和自定义的参数Bean抽象,可以将绝大部分SQL查询抽象为一个统一接口,查询参数使用一个自定义bean继承Map,使用映射 ...

  9. oracle 存储过程使用动态sql

    Oracle存储过程使用动态SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者. DDL和DML (注意DDL中可以用拼接字符串的方法用来create ta ...

随机推荐

  1. PS图像特效算法——镜像渐隐

    这个特效的实现,可以先利用前面提到的渐变特效,做一个图像的渐变, 然后将原图与渐变图对称放置,将背景设置成黑色. clc; clear all; close all; Image=imread('4. ...

  2. Java语言实现二分法

    二分法是一个简单,高效,并广泛应用的查找方法 import java.util.arrays; public class BinarySearch { public static int rank(i ...

  3. Java Socket:Java-NIO-Selector

    Selector 的出现,大大改善了多个 Java Socket的效率.在没有NIO的时候,轮询多个socket是通过read阻塞来完成,即使是非阻塞模式,我们在轮询socket是否就绪的时候依然需要 ...

  4. async & await 异步编程的一点巧方法

    await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程. await关键字会阻塞/暂停调用它 ...

  5. solr研磨之性能调优

    作者:战斗民族就是干  转载请注明地址:http://www.cnblogs.com/prayers/p/8982141.html 本篇文章我们来了解一下solr的性能方面的调优,分为Schema优化 ...

  6. js中用var与不用var的区别

    var num = 1: 是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable):如果是在全局域中声明,则为全局变量. 而 num = 1: 事实上是对属性赋值操作.

  7. AS3中的mouseEnabled与mouseChild

    InteractiveObject类的一个属性,InteractiveObject类是用户可以使用鼠标和键盘与之交互的所有显示对象的抽象基类.我们不能直接实例化InteractiveObject类.m ...

  8. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

  9. HTML5学习系列之表单与文件

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容.它可以是一篇博客或报刊中的文章.一篇论坛帖子.一段用户评论或独立的插件,或者其他任何独立的内容 ...

  10. require.js添加css文件实现代码:css.min.js

    define( function () { if (typeof window == "undefined")return { load: function (n, r, load ...