mybatis里oracle與MySQL的insert_update


需求:gisdata表中插入數據,如果wxid數據存在就更新,不存在就插入

Mysql的mybatis配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 3     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 4 <mapper namespace="com.test.wechat.dao.GisDataMapper">
 5     <sql id="userColumns">
 6         wxid,ip,port,login_username,login_status,wx_num,tel,qq,email,task_name,min_longitude,max_longitude,min_latitude,max_latitude,clent_id,country,province,city,town
 7     </sql>
 8 
 9     <insert id="insertGisData" parameterType="GisData" useGeneratedKeys="true">
10         replace into gisdata (<include refid="userColumns"/>) values (#{wxid},#{ip},#{port},#{loginUsername},#{loginStatus},#{wxNum},#{tel},#{qq},#{email},#{taskName},#{minLongitude},#{maxLongitude},#{minLatitude},#{maxLatitude},#{clentId},#{country},#{province},#{city},#{town})
11     </insert>
12     <!-- <delete id="deleteGisData" parameterType="int">
13         delete from gis_data
14     </delete> -->
15 </mapper>

oracle的mybatis配置

 1 <insert id="insertGisData" parameterType="GisData" 
 2  merge into gisdata gd
 3  using dual on(gd.wxid=#{wxid})
 4  when matched then
 5  update
 6  set gd.ip = #{ip},
 7  gd.port=#{port},
 8  gd.wx_num=#{wx_num}
 9  gd.town=#{town}
10  when not matched then
11  insert
12  (
13  wxid,ip,port,wx_num,town
14  ) 
15  values
16  (
17  #{wxid},#{ip}, #{port},#{wx_num},#{town}
18  )
19  </insert>

 

 備注:MySQL 的 replace into:插入數據前,replace into會首先根據主鍵或唯一索引判斷是否存在相同的記錄,如果存在,則先刪除原來數據,然后再插入新數據;如果沒有相同的記錄,則直接插入。

oracle的merge into:與mysql中的replace into類似,在插入數據前,merge into也會根據主鍵判斷是否有相同的記錄,不同的是后面的操作,merge into對於存在的相同記錄可以不做任何操作,也可以進行修改操作,但是不能有其他操作;如果沒有相同記錄,可以不做任何操作,也可以做插入操作,同樣也 不能有其他操作。

 

但我實際驗證時發現兩者之間有一個區別(都是操作同一張表):

MySQL的replace into 1.更新已存在數據  2.刪除與新數據匹配不上的數據 3.插入新數據(與原表匹配不上的數據)

oracle的merge into 只能更新與追加


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM