【问题标题】:JOOQ Oracle Number precision and java number mappingJOOQ Oracle Number 精度和 java number 映射
【发布时间】:2017-02-16 16:16:18
【问题描述】:

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

【问题讨论】:

    标签: java sql oracle jooq


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2014-06-15
      • 2015-03-28
      • 2018-01-11
      相关资源
      最近更新 更多