gpt4 book ai didi

Java JDBC 类型转换(Firebird/Jaybird): check value/type compatibility before using getter or updater ResultSet method?

转载 作者:行者123 更新时间:2023-12-02 12:00:06 26 4
gpt4 key购买 nike

如果我理解(并测试示例 JDBC 代码;使用 Jaybird for Firebird),即使使用正确的(= 尊重类型映射)更新方法(例如 ResultSet.updateString ),或者也许 PreparedStatement 参数,也可能带来“转换异常” ”。

在实际使用结果集(例如运行更新程序方法)之前是否可以(并且这是一个好的做法)测试实际的 Java 类型/值是否可以安全地转换为目标 SQL 数据类型?

“问题”只是单向吗? IE。当从SQL转换回Java时(使用getter方法),是否保证正确的getter方法永远不会失败(由于转换问题)?

我的示例(使用 Jaybird 3.0.2、JDK1.8):

  • 我需要更新字段: NUMERIC(9,2) 。对应的更新器是: ResultSet.updateBigDecimal(int columnIndex, BigDecimal x) 。如果我使用 x = new BigDecimal("123456789.1234") (更大的精度和规模),我(逻辑上)会得到一个异常:线程“main”org.firebirdsql.jdbc.field.TypeConversionException中出现异常:转换为大十进制时出错。
  • 我需要更新字段: VARCHAR(5) 。相应的更新程序是: ResultSet.updateString(int columnIndex, String x) 。如果我使用 x = "123456" (较长的字符串 6 > 5),我(逻辑上)会得到一个异常:线程“main”java.sql.DataTruncation 中的异常:数据截断。

除了尝试运行查询并捕获异常之外,是否有一些通用的优雅方法(不取决于特定类型)如何检查实际的 Java 值/对象是否可以“保存”到某些 SQL 字段?

我想检查数据编辑对话框中已有的值(在实际运行更新查询之前)。简单的测试“VALUE OK/NOT OK”就可以了(只知道目标 SQL 类型)。

对我来说,找到所有必须“逐个类型”检查的规则(即 VARCHAR 检查字符串长度、NUMERIC 检查精度和小数位数等)似乎相当困难 - 但还有什么?或者这就足够了吗?对于整数和浮点类型不需要检查任何东西?)。

我尝试查看 Jaybird 源代码,但“转换过程”非常复杂(并且特定于类型),我自己找不到答案。

最佳答案

在实际设置值之前,JDBC 不提供任何内容来“检查”值,因此 Jaybird 也不提供:设置值就是检查。确切的行为取决于驱动程序,Jaybird 尝试验证设置值,但其他驱动程序可能会选择将其推迟到数据库本身(因此错误只会在执行时发生)。

通常,您会根据业务需求设计数据库并选择列类型,这自然会在您尝试将其放入数据库之前进行验证。

如果您到目前为止还没有这样做,请开始通过限制长度、使用 Hibernate Validator 之类的东西或 UI 框架的验证来向您的输入表单添加验证。

如果您正在处理高度动态的需求(例如用户提供的查询等),那么您应该使用 JDBC 提供的功能来创建您自己的验证:ParameterMetaData准备好的声明和 ResultSetMetaData结果集(也可以从准备好的语句访问),特别是这些对象的 getPrecision (和 getScale),甚至可能是 DatabaseMetadata.getColumns 之类的东西.

对于字符类型,getPrecision 将指示最大字符数,对于 numericdecimal 类型,您可以使用最大数量小数点之前的数字作为精度 - 小数位

但是在 Jaybird 中,这并不是 100% 准确,例如,如果 Jaybird 无法识别底层,getPrecision 可能会为 numeric(8,2) 返回 9列,Jaybird(和 Firebird)实际上允许精度高达 10,但有一些限制(即 Integer.MAX_VALUE 的未缩放最大值,即该类型的 21474836.47)。

关于第二个问题,使用 getter 是否会导致转换异常:正常情况不会,但例如在值较大的 BIGINT 上调用 getInt()Integer.MAX_VALUEInteger.MIN_VALUE 会。

关于Java JDBC 类型转换(Firebird/Jaybird): check value/type compatibility before using getter or updater ResultSet method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329576/

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