mybatis双层foreach循环,批量插入数据 oracle

2022-07-13 08:49:35

在项目中需要将list中的数据采用mybatis批处理操作存储到数据表中;
其中map的数据结构为{“字段名称”:“字段值”},以往项目很多是在foreach中遍历list后根据数据表各个字段进行插入操作,例如:

<insertid="insertListbywill"parameterType="string"><foreachcollection="list"item="paramsMap"open="BEGIN"close=";END;"separator=";"index="index">
		insert into A01<trimprefix="("suffix=")"suffixOverrides=","><iftest="paramsMap.A00 != null and paramsMap.A00 !=''">
			  A00 ,</if><iftest="paramsMap.A01 != null and paramsMap.A01 !=''">
			  A01,</if><iftest="paramsMap.A02 != null and paramsMap.A02 !=''">
			  A02 ,</if> 
			...</trim><trimprefix=" values ("suffix=")"suffixOverrides=","><iftest="paramsMap.A00 != null and paramsMap.A00 !=''">
			  #{paramsMap.A00},</if><iftest="paramsMap.A01 != null and paramsMap.A01 !=''">
			  #{paramsMap.A01},</if><iftest="paramsMap.A02 != null and paramsMap.A02 !=''">
			  #{paramsMap.A02},</if> 
			...</trim></foreach></insert>

当遇到表较多和字段较多的情况时,其代码行数是直线增长的,为了便捷开发,就在foreach标签中采用了第二层的foreach循环。通过内层循环调用外层循环中的map,通过获取map中的key获取字段名称,以及通过key获取value,实现数据的批量操作;

<insertid="insertListbywill"parameterType="string"><foreachcollection="list"item="paramsMap"open="BEGIN"close=";END;"separator=";"index="index">
			insert into ${tableName}<foreachcollection="paramsMap.keys"item="key"open="("close=")"separator=","><iftest="key !=null and key !=''">
	            	${key}</if></foreach><foreachcollection="paramsMap.keys"item="key"open="VALUES ("close=")"separator=","><iftest="key !=null and key !=''">
         			#{paramsMap[${key}]}</if></foreach></foreach></insert>

优点: 解除了mybatis配置与数据表的绑定,减少了开发的代码量;

缺点:有sql注入可能,需在前台处理好数据格式;

示例:

后台代码:
map的key为字段名称

mybatis配置:如上;

打印的参数及sql:
这里是打印的参数
(处理了下换行)
这里是打印的sql
结果:
这里是执行后的结果
好了,这篇博客就到这里,如果您有更好的想法欢迎给我留言~

  • 作者:下一秒丶待续
  • 原文链接:https://blog.csdn.net/weixin_43882190/article/details/114382314
    更新时间:2022-07-13 08:49:35