背景:由于公司所有的项目数据库都是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"));
这样都可以取值成功~
有兴趣的大家可以去下载源码包反编译研究一下底层是怎么实现的,欢迎大家留言交流~