oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

   2015-11-09 0
核心提示:最近接了一个项目,其中项目需求,有一个非常纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。接下来,通过本篇文章给大家介绍oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

最近做项目遇到一个挺纠结的问题,由于业务的关系,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语句的一部分 
[java] view plaincopy
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的全部叙述,希望大家喜欢。

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • mybatis批量增、删、改(更新)操作oracle和mys
    注:本文主要用来记录oracle和mysql数据库在使用mybatis的情况下批量增、删、改(更新)的常用写法一、批量插入1、oracle写法:insert         insert into b_dbgl_zaixcs (zaixcsid, mingc, pingsyid, xinxid, fujid, jieg, pingfjg, pingf, zhuangt, s
    02-10
  • mybatis的报错总结_____2Error updating database.  Cause: java.sql.SQLSyntaxErrorException: You have an err
    mybatis的报错总结_____2Error updating databa
    在编写动态sql时 trim的属性写错了,如下图:错误示范:(接口的xml配置文件中:)1update id="modifyBill" parameterType="Bill"2 update smbms_bill3 trim suffix="set" prefixOverrides="," prefix="where id=#{id}"4 if test="billCode!=null"
    02-10
  • 关于 mybatis-generator自定义注释生成  使用DefaultCommentGenerator重写来完成
    


            
Mybatis Generator的mo
    关于 mybatis-generator自定义注释生成 使用De
    项目里新建表时model,mapper以及mapper.xml基本都是用Mybatis Generator(以下简称为MBG)自动生成的,但是MBG自动生成的model的注释实在有点非人类,至少中国人是完全接受不了的,在配置中禁用掉注释吧,倒是简单了,可是生成的model类光秃秃的,啥都没有,字段方法没
    02-10
  • 解决Oracle+Mybatis批量插入报错:SQL 命令未正
    Mybatis批量插入需要foreach元素。foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名。(2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的位置。(3)collection:根据传入的参数值确定。(4)open:表示该语句以什么开
    02-10
  • mysql在spring+mybatis中出现value '0000-
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp当日期字段在数据库中可为空,并且其默认值为“0000-00-0000:00:00”,在mysql中作为一个特殊值存在。但是java日期类型不认可转换抛出以上异常。解决方法:
    02-10
  • MyBatis Mapper.xml文件中 MySql的SQL语句比较
    lt;        小于号gt;      大于号amp;    和apos;    ’单引号quot;    " 双引号           MyBatis 中的 # 和 $ 的区别如下: #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传
    02-09
  • mybatis中mysql和oracle的差异
    mybatis中mysql和oracle的差异
    1、applicationContext.xml中的配置差异:在applicationContext.xml的数据源dataSource的配置中,mysql数据库需要心跳包的配置,而oracle中不需要,否则会报错 2、mybatis模糊查询中sql语句的差异mysql在使用concat拼接字符串时可以直接将三者【%、占位符、%
    02-09
  • mybatis 控制台打印出来的sql 执行结果为空 但
    mybatis中的sql如下select airln_Cd airlnCd,city_coordinate_j cityCoordinateJ,city_coordinate_w cityCoordinateWfrom airportinfonew where iATA=#{iATA} 我在请求的时候是这样加的参数 :/airportFlight/findAirportFlight/?iATA='WDS'  在参数上加了个
    02-09
  • MyBatis实践之动态SQL及关联查询
    MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。本文给大家介绍MyBatis实践之动态SQL及关联查询,对mybatis动态sql相关知识感兴趣的朋友一起学习吧
  • MyBatis MapperProvider MessageFormat拼接批量
    这篇文章主要介绍了MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法的相关资料,需要的朋友可以参考下
点击排行