mybatis insert & update
阿新 • • 發佈:2019-02-20
問題:往mysql資料庫插入資料時,當主鍵已經存在時,就更新資料,達到類似oracle資料庫的merge命令。更新資料時,需要對一個欄位進行累加,同時找出另外一個欄位的最大值。
解決辦法:insert into ·····on duplicate update······case when ·····end
mysql語句:
mybatis語句: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);
注意點:<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(欄位名),代表的是原來資料庫中的值。