mybatis的循环插入

Mybatis 批量插入引发的血案 SqlServer 对语句的条数和参数的数量都有限制,分别是 1000 和 2100。 Mysql 对语句的长度有限制,默认是 4M。 Mybatis 对动态语句没有数量上的限制。 阅读详情

最近有个需求,就是使用mybatis时,向mysql中插入数据,其参数为map类型,map里面的key为列名,而key对应的value是该列对应的列值;问题是每次插入mysql中数据行的部分列,即map里面key的值每次都不固定,在用mybatis时需要通过map的key作为列名。

 

基础知识

 

对于这类问题基本思路就是用foreach标签遍历map,因此需要看看foreach的知识。

foreach属性
属性 描述
item循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。具体说明:若collection属性为list或array,则item代表list或array里面的一个元素。若collection属性对应一个map,则item代表的是map中的value集合中的单个value该参数为必选。
collectionforeach遍历的对象,作为入参时,List对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。也就是传入的集合(list,array,map)的名字,这个名字可以在foreach里面随便引用)当然在作为入参时可以使用@Param(“params”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = "ids"如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"如果传入参数类型为map,这个入参有注解@Param(“params”),则map的所有的key集合可以写成params.keys,所有值集合可以写成params.values。这样foreach就可以对key集合或值集合进行迭代了。上面只是举例,具体collection等于什么,就看你想对那个元素做循环。该参数为必选。
separator元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
openforeach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。
closeforeach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
index在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

实现

          有了以上基础就可以实现我们想要的功能:

首先,在mapper对应的dao中使用@param注解,显式指定集合参数类的别名(列表和数组有默认的别名list和array):

public interface CrawDao {  
  
    public void saveNewNews(@Param("params")Map<String, String> params);  
      
}  

第二步,在mapper的xml文件里对map的key进行迭代:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  
<mapper namespace="us.codecraft.webmagic.dao.CrawDao">  
  
   <insert id="saveNewNews" parameterType="java.util.Map">  
         insert ignore into tb_news   
         <foreach collection="params.keys" item="key" open="(" close=")" separator="," >  
            ${key}  
         </foreach>  
         values   
         <foreach collection="params.keys"  item="key" open="(" close=")" separator=",">  
            #{params[${key}]}  
         </foreach>  
   </insert>  
</mapper>  

通过以上两步就动态的获取了列名,并对对应的列赋值。

<!-- 插入用户和角色关联表数据 -->
	<insert id="insertUserRole">
		INSERT INTO sys_user_role(user_id, role_id)
		<foreach collection="roleList" item="role" separator=" union all ">
			SELECT #{id}, #{role.id} FROM dual
		</foreach>
	</insert>

这种方式 是先将List里面的值,循环拼接成一个查询虚拟表,然后再通过查询虚拟表,获取每一行的数据 插入到你需要插入的表里面去. 这样的话有个需要注意的地方,就是你拼接的SQL语句的长度有没有超过Oracle的最大长度,不过Oracle的最大长度是64KB,你的SQL语句应该不会写这么长吧?

面试题:MyBatis批量插入的五种方式,哪种最强? 列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式,进行了详细的总结归纳@Override// 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法@Bean以上就是我对目前MyBatis常用的批量插入方法的总结。 阅读详情

相关推荐

MyBatis批量插入数据实现(MySQL)

假如需要搬一万块砖到楼顶,有一部电梯,电梯一次可以放适量的砖(最多放 500)。可以选择一次运送一块砖,也可以一次运送 500 块砖,哪个时间消耗大? 一、sql 层面实现数据插入 单条插入数据的写法: insert into table ([列名],[列名]) values ([列值],[列值])); 或: insert into table values ([列值],[列值])); 批量插入 一种可以在代码中循环执行上面的语句,但是这种效率太差。另一种,可以用MySQL支持的批量插入语..

【优快云】 4326

mybatis中使用map类型参数,其中key为列名,value为列值

                    最近有个需求,就是使用mybatis时,向mysql中插入数据,其参数为map类型,map里面的key为列名,而key对应的value是该列对应的列值;问题是每次插入mysql中数据行的部分列,即map里面key的值每次都不固定,在用mybatis时需要通过map的key作为列名。   基础知识   对于这类问题基本思路就是用foreach标签遍...

