1. 程式人生 > >mybatis insert & update

mybatis insert & update

問題:往mysql資料庫插入資料時,當主鍵已經存在時,就更新資料,達到類似oracle資料庫的merge命令。更新資料時,需要對一個欄位進行累加,同時找出另外一個欄位的最大值。

解決辦法:insert  into ·····on duplicate update······case when ·····end

mysql語句:

INSERT INTO stat_flow (
    USER_ID, 
    MOBILE, 
    MONTH,
    YEAR, 
    SUM_TIMES, 
    SUM_USED_COIN,
    MAX_USED_COIN)
VALUES(·····)
ON DUPLICATE KEY UPDATE 
	SUM_TIMES = SUM_TIMES+ values(SUM_TIMES),
	SUM_USED_COIN = SUM_USED_COIN + values(SUM_USED_COIN),
	MAX_USED_COIN = (CASE WHEN MAX_USED_COIN < values(MAX_USED_COIN) THEN values(MAX_USED_COIN) 
		ELSE MAX_USED_COIN END);
mybatis語句:
 <insert id="insertStatFlow" parameterType="java.util.List" >  	
    	INSERT INTO stat_flow (
		    USER_ID, 
		    MOBILE, 
		    MONTH,
		    YEAR, 
		    SUM_TIMES, 
		    SUM_USED_COIN,
		    MAX_USED_COIN)
		VALUES
	    	<foreach collection="list" item="item" index="index" separator="," >  
	        	(
		        	#{item.user_id},
		        	#{item.mobile},
		        	#{item.month},
		        	#{item.year},
		        	#{item.sum_times},
		        	#{item.sum_used_coin},
		        	#{item.max_used_coin}
	        	)  
	    	</foreach> 
	   	ON DUPLICATE KEY UPDATE 
			SUM_TIMES = SUM_TIMES+ values(SUM_TIMES),
			SUM_USED_COIN = SUM_USED_COIN + values(SUM_USED_COIN),
			MAX_USED_COIN = 
				CASE 
				     WHEN MAX_USED_COIN <![CDATA[<=]]> values(MAX_USED_COIN) THEN values(MAX_USED_COIN) 
				     ELSE MAX_USED_COIN 
				END
 </insert>
注意點:

1. mysql語句中的大小比較符 <、>、<= 、>= 需要特殊處理,在mybatis中分別是<![CDATA[<]]> 、<![CDATA[>]]> 、<![CDATA[<=]]>、 <![CDATA[>=]]> ,因為尖括號在xml中代表是一個標籤。

2. value(欄位名),代表的是原來資料庫中的值。