谁能告诉我或提供关于 oracle 数字精度和 java 类型之间映射的参考,即数字(x)在什么时候映射到短整型、整型、长型 BigInteger 等
Java 整数类型与 Oracle 并不完美匹配NUMBER
类型。本质上,有两种方法可以在世界之间进行映射,但两者都不完美:
-
现状:严格小于NUMBER(3)
-> Byte
.
这保证了 SQL 值始终可以读取为其 Java 类型。
某些 Java 值可能无法写入 SQL 类型。
-
另一种选择: Byte
-> NUMBER(3)
或更少。
这将保证 Javabyte
值始终可以写入数据库。不过,某些 DB 值可能无法读取到 Java 类型中。
jOOQ 默认为第一个,因为以下假设:
- jOOQ 主要用作“数据库优先”API
- 大部分数据是从DB读取,而不是写入DB
默认行为
在jOOQ 3.8.4中,实现了以下逻辑DefaultDataType.getNumericClass() https://github.com/jOOQ/jOOQ/blob/version-3.8.4/jOOQ/src/main/java/org/jooq/impl/DefaultDataType.java#L945:
// 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;
}
With:
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 http://www.jooq.org/doc/latest/manual/code-generation/data-type-rewrites
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)