最近在将一个开源的任务调度项目(XXL-JOB)从mysql转为oracle,之前采用的是mybatis+mysql,现在改为mybatis+oracle的结构,在转换的过程中遇到了很多问题。
分页问题
mysql的分页
SELECT <include refid="Base_Column_List" />
FROM xxl_job_info AS t
ORDER BY id DESC
LIMIT #{offset}, #{pagesize}
oracle的分页
select * from (
SELECT row_number() over(ORDER BY t.job_id DESC) r,
<include refid="Base_Column_List" />
FROM xxl_job_info t
) WHERE r BETWEEN #{offset}+1 AND #{offset}+#{pagesize}
当然orcale的分页还可以参考分页插件,但是这里为了不动上层的代码,直接修改的mapper文件,就是上面这种方式
;问题
在mybatis中mysql数据库是可以在sql语句后面加上分号(;)的,但是orcale的sql后面加分号(;)则会报错(ORA-00911: 无效字符—错误),需要把所有sql后面带有的分号(;)去掉
jdbcType 的问题
在mysql中添加空值,则会默认给一个空值,但是orcale中没有指定jdbcType的时候,传入空值就会报错,需要我们指定参数的jdbcType.
字段查询结果为大写
SELECT
COUNT(handle_code) triggerDayCount,
SUM(CASE WHEN (trigger_code in (0, 200) and handle_code = 0) then 1 else 0 end) as triggerDayCountRunning,
SUM(CASE WHEN handle_code = 200 then 1 else 0 end) as triggerDayCountSuc
FROM xxl_job_log
WHERE trigger_time BETWEEN #{from,jdbcType=TIMESTAMP} and #{to,jdbcType=TIMESTAMP}
在代码中用map接收上面sql的结果,
使用mysql : map中的key值为sql中的驼峰样式
使用oracle:map中的key值全部转为了大写,如(triggerDayCount 变成了TRIGGERDAYCOUNT)
这样会导致我们用key从map中取值的时候取不到