zhangxiong0301的专栏 2399

InternVL 3.5 深度解析:开源多模态模型的新里程碑

InternVL 3.5是由上海人工智能实验室OpenGVLab团队推出的开源多模态大模型,在推理能力、效率和灵活性方面取得突破。该模型采用ViT-MLP-LLM架构,包含60亿参数的InternViT-6B视觉编码器和多种规格的语言模型骨干。核心创新包括:1)Cascade RL强化学习框架,通过离线热身和在线强化两阶段训练提升推理能力;2)ViR视觉分辨率路由器,动态调整图像处理分辨率以优化计算效率;3)DvD动态视觉token压缩技术。模型系列涵盖2B到241B参数规模,满足从边缘设备到高性能计算的不

m0_47999117的博客 1030

Mybatis循环

Mybatis循环 1. 如果传入list就是list,传入数组就是array,index可以写成index="",单个值传递#{xxxx}随便写 array <select id="selectByYjzt" resultType="com.three.bean.Yjjlb" parameterType="_int"> select * from YJJLB ...

GodPluto的博客 3376

Zemax非序列模式新手入门:从零搭建一个抛物面反射镜系统(含灯丝光源与探测器设置)

本文详细介绍了如何在Zemax非序列模式下从零搭建抛物面反射镜系统,包括灯丝光源配置、反射镜建模和探测器设置等关键步骤。通过实战指南,帮助光学设计新手快速掌握非序列模式的应用技巧,特别适合处理复杂光线传播场景如反射镜系统和杂散光分析。

weixin_28717431的博客 436

F5 Shape盾JSVMP核心检测点与无限并发Header生成实战(TikTok/航司)

本文深入剖析了F5 Shape盾结合JSVMP技术的核心风控机制,详细解读了其针对浏览器指纹、行为时序等多维度的检测逻辑。通过实战案例,分享了如何通过逆向分析、精准Hook关键检测点,并构建稳定、高并发的请求Header生成方案,以应对TikTok、航司等平台的高级反爬挑战。

weixin_29325007的博客 1014

Mybatis中的foreach循环——循环插入多条数据

mybatis中的循环标签

a498936289的博客 4740

Xcelium XRUN实用指南:从入门到高效仿真

本文是Xcelium XRUN仿真工具的实用指南,从基础入门到高效应用全面解析。XRUN作为Cadence Xcelium的统一命令行入口,能自动化编译、精细和仿真流程,大幅提升数字芯片与FPGA验证效率。文章详细介绍了最简命令、波形调试、增量编译、多核并行仿真等核心功能,并提供了管理复杂项目、性能调优与深度调试的进阶技巧,帮助工程师快速上手并精通这一高效仿真工具。

weixin_29238147的博客 741

MyBatis中的循环插入insert foreach

MyBatis中的数据循环插入分析问题解决方法总结 分析问题 在后端数据需要的循环插入数据库中时,不要在实现类ServiceImpl中使用foreach语句 这样会导致每次插入一条数据就会查询一次数据库,导致性能极低 解决方法 在MyBatis中的Mapper.xml使用insert foreach实现数据的循环插入 这样就可以查询一次数据库,将所有数据循环插入 <insert i...

攻城狮Chova的博客 1万+

SXU—软件测试方法和技术-朱少民-第四部分 软件测试流程和规范-附考点

软件测试方法和技术-朱少民-第四章 软件测试流程和规范—这本书最后一部分的考点整理,考点分析

weixin_63597914的博客 1752

SAP CPI 和 PO 的区别

SAP CPI适合云集成轻量级的集成需求,并且由于其云架构,具有快速部署低维护高度可扩展的特点。SAP PO更适合本地系统集成复杂的集成场景和高度定制化的需求,并且对于已经有 SAP 基础设施的企业来说,PO 提供了更多的控制和灵活性。选择使用哪个平台通常取决于企业的技术架构、集成需求、预算以及对灵活性和控制的需求。如果企业主要使用 SAP 的本地系统,并且有复杂的集成需求,那么 SAP PO 是一个理想的选择。如果企业更多地依赖云应用,并希望简化集成操作,那么 SAP CPI 更加适合。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1875

mybatis 用map循环插入数据

