那些年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"));

这样都可以取值成功~

有兴趣的大家可以去下载源码包反编译研究一下底层是怎么实现的,欢迎大家留言交流~

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值