概述
问题
JDBC中利用反射封装结果集数据为对象操作,在转换Oracle 的int类型时候 出现 非法参数异常
java.lang.IllegalArgumentException
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
排查问题发现通过ResltSet 获取字段的列类型为 java.math.BigDecimal类型
刚好和Oracle中number类型对应的数据类型一致
原理
Oracle的界面PLSQL中可以显示类型 发现 列类型 int 换成 number(22)
oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的子集。
int类型只能存储整数;
number可以存储浮点数,也可以存储整数;
number(8,1)存储小数位为1位,总长度为8的浮点数,如果小数位数不足,则用0补全;
number(8)存储总长度为8的整数;
int相当于number(22),存储总长度为22的整数。
类型对应表
注意事项
- Mysql中int 和 integer 同义,y一般对应着java中的long类型。
有时候Mysql的int字段,会正确映射到Java的Integer类型,有时候又会映射到Java的Long类型上,最后终于找到原因。
原来是Mysql的int字段,勾选了unsigned无符号选项,这样就导致int类型,变成了long类型。
同理,MySQL的bigint类型,本来应该映射到Java的Long类型。但是如果勾选了unsigned无符号,则也会映射为BigInteger类型
- Oracle 的 timestamp 对应 java oracle.sql.TIMESTAMP
参考
MySQL与Oracle的数据类型对照表
最后
以上就是悲凉滑板为你收集整理的Oracle中i列定义int类型对应Java中java.math.BigDecimal类型的全部内容,希望文章能够帮你解决Oracle中i列定义int类型对应Java中java.math.BigDecimal类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复