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

需求场景

我需要批量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_time
        FROM user_info WHERE author_id=#{info.authorId}
    </foreach>
    ) A
</insert>

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

重点(也不是)


判空很重要


排除坑记录,有用点赞!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值