JOOQ Oracle Number 精度和 java 数字映射
JOOQ Oracle Number precision and java number mapping
任何人都可以告诉我或提供 oracle 数字精度和 java 类型之间映射的参考,即数字 (x) 在什么时候映射到 short、int、long BigInteger 等
Java 的整数类型与 Oracle 的 NUMBER
类型不完美匹配。从本质上讲,有两种方法可以在世界之间进行映射,但都不完美:
现状:严格小于NUMBER(3)
->Byte
。
这保证了 SQL 值总是可以读取到它的 Java 类型。
某些 Java 值可能无法写入 SQL 类型。
备选方案: Byte
-> NUMBER(3)
或更少。
这将保证 Java byte
值始终可以写入数据库。但是,某些 DB 值可能无法读入 Java 类型。
jOOQ 默认为第一个,因为以下假设:
- jOOQ 主要用作 "database first" API
- 大部分数据是从数据库中读取的,而不是写入到数据库中的
默认行为
在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
任何人都可以告诉我或提供 oracle 数字精度和 java 类型之间映射的参考,即数字 (x) 在什么时候映射到 short、int、long BigInteger 等
Java 的整数类型与 Oracle 的 NUMBER
类型不完美匹配。从本质上讲,有两种方法可以在世界之间进行映射,但都不完美:
现状:严格小于
NUMBER(3)
->Byte
。这保证了 SQL 值总是可以读取到它的 Java 类型。 某些 Java 值可能无法写入 SQL 类型。
备选方案:
Byte
->NUMBER(3)
或更少。这将保证 Java
byte
值始终可以写入数据库。但是,某些 DB 值可能无法读入 Java 类型。
jOOQ 默认为第一个,因为以下假设:
- jOOQ 主要用作 "database first" API
- 大部分数据是从数据库中读取的,而不是写入到数据库中的
默认行为
在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