使用開源若依框架,但是數據庫是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>