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

原创 2015年11月01日 13:56:04

最近做项目遇到一个挺操蛋的问题,由于业务的关系,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,

---------------------------------------------------------------分割线-------------------------------------------------------------------------------------------------------------------

2017.01.03 补充:

以上代码正常运行需要依赖的mybatis版本是mybatis-3.2.2.jar

对于mybatis-3.1.1.jar的版本

<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.values()"  index="key" item="_value" separator=",">
			          #{_value}
			    </foreach>	 
			  from dual)
		  </foreach>
		  <![CDATA[) result]]> 		 
	</insert> 


第二个for循环中collection的值需要写成item.values(),否则会有如下异常:

Error evaluating expression 'item'.  Return value ({id=f0835869d34643688dd34bb948375191}) was not iterable.
同时可以将HashMap替换为TreeMap,确保数据有序,就可以字段名和值的顺序保持一致。

鸣谢:感谢评论中4楼 yuxueyuanwj 找出的问题和提出的解决方式


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

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

最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰。 先来看一下最终我是怎么实现的:          ...
  • keketrtr
  • keketrtr
  • 2016年04月28日 11:11
  • 1762

mybatis插入数据时处理为null的属性

在做项目的时候,数据库中的所有字段被设置为全都不能为null,但是在我们开发过程中,插入一些记录的时候,实体类中的一些字段如果页面没有传入,则默认就会被设置为null,这样的话,在执行插入语句的时候,...
  • zsz459520690
  • zsz459520690
  • 2015年11月28日 20:09
  • 17845

mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加

创建用户:/** * 创建一个或多个新用户 insert 字段和表名不确定时动态添加 */ @Test public void createAccount() { String lineCol...
  • laoWangwsy
  • laoWangwsy
  • 2017年02月21日 09:19
  • 1037

Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null

Mybatis 实现不确定修改几个字段的修改方法(动态语句set、if实现),避免修改时其它没被修改的字段变为null 在下面的案例本人将演示如何使用动态语句批量删除数据库数据,本人在数据库建...
  • benxiaohai888
  • benxiaohai888
  • 2017年11月17日 20:21
  • 297

MyBatis动态SQL foreach标签实现批量插入

需求:查出给定id的记录: SELECT * FROM tb1_emplyee WHERE id IN #{item_id} ...
  • yalishadaa
  • yalishadaa
  • 2017年05月20日 16:21
  • 2082

Mybatis结合Oracle的foreach insert批量插入

最近做一个批量导入的需求,将多条记录批量插入数据库中。解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的fore...
  • u012184337
  • u012184337
  • 2016年08月25日 21:47
  • 18129

Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

Oracle+Mybatis的foreach insert批量插入报错的快速解决办法 投稿:mrr 字体:[增加 减小] 类型:转载 时间:2016-08-26 我要评论 本文给大家介绍O...
  • gzyx541900780
  • gzyx541900780
  • 2016年08月30日 09:25
  • 3378

Oracle+Mybatis的foreach insert批量插入报错的解决办法

Oracle+Mybatis的foreach insert批量插入报错的解决办法
  • loongshawn
  • loongshawn
  • 2017年11月02日 09:39
  • 396

(转载)Mybatis结合Oracle的foreach insert批量插入

最近在做,好不容易搞ok了,看到作者总结的很清楚,拿来分享 最近做一个批量导入的需求,将多条记录批量插入数据库中。解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数...
  • lililidahaoren
  • lililidahaoren
  • 2017年10月26日 14:09
  • 113

3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert up...
  • toto1297488504
  • toto1297488504
  • 2014年10月10日 23:47
  • 1734
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle+mybatis 使用动态Sql在要insert的字段不确定的情况下实现批量insert
举报原因:
原因补充:

(最多只允许输入30个字)