gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:32:45 25 4
gpt4 key购买 nike

任何人都可以告诉我或提供 oracle 数字精度和 java 类型之间映射的引用,即数字 (x) 在什么时候映射到短、整数、长 BigInteger 等

最佳答案

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

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

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

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

    这将保证 Java byte 值始终可以写入数据库。不过,某些 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

关于java - JOOQ Oracle Number精度和java数字映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39921053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com