MyBatis使用foreach批量插入,foreach套查询

news/2024/11/15 21:39:17/

目录跳转

  • 需求场景
  • 我跳进去的坑
  • 解决方式
    • 方法一
    • 方法二
  • 重点(也不是)

需求场景

我需要批量list写入数据到info_notice表格,写入的数据中有一个属性是来之user_info表格。我用foreach去写批量插入,但是在服务层我又不想根据批量写入的数据list去查询每一个nick_name,这样太费时间,效率低下,就想着在写入的时候使用查询去查找我需要nick_name。

我跳进去的坑

我的服务层,xml语句看目录解决方式

public void handle(String auId, String arId, String title) {List<Subscription> subscriptions = subscriptionService.querySubscribe(auId);List<InfoNotice> insertList = new ArrayList<>();Date date = new Date();// 构建通知信息并写入if (CollectionUtils.isEmpty(subscriptions)){return;}for (Subscription subscription : subscriptions) {XXX xxx = new XXX();// ... 操作insertList.add(xxx);}if (insertList.size() < 0){return;}this.insertInfoNoticeList(insertList);}

subscriptions 一开始查询出来的信息是空的,而且我又没判空。
导致直接进行循环操作,insert的时候valus没有数据,就一直报错 ')'解析失败,我以为是我的sql有问题,卡了很久

解决方式

方法一

xml里面,直接用(select)查询出来写入

<insert id="insertInfoNoticeList">INSERT INTO Info_notice (id,be_notified,article_id,author_id,nick_name,title,create_time,modified_time) VALUES<foreach collection="infoNoticeList" item="info" >(#{info.id},#{info.beNotified},#{info.articleId},#{info.authorId} ,(SELECT user_info.nick_name FROM user_info WHERE author_id=#{info.authorId}) ,#{info.title},#{info.createTime},#{info.modifiedTime})</foreach>
</insert>

方法二

我长考这个博客
模仿写出了下面的sql语句

<insert id="insertInfoNoticeList">INSERT INTO Info_notice (id,be_notified,article_id,author_id,nick_name,title,create_time,modified_time)SELECT A.* from(<foreach collection="infoNoticeList" item="info" index="index" separator="union all">SELECT#{info.id} id,#{info.beNotified} be_notified,#{info.articleId} article_id,#{info.authorId} author_id,user_info.nick_name,#{info.title} title,#{info.createTime} create_time,#{info.modifiedTime} modified_timeFROM user_info WHERE author_id=#{info.authorId}</foreach>) A
</insert>

这种写法用于id是使用序列去生成的,看我参考的那个博客就能懂

重点(也不是)


判空很重要


排除坑记录,有用点赞!


http://www.ppmy.cn/news/717142.html

相关文章

mybatis之批量插入

通过动态SQL方式实现 通过动态SQL方式&#xff0c;Executor的类型不需要特别设置&#xff0c;用默认的SIMPLE就可以。 具体步骤如下&#xff1a; 第一步&#xff1a;定义Mapper映射文件和接口类 映射文件中定义动态SQL语句 <insert id"insertBatch" parameter…

Mybatis批量添加(foreach标签)

delete from xxx_table where id in <foreach collection"list" item"item" index"index" open"(" separator"," close")"> #{item} </foreach> > (1,2,3,4) foreach标签&#xff1a;主要应用…

通过Mybatis批量插入表数据

对于需要同时插入大量表数据的需求&#xff0c;我们可以通过下述方式实现&#xff1a; for(Commit commit: commitList){commitDao.insertCommit(commit);}但我们很快就会发现系统效率低下。插入2000条数据大概花了4mins。 在思考如何提速的过程中&#xff0c;首先想到的就是如…

MyBatis批量插入的五种方式,哪种最强?

前言 这里列举了MyBatis和MyBatis-Plus常用的五种批量插入的方式&#xff0c;进行了详细的总结归纳。 准备工作MyBatis利用For循环批量插入MyBatis的手动批量提交MyBatis以集合方式批量新增&#xff08;推荐&#xff09;MyBatis-Plus提供的SaveBatch方法MyBatis-Plus提供的In…

MyBatis 批量插入数据的 3 种方法!

作者 | 王磊 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone 批量插入功能是我们日常工作中比较常见的业务功能之一&#xff0c;之前我也写过一篇关于《MyBatis Plus 批量数据插入功能&#xff0c…

mybatis遍历

参考&#xff1a;foreach 实现 MyBatis 遍历集合与批量操作数据_点滴记录-CSDN博客_mybatis遍历list SELECT * FROM t_employee WHERE id IN (1, 2, 3, ...) /** 根据传入的 id 集合&#xff0c;查询出对应的员工信息&#xff0c;并使用集合保存信息 */ List<Employee> …

MyBatis 使用 foreach 批量插入

教程 单条语句插入多个值 Mapper public interface UserMapper {void batchSave(List<User> userList); }<insert id"batchSave">insert into user(name, password) values<foreach collection"list" item"user" separator&quo…

MyBatis foreach 标签查询案例 MyBatis 批量插入 MyBatis foreach标签批量插入

MyBatis foreach 标签查询案例 MyBatis 批量插入 MyBatis foreach标签批量插入 一、查询语句 <if test"userNos ! null and userNos ! ">AND a.USER_NO IN<foreach collection"userNos.split(,)" item"e" open"(" close"…