用map循环插入数据,比如保存数据到一个中间表里 语句: <!-- 新增案件处理前附件关联关系 --> <insert id="addEventBeforeAnnexe" parameterType="map"> INSERT INTO evt_event_before_annexe (event_id, annexe_id) VALUES &l...

你当像鸟飞往你的山~~ 2447

第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案

本文主要介绍了第三方 API 调用 OpenClaw 出现 LLM request timed out 的解决方案,希望能对使用OpenClaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

Mybatis中如何将SQL中查询出来的数据循环遍历的插入到创建的一张表中

Mybatis中如何将SQL中查询出来的数据循环遍历的插入到一张表中 代码部分: 注解:Mybatis中的xml文件和mapper对应映射 <?xml version="1.0" encoding="UTF-8"?> <!--从视图中查表,获取数据来源--> <select id="selectReportRe...

紫金山上的星空 2600

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mybatis批量插入数据,多层for循环 ,Oracle

mybatis批量插入数据,多层for循环,集合中含有集合 实体类 public class BathExifInfo { private List<ExifInfo> exifInfoList; } public class ExifInfo { private String batchId; private String pageId; private String busiNo; } 保存方法传入参数,为list,list中是对象,对象中

搬砖的鱼的博客 1797

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mybatis中循环查询、插入语句

mybatis处理集合、循环、数组和in查询等语句的使用 在Mybatis的xml配置中使用集合,主要是用到了foreach动态语句。 foreach的参数: foreach元素的属性主要有 item,index,collection,open,separator,close。 item表示集合中每一个元素进行迭代时的别名. index指定一个名字,用于表示在迭代过程中,每次迭代到的位置. open表示该语句以什么开始 separator表示在每次进行迭代之间以什么符号作为分隔符. close表示以什么结束

zzfgwj的博客 3698

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mybatis 循环插入List集合

数据结构: List list = new ArrayList<Map<String,String>>(); mapper: <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://m...

江湖行骗老中医 762

告别循环插入!MyBatis-Plus批量插入效率提升10倍秘诀

通过本次项目演示,我们清晰地看到了MyBatis-Plus批量插入在效率上的巨大优势。它不仅简化了开发流程,还通过内部优化显著提升了性能。对于需要频繁进行大量数据插入的应用场景,MyBatis-Plus无疑是一个值得信赖的选择。如果你也想快速体验这个项目,可以访问InsCode(快马)平台一键部署运行。无需繁琐的环境配置,直接在线体验MyBatis-Plus批量插入的高效性能。

CrystalwaveEagle34的博客 756

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

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

weixin_43882190的博客 3517

mybatis利用sql实现批量删除、利用java循环实现批量插入(删除)

1. 利用sql实现批量删除 可以用in这个操作符来实现批量删除,因为用的是mybatis所以要用到foreach controller层 ------------------------------------------------------------- /** * 批量删除 * 批量删除订阅关联 */ @ApiOperation(value = "批量删除订阅关联接口", notes = "批量删除订阅关联接口", tags = { ApiTagConstan

m0_46623639的博客 1656

Mybatis循环插入Oracle数据库

Mysql循环插入Oracle数据库 查询索引 select SEQUENCE_NAME from user_sequences; 循环插入 第一种: INSERT INTO XXXX( xxx, xxx, xxx, xxx ) SELECT 索引.NEXTVAL AS ID, A.* FROM ( <f...

qq_34432352的博客 608

MyBatis 循环插入数据

代码: <insert id="insertE"> <foreach collection="selE" item="item" separator=";"> INSERT INTO AppRole( RID, DId, MType, DId, Seq, isDelete ) VALUES(#{item.u...

阿甘兄 5998

mybatis insert foreach循环插入

@Insert("<script>" + "insert into driver_account_appeal_photo (appeal_id,appeal_photo_path) values " + "<foreach collection="photoList" item="item" index="index" separator=","> " + " (#{appealId},#{item}) " +

m0_54850825的博客 231

【MyBatis】循环插入List<Map>(87)

1.MyBatis 循环插入List Map

qq_42139049的博客 835
上一篇: 关于重定向RedirectAttributes的用法
下一篇: mybatis批量插入 insert foreach 操作传入map参数
T-OPEN
T-OPEN 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄9年 2万+粉丝 241原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值