4
回答
JFinal Oracle兼容性
注册华为云得mate10,2.9折抢先购!>>>   

@JFinal 你好,想跟你请教个问题:

Mysql下有一个int rid 字段

如下可正常获取rid值

int rid = user.getInt("rid");
------------------------------
迁移到Oracle后如下:
RID NUMBER 角色ID
--------------------
int rid = user.getInt("rid");

异常如下:

java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Integer


修改代码解决异常:

int rid = user.getBigDecimal("rid").intValue();

--------------------

那么问题来了,理论上Oracle的Number 应该自动映射Integer类型把,怎么会是BigDecimal ,说好的兼容主流库呢?不可能手工到处改吧!

跟了一下源码:
String colClassName = rsmd.getColumnClassName(i);

值=java.math.BigDecimal,Number是这玩意,那还怎么玩?

为了真兼容是否应该根据ResultSetMetaData 中的 DATA_TYPE 进行方言处理?

举报
Jieven
发帖于3年前 4回/552阅
共有4个答案 最后回答: 3年前

    数据库字段类型所对应的 java 类型,完全是由 JDBC 决定的,而 JFinal 未做任何干预。JDBC 是多年的 java 连接、操作数据库的基础标准库,所以 JDBC 所约定的表字段到java类型的映射规则 jfinal 不方便插手,否则就会掩盖掉事实的标准。

   由于不同的数据库有不同的类型规范,从而 JDBC 需要对不同的数据库的字段类型映射为 java 类型的时候分别做出约定,这样就造成了在针对于某个数据库编写的jdbc代码在切换到另一数据上去的时候造成可能的类型转换异常。

   以上是原因,解决办法意想不到的简单,以 java 类型为基准,让这多种数据库的表字段类型都能转换为相同的 java 类型即可,例如:

1:假定你的 mysql 某字段名为 id,类型为 integer

2:那么迁移到 oracle 时则使用 NUMBER(10,0) 

   也即,一旦确定了 java 类型,那么就让字段类型跟着走,具体到你的项目,出现转换异常很可能是 oracle 指定字段时,长度不对, oracle 的 NUMBER 类型,可以随着长度的不同可分别对应于 java 的类型:Integer、Long、Boolean,具体对应关系可参考:http://www.360doc.com/content/12/0305/00/2345340_191736731.shtml

引用来自“JFinal”的评论

    数据库字段类型所对应的 java 类型,完全是由 JDBC 决定的,而 JFinal 未做任何干预。JDBC 是多年的 java 连接、操作数据库的基础标准库,所以 JDBC 所约定的表字段到java类型的映射规则 jfinal 不方便插手,否则就会掩盖掉事实的标准。

   由于不同的数据库有不同的类型规范,从而 JDBC 需要对不同的数据库的字段类型映射为 java 类型的时候分别做出约定,这样就造成了在针对于某个数据库编写的jdbc代码在切换到另一数据上去的时候造成可能的类型转换异常。

   以上是原因,解决办法意想不到的简单,以 java 类型为基准,让这多种数据库的表字段类型都能转换为相同的 java 类型即可,例如:

1:假定你的 mysql 某字段名为 id,类型为 integer

2:那么迁移到 oracle 时则使用 NUMBER(10,0) 

   也即,一旦确定了 java 类型,那么就让字段类型跟着走,具体到你的项目,出现转换异常很可能是 oracle 指定字段时,长度不对, oracle 的 NUMBER 类型,可以随着长度的不同可分别对应于 java 的类型:Integer、Long、Boolean,具体对应关系可参考:http://www.360doc.com/content/12/0305/00/2345340_191736731.shtml

昨天怀疑过 字段长度的问题,但是没去查。还是波总有深度!
哎,再高级的软件,无非就是配置然后输出,找几个一般的程序员就能搞出来。难的是做成拖拽等重量级的一般的程序员就不行了。这种软件业就这个样,一搜一大把,jeecg,webbuilder,Wabacus,什么什么star;以高姿态看待自己的同行,以为做个了crud的可配置程序就好不得了。说白了,自从最强大脑出现了以来魏教授就说了,那些天才都自认为自己是最厉害的,都看不起别人,而实际上呢,也就那么回事。说白了,就是拿着自己做的火药枪就认为自己是发明家,各种自信。
--- 共有 1 条评论 ---
Jieven钱 是唯一可以论证价值的标准,屌丝何苦为难屌丝,都一个屌样! 3年前 回复
顶部