一尘不染

JOOQ Oracle Number精度和Java数字映射

sql

任何人都可以告诉我或提供对Oracle数字精度和Java类型之间映射的引用,即在什么时候number(x)映射到short,int,long
BigInteger等。


阅读 213

收藏
2021-03-08

共1个答案

一尘不染

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

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

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

  • 替代方法: Byte ->NUMBER(3)或更少。

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

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

  • jOOQ通常用作“数据库优先” 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

2021-03-08