mybatis insert & update

来源:互联网 发布:php程序员的工作状态 编辑:程序博客网 时间:2024/06/16 05:04

问题:往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(字段名),代表的是原来数据库中的值。

0 0
原创粉丝点击