【问题标题】:How to insert Big Integer in prepared statement java如何在准备好的语句java中插入大整数
【发布时间】:2017-03-15 13:03:38
【问题描述】:

我想使用准备好的语句插入一个大整数值,我有一个名为 xid (41527820021925053) 的字符串变量

    preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setObject(1,XOBJ);
    preparedStatement.setObject(2,YOBJ);
    preparedStatement.setBigInteger(3, xid);
    preparedStatement.setInt(4, 23);
    preparedStatement.executeUpdate();
    preparedStatement.close();

我不知道如何实现这一点。

【问题讨论】:

  • 你说的是java.math.BigInteger吗?
  • 仅供参考: 根据this comment by OP,这个问题是关于 PostgreSQL bigint 数据类型,而不是关于 Java BigInteger 类型.

标签: java postgresql jdbc prepared-statement


【解决方案1】:

PreparedStatement 没有 setBigInteger() 方法。

使用以下方法之一:


更新

对于下面的comment made by OP,上面的第二个选项(现在突出显示)是正确的选项,因为 PostgreSQL bigint 与 Java long 相同。

伙计们,我正在使用 postgres,它有 bigint ["UniqueIdGenerator"()] 数据类型,它是一个 17 位大整数。

【讨论】:

  • setLong() 是最好的解决方案!
【解决方案2】:

你可以试试

    preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setObject(1,XOBJ);
    preparedStatement.setObject(2,YOBJ);
    preparedStatement.setBigDecimal(3, BigDecimal.valueOf(Long.parseLong(xid))); //or you can try below
    preparedStatement.setBigDecimal(3, new BigDecimal(xid)); //both are correct
    preparedStatement.setInt(4, 23);
    preparedStatement.executeUpdate();
    preparedStatement.close();

【讨论】:

  • 如果你使用parseLong(),为什么不打电话给setLong()?如果要使用setBigDecimal(),请使用new BigDecimal(xid)。既然答案是正确的,那就错了。
  • 两者都是正确的如果xid的值被限制在long支持的值范围内。问题没有说明是否是这种情况(示例值不是极值的指标)。
  • @helper 提到这是一个 17 位的大数字,他有一个名为 xid 的字符串变量。
  • 您不知道,当您写“两者都是正确的”时,据您知道,它们并非都正确。既然您知道了,它们都会为所有输入值给出正确的结果,但“正确”的答案是使用setLong()。如果您始终牢记该值适合 long,那么从一开始就应该是您的答案。
【解决方案3】:

如果您谈论的是字符串中的整数或长整型值,那么您应该能够只使用setString(idx, yourValue)setObject(idx, yourValue)setObject(idx, yourValue, java.sql.Types.BIGINT),驱动程序应该将其转换为目标类型。

如果您谈论的是java.math.BigInteger,那么符合JDBC 4.1(或更高版本)的驱动程序应该允许您将BigInteger 值设置为BIGINTCHARVARCHARLONGVARCHAR使用setObject(idx, yourBigInteger)setObject(idx, yourBigInteger, targetType) 的列,其中targetType 是例如java.sql.Types.BIGINTjava.sql.Types.VARCHAR

但请注意,并非所有驱动程序都实现此支持。

参见JDBC 4.1 specification 第 3.1 节 变更概述,表 B-4 从 Java 对象类型到 JDBC 类型的映射,表 B-5 转换执行者setObjectsetNull 在 Java 对象类型和目标 JDBC 类型之间。或者,JDBC 4.2 specification,但只有表 B-4 和 B-5。

【讨论】:

  • 一个可以使用 20+ 位整数值的 SQL 数据类型可能定义为 NUMERIC(n, 0)(或 DECIMAL 和/或没有 0 参数或任何 RDBMS 方言所称的) , 这不太可能是BIGINT 的 JDBC 类型。因此,具有BigInteger 值的setObject() 对于文本列以外的任何内容都毫无用处。如果他们至少定义了BigInteger 应该映射到DECIMAL / NUMERIC,那么对BigInteger 的支持就会很有用。
  • @Andreas 可能是这样,但是 JDBC 4.1 定义了这个映射,所以驱动程序必须支持它。但这是一个很好的观点,我会在 JDBC 专家组中提出。
  • 是的,我认为 BigInteger 应该映射到与 BigDecimal 相同的所有 JDBC 类型。我的意思是,如果BigDecimal 可以映射到TINYINT,为什么不能BigInteger?尤其是考虑到BigInteger 在逻辑上BigDecimal 限制为0。
  • @Helper 17 位数字适合长,因此您甚至不需要使用 BigInteger 或字符串。
  • @Helper 你似乎很困惑。 PostgreSQL 数据类型 bigint完全与 Java long 相同,即一个 8 字节的 two's-compliment 整数值。因此,如果您的问题是关于 PostgreSQL bigint 类型,而不是关于 Java BigInteger 类型,这似乎是关于,那么请编辑问题以澄清它,例如说出确切的数据类型名称并提及 RDBMS 供应商/方言。
猜你喜欢
  • 2015-03-02
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2011-11-03
相关资源
最近更新 更多