mybatis + oracle merge into


使用開源若依框架,但是數據庫是oracle的,下載了若依提供的oracle版本(https://pan.baidu.com/s/1RJKzI4KFaLwnAu3oQBTiFg),但是發現部分sql有些問題,例如
SysUserOnlineMapper.xml中的saveOnline方法,原來的mysql版本的sql語句是replace into,oracle版本中的直接改成了insert into,在service層中代碼都是一樣的,
這樣在shiro框架中調用saveOnline方法的時候,只能insert不能更新,於是考慮有兩個辦法修改
一是在service層根據sessionId先判斷數據庫有沒有該記錄,如果有就更新,如果沒有就新增。或是直接先根據主鍵刪除,然后再插入online實體
二是利用oracle 的merge into 語法,需要注意的是如果是單表merge into ,匹配之前的判斷條件要寫成
 USING (SELECT #{sessionId} AS id  FROM DUAL ) S ON
             (T.sessionId=S.id)

第一種方法比較好改,而第二種由於以前沒使用過該語句,在調試過程中出現了一些問題(都是低級錯誤,例如update的地方多了個括號,整個語句最后多了分號),好在最后都解決了,下面附上mybatis中的配置:

<update id="saveOnline" parameterType="SysUserOnline">
    merge into sys_user_online T
    USING (SELECT #{sessionId} AS id  FROM DUAL ) S ON
             (T.sessionId=S.id)
    WHEN MATCHED THEN
         UPDATE SET T.login_name=#{loginName}, T.dept_name=#{deptName}, T.ipaddr=#{ipaddr}, T.login_location= #{loginLocation}, T.browser=#{browser}, T.os=#{os},
          T.status=#{status}, T.start_timestamp=#{startTimestamp}, T.last_access_time=#{lastAccessTime}, T.expire_time=#{expireTime}
    WHEN NOT MATCHED THEN
         insert (sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time)
            values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{status},#{startTimestamp}, #{lastAccessTime}, #{expireTime})
</update>

 


免責聲明!

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



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