JOOQ Oracle数字精度和java数字映射



谁能告诉我或提供一个参考oracle数字精度和java类型之间的映射,即在什么时候一个数字(x)被映射到一个短,int,长BigInteger等

Java的整数类型与Oracle的NUMBER类型并不完全匹配。从本质上讲,有两种方法可以在两个世界之间进行映射,它们都不完美:

  • 现状:严格小于NUMBER(3) -> Byte

    这保证了SQL值总是可以被读取为它的Java类型。某些Java值可能无法写入SQL类型

  • 替代: Byte -> NUMBER(3)或更小。

    这将保证Java byte值始终可以写入数据库。但是,有些DB值可能无法被Java类型读取。

jOOQ默认为第一个,因为以下假设:

    jOOQ主要用作"数据库优先"API大多数数据是从DB中读取的,而不是写入到DB中。

默认行为

在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

最新更新