目录跳转
- 需求场景
- 我跳进去的坑
- 解决方式
- 方法一
- 方法二
- 重点(也不是)
需求场景
我需要批量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是使用序列去生成的,看我参考的那个博客就能懂
重点(也不是)
判空很重要
排除坑记录,有用点赞!