mybatis中merge into批量使用问题

问题描述

<insertid="insertAttractionsBatch"parameterType="java.util.List">MERGEINTOTM_USER_CART_INFOT1USING(<foreachcollection="list"item="item"index="index"separator="union">select(SELECTT2.F_CART_IDFROMTM_USER_CART_INFOT2WHERENOTEXISTS(SELECT''FROMTM_USER_CART_MARKETT3WHERET3.F_CART_ID=T2.F_CART_ID)ANDT2.F_CHANNEL_NUM=#{item.channelNum}ANDT2.F_USER_ID=#{item.userId}ANDT2.F_GOODS_NUM=#{item.goodsNum}ANDT2.F_REGION_NUM=#{item.regionNum})F_CART_ID,#{item.goodsNum}F_GOODS_NUMfromdual</foreach>)TON(T1.F_CART_ID=T.F_CART_IDANDT1.F_GOODS_NUM=T.F_GOODS_NUM)WHENMATCHEDTHENUPDATESETT1.F_GOODS_COUNT=T1.F_GOODS_COUNT+#{item.goodsCount},T1.F_UPDATE_TIME=(SELECTTO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')FROMDUAL)WHENNOTMATCHEDTHENINSERT(F_CART_ID,F_CHANNEL_NUM,F_MERCHANT_NUM,F_USER_ID,F_GOODS_NUM,F_GOODS_COUNT,F_ADD_TIME,F_REGION_NUM)VALUES(#{item.cartId},#{item.channelNum},'',#{item.userId},#{item.goodsNum},#{item.goodsCount},(SELECTTO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')FROMDUAL),#{item.regionNum})</insert>update和insert部分参数应该怎么填写?我试过#{item.cartId}发现使用的是用一个值,直接#{cartId}会找不到。求大神指点。

解决方案

解决方案二:
{item.cartId},没在foreach里面?
解决方案三:
问题解决了。insert和update中所有的数据都需要从using中获取,这样就能达到批量mergeinto的效果了MERGEINTOTM_USER_CART_INFOT1USING(<foreachcollection="list"item="item"index="index"separator="union">SELECTCASEWHENTEMP1.F_CART_IDISNULLTHENTEMP.F_CART_IDELSETEMP1.F_CART_IDENDF_CART_ID,TEMP.F_GOODS_NUM,TEMP.F_USER_ID,TEMP.F_REGION_NUM,TEMP.F_CHANNEL_NUM,TEMP.F_GOODS_COUNTFROM(SELECT#{cartId}F_CART_ID,#{goodsNum}F_GOODS_NUM,#{userId}F_USER_ID,#{regionNum}F_REGION_NUM,#{channelNum}F_CHANNEL_NUM,#{goodsCount}F_GOODS_COUNTFROMDUAL)TEMPLEFTJOIN(SELECT*FROMTM_USER_CART_INFOT2WHERE1=1ANDT2.F_USER_ID=#{userId}ANDT2.F_GOODS_NUM=#{goodsNum}ANDT2.F_REGION_NUM=#{regionNum}ANDT2.F_CHANNEL_NUM=#{channelNum}andNOTEXISTS(SELECT''FROMTM_USER_CART_MARKETT3WHERET3.F_CART_ID=T2.F_CART_ID))TEMP1ONTEMP1.F_GOODS_NUM=TEMP.F_GOODS_NUM</foreach>)TON(T1.F_CART_ID=T.F_CART_ID)WHENMATCHEDTHENUPDATESETT1.F_GOODS_COUNT=T1.F_GOODS_COUNT+T.F_GOODS_COUNT,T1.F_UPDATE_TIME=(SELECTTO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')FROMDUAL)WHENNOTMATCHEDTHENINSERT(F_CART_ID,F_CHANNEL_NUM,F_MERCHANT_NUM,F_USER_ID,F_GOODS_NUM,F_GOODS_COUNT,F_ADD_TIME,F_REGION_NUM)VALUES(T.F_CART_ID,T.F_CHANNEL_NUM,'',T.F_USER_ID,T.F_GOODS_NUM,T.F_GOODS_COUNT,(SELECTTO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')FROMDUAL),T.F_REGION_NUM)
解决方案四:
上面写错了,#{xxxx}改成#{item.xxxx}

时间: 2025-01-26 19:08:53

mybatis中merge into批量使用问题的相关文章

mybatis中批量插入的两种方式(高效插入)_java

MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 一.mybiats foreach标签 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主

MyBatis中insert操作返回主键的实现方法_java

在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="

Mybatis中的collection、association来处理结果映射

前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到实体类集合List<UserEvent>,但是实体中只有eventId信息,其他属性值均为空. 需要从数据库中查询数据,完善List<UserEvent>的信息并返回. 相关业务表以及对应的实体类,如下图.(为了回避项目信息,相关业务内容均省略,以下表名.实体名.代码变量名等均用字母A

Mybatis中注解@MapKey的使用详解_java

mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/. 在研究Mybatis源码之前并不知道这个注解的妙用的,但是当我看到参数解析的时候 有这个一个注解,所以我了解了一下,当我们返回像Map<String, Map<String, Object>>这种类型的时候,我们往往很难做到,因为这里面可能是多个表的数据,所以我们不可能再建一个模型. 这时候我们就可以使用这个注解了 @Retention(Retention

Oracle DML语句中MERGE的用法

把数据从一个表复制到另一个表,插入新数据或替换掉老数据是每一个ORACLE DBA都会经常碰到的 问题. 在ORACLE9i以前的年代,我们要先查找是否存在老数据,如果有用UPDATE替换,否则用INSERT语句 插入,其间少不了还有一些标记变量等等,繁琐的很. 现在ORACLE9i专为这种情况提供了MERGE语句,使这一工作变得异常轻松,Oracle9i引入了MERGE命 令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源 中选择

Win7中如何进行批量修改文件属性

问:以前我用Windows XP时,因嫌显示器上的字小,所以将小说下载到本地硬盘,再修改源文件,将字体放大后再看.现在我新买了一台电脑,预装的是Windows 7 家庭普通版,却发现文件的属性一直是只读,无法修改,请问Windows 7 家庭普通版中应该如何批量修改文件属性? 答:如果你的源文件很多,假设都放在D:books这个路径中,你可以依次点击"开始→附件",找到"命令提示符"后,鼠标右键点击,选择"以管理员身份运行"打开命令提示符,然后敲

word2010中如何进行批量替换

  今天为大家介绍一下在word2010中如何进行批量替换,下面一起来看看具体操作吧. 步骤/方法 1.先打开文档,再打开菜单栏上的"编辑"中的"替换"命令,同样,你也可以直接按 Ctrl+H 替换的快捷键,来打开"替换"功能窗口; 2.在替换中"查找内容"中输入你的错别字; 3.在"替换为"中输入正确的字; 4.然后按下面的"全部替换"按钮,此时,文中所有错别字已经全部替换成正确字了.

在PHP中如何做批量删除?

  在PHP中怎么做批量删除?求代码 最近在做一个项目,但是批量删除一直都不能达到效果.我把代码贴在下面,各位大牛帮我看看,问题出在什么地方,再此谢谢了! //1.批量删除 if($_POST["chk"]){ $sid = implode(",", $_POST["chk"]); $query = mysql_query("delete from news where news_id in (".$sid.")&q

Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql

Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql 在自己的dao类中继承SqlSessionDaoSupport类 /** * @author herman.xiong * @since 0.1 * @param <T>实体类 * @param <PK>主键类,必须实现Serializable接口 */ package com.dao; import java.io.Serializable; import org.apache.log4j.Logg