使用开源若依框架,但是数据库是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>