1. 程式人生 > >Mysql資料庫切換成Oracle資料庫,使用Mybatis+Oracle整合專案,Mysql與Oracle差別總結

Mysql資料庫切換成Oracle資料庫,使用Mybatis+Oracle整合專案,Mysql與Oracle差別總結

最近公司給我一個任務,把現有專案由Mysql切換成Oracle,而且還要求相容Mysql和Oracle資料庫。網上有很多類似的資源,說了這兩個資料庫的差別,但是沒有進行完整的總結。在這個任務完成後,我在這裡總結一下。

1.原有的mysql的insert語句,沒有做空判斷,也沒有指定jdbc型別,當換成Oracle時,插入資料就報錯了,總是提示“索引錯誤,不能將null值插入到某個欄位中”。意思就是如果插入的某個物件的某個欄位值為空是,insert語句就會報錯了。

解決辦法:

網上總結說,values值指定jdbc型別就可以了

但是這個始終不是最終解決辦法,當把null值insert的時候,又會報不能給null值指定jdbc型別。所以最好的辦法,就是欄位和value值都做非空判斷!

2.Oracle的mapper檔案中,insert的sql語句不要寫useGeneratedKeys="true" 和 keyProperty="id",首先Oracle是不支援主鍵生成的,所以useGeneratedKeys肯定會報錯。要相容Mysql和Oracle,id最好通過程式碼來生成,插入的時候給id設定。entity.setId(UUIDUtils.getUUID());那麼也就用不上返回剛剛插入的id的用途了,直接通過程式碼得到剛剛的id即可。而且keyProperty屬性也不能寫,否則會改變id的值。

比如,如果insert語句使用了keyProperty="id":

String id = UUIDUtils.getUUID();

entity.setId(id );

userDao.insert(entity);

System.out.println(id);

此時,System.out.println(id);輸出的id值就跟上面第一句程式碼的id不一樣了。

3.Mybatis+Oracle二次插入有問題

當資料庫為Mysql的時候,資料插入是沒有問題的。但是切換至Oracle的時候,第一次插入無異常,第二次插入的時候就提示索引異常,但是id明明是有的,且不重複的。

解決辦法:

註釋PSCache配置程式碼
<!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->
        <!--如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫分表較多的資料庫,建議配置為false。-->
        <!--<property name="poolPreparedStatements" value="true" />-->
        <!--<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />-->

4.Mysql和Oracle的一些sql函式差異

4.1 UUID(); Mysql是可以使用這個函式的,並通過sql語句生成ID,但是Oracle是無法識別的,所以為了相容兩個資料庫,最好通過程式碼生成id,然後直接insert對應的id即可

4.2 DATE_FORMAT()  很多時候關於表單查詢都會有時間範圍查詢,比如查詢開始時間到結束時間的某些資料。這時候如果資料庫欄位儲存的是字串型別的時間戳,那麼比較時間時候就要進行格式轉化。

Msql就是通過DATE_FORMAT()進行轉換的。

Select * From user Where DATE_FORMAT(birthday,'%m-%d') >= '06-03' and DATE_FORMAT(birthday,'%m-%d') <= '07-08';

但是Oracle是通過to_date()函式轉換的

SELECT * FROM testdatetime t WHERE 1=1 AND to_date(t.createdate,'yyyy-MM-dd') between to_date('2011-06-01','yyyy-MM-dd') and to_date('20110705','yyyymmdd') ;  

所以為了進行相容處理,要使用CDATA函式,那麼兩者都可以相容了

 
 

4.3  CONCAT()函式,模糊查詢為了防止sql注入,Mysql+Mybaits是用CONCAT()函式,但是Oracle用的是instr()函式。所以為了兩者都可以使用,所有的模糊查詢只能用like來解決了

4.4 limit 分頁查詢。Mysql的分頁是limit,但是Oracle的是rownumber,所以分頁不要在sql語句中做處理。通過攔截器即可

Map<String, Object> page = etlTaskService.getPage(params, new PageBounds(currentPageNo,pageSize, true));

在Mybatis的配置檔案中,加入此外掛。每個公司的分頁攔截器用的可能都不一樣,不過大同小異

4.5 獲取當前時間的差異。很多時候,當我們做新增和修改時候,建立時間和修改時間都喜歡取系統時間,在sql中指定即可,但是。Mysql用的是select now();函式,Oracle則是select sysdate from dual;所以鑑於兩者的差異,這種時間處理也要跟id一樣,通過程式碼來進行處理,不要在sql中處理。

以上,為Mysql切換Oracle資料庫,並且系統要求相容Mysql+Oracle的一些技術總結。歡迎大家點評,後續可以繼續補充!