那些年ORACLE引號踩過的坑
背景:由於公司所有的專案資料庫都是sqlserver,唯有當前博主繼續做這個專案資料庫是用的ORACLE而且這是一個老專案。框架是已經封裝好的,別的所有專案用這套框架沒有出現任何問題。二次開發專案操作資料庫頻率有點偏高,相信做過稍微大點專案的人都知道,專案中普遍的東西都是資料庫操作控制,比如:許可權,下拉框選項,字典等等。
瞭解了背景,下面我們進入實際場景:
由於是替換資料來源,同事提供了一個策略,流程建議為:新建maven專案-->配置通用框架--->匯入一個類-->啟動,到第二步,啟動專案報了個nullpointer SYS_ID is not find,做過Java的朋友應該都知道這個錯誤是經常遇到的。個人跟蹤發現是jar包報出來的,
找到對應表但是表裡面是有這個欄位的。這個就尷尬了~
經歷九九八十一難,終於在網上找到了答案:
oracle 是區分大小寫的,上天總會留一線生機,那就是當你把欄位打上雙引號時,那麼此時就可以小寫取值,但是取值時必須要加上雙引號。
Eg:
create table "WEIXIN"."USER"(
"name" varchar2(30) not null,
"sex" varchar2(10) not null
)
在這個情況下執行:
select * from “USER” where name='xx' ----此時資料庫會報找不到這個欄位
select * from “USER” where NAME='xx' ----此時資料庫也會報找不到這個欄位
select * from “USER” where “name”='xx' ----查詢出結果
類比推論當都不加雙引號時:
Eg:
create table "WEIXIN".USER(
name varchar2(30) not null,
sex varchar2(10) not null
)
在這個條件下執行sql:
select * from user where name='xx' ---查詢出資料結果,結果中所有欄位名均為大寫
select * from user where NAME='xx' ---查詢出資料結果,結果中所有欄位名均為大寫
select * from user where "name"='xx' ---查詢報錯,找不到該欄位
綜上:ORACLE中建議自己手動寫建表語句,或者全部統一欄位名大小寫為大寫。避免後期帶來一定的後患。用navicat的同志們更要注意了:navicat在建立欄位的時候會給你自動加上雙引號~
看似又柳暗花明了,別的系統(sqlserver)他們的欄位是用的小寫 ,我的ORACLE欄位是用的大寫,框架底層有個list<map<String,Objet>>型別的東東用於資料庫操作取值,用的是小寫取值。大家都知道util包中的Map取值是要區分大小寫的。
最後在不懈努力之下又發現了個新玩意兒:
Map有個兄弟叫CaseInsensitiveMap,要用這個方法,首先得引入一個包apache.commons
只需要把程式碼中的Map<String,Object> map = new HashMap<String,Object>();
把hashMap換成CaseInsensitiveMap就穩妥。
Eg:
Map<String, Object> result = new CaseInsensitiveMap();
result.put("yyy", "666");
System.out.println(result.get("yyy"));
System.out.println(result.get("yYy"));
System.out.println(result.get("YYy"));
System.out.println(result.get("YYY"));
這樣都可以取值成功~
有興趣的大家可以去下載原始碼包反編譯研究一下底層是怎麼實現的,歡迎大家留言交流~