JOOQ Oracle Number精度和java编号映射

时间:2016-10-07 15:38:10

标签: java sql oracle jooq

任何人都可以告诉我或提供oracle数字精度和java类型之间的映射的参考,即数字(x)在什么时候被映射到short,int,long BigInteger等

1 个答案:

答案 0 :(得分:2)

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

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

    这可以保证始终可以将SQL值读取到其Java类型。 某些Java值可能无法写入SQL类型。

  • 备选方案: Byte - > NUMBER(3)或更少。

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

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

  • jOOQ主要用作“数据库优先”API
  • 大部分数据都是从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