最近在將一個開源的任務調度項目(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中取值的時候取不到