任何人都可以告诉我或提供oracle数字精度和java类型之间的映射的参考,即数字(x)在什么时候被映射到short,int,long BigInteger等
答案 0 :(得分:2)
Java的整数类型不是Oracle NUMBER
类型的完美匹配。从本质上讲,有两种方法可以在世界之间进行映射,两者都不完美:
现状:严格低于NUMBER(3)
- > Byte
。
这可以保证始终可以将SQL值读取到其Java类型。 某些Java值可能无法写入SQL类型。
备选方案: Byte
- > NUMBER(3)
或更少。
这将保证始终可以将Java byte
值写入数据库。但是,某些DB值可能无法在Java类型中读取。
jOOQ默认为第一个,因为以下假设:
在jOOQ 3.8.4中,DefaultDataType.getNumericClass()
中实现了以下逻辑:
// Integers
if (scale == 0 && precision != 0) {
if (precision < BYTE_PRECISION) {
return Byte.class;
}
if (precision < SHORT_PRECISION) {
return Short.class;
}
if (precision < INTEGER_PRECISION) {
return Integer.class;
}
if (precision < LONG_PRECISION) {
return Long.class;
}
// Default integer number
return BigInteger.class;
}
// Non-integers
else {
return BigDecimal.class;
}
使用:
int LONG_PRECISION = String.valueOf(Long.MAX_VALUE).length(); // 19
int INTEGER_PRECISION = String.valueOf(Integer.MAX_VALUE).length(); // 10
int SHORT_PRECISION = String.valueOf(Short.MAX_VALUE).length(); // 5
int BYTE_PRECISION = String.valueOf(Byte.MAX_VALUE).length(); // 3
例如,如果在某些情况下使用NUMBER(3)
来存储byte
数字,最多可以127
,您可以通过在代码生成阶段指定数据类型重写来覆盖此默认值。这在此处记录:
http://www.jooq.org/doc/latest/manual/code-generation/data-type-rewrites