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