在java中准备语句时使用long而不是int有什么缺点吗?

8mmmxcuj  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(601)

如果我使用 PreparedStatement.setLong 对应db列为mysql的参数 integer ,通过 int 很明显,它会在java中自动扩展。但是在jdbc的“较低”级别上,它有什么关系吗?可以用吗 long 如果希望db列的数据类型更改为 biginteger 在不久的将来?
编辑:我的意思是设置 long 总是收到 int ,所以我不会意外地传递一个对于db列来说太大的值。

x6h2sr28

x6h2sr281#

从100%正式的Angular 来看,使用它可能是不安全的 setLong 对于一个 INTEGER 列。JDBC4.3规范说 setXXX -方法(除 setObject )遵循附录b.2中的Map,它说 long Map到sql BIGINT . 然后取决于驱动程序或数据库是否可以使用 BIGINT 带有 INTEGER 列。
关于这个问题的jdbc 1.20规范说:

7.2.1 in参数的数据类型一致性

preparedstatement.set方法不执行任何常规数据类型转换。相反,java值只是简单地Map到相应的sql类型(遵循第28页表3中指定的Map),然后将该值发送到数据库。
程序员有责任确保每个参数的java类型Map到与数据库期望的sql数据类型兼容的sql类型。为了最大限度地提高可移植性,程序员应该使用与数据库所期望的确切sql类型相对应的java类型。
如果程序员需要in参数的数据类型转换,他们可以使用preparedstatement.setobject方法,该方法在将值发送到数据库之前将java对象转换为指定的sql类型。
这一措辞在最近的jdbc规范中不再出现,但其意图仍然适用,并由jdbc 4.3中的附录b.2定义。
然而,在实践中,许多jdbc驱动程序(包括mysql connector/j)支持更广泛的转换,类似于为 setObject 在附录b.5中,尽管每个驱动程序在这里都有自己的注意事项和怪癖。为了 Long 这意味着 getObject can目标 TINYINT , SMALLINT , INTEGER , BIGINT , REAL , FLOAT , DOUBLE , DECIMAL , NUMERIC , BIT , BOOLEAN , CHAR , VARCHAR , LONGVARCHAR ,这通常意味着你也可以这样做 setLong 也。
这也提供了转换的一致性 getLong 定义见附录b.6。
它是否有缺点,取决于它的实现。mysql connector/j驱动程序是开源的,所以如果您想知道具体细节,请查看源代码。
但是,如果应用程序实际使用 long ,为什么是数据库类型 INTEGER ? 任意使用 BIGINT 在数据库中匹配应用程序,或使用 int 在应用程序中匹配数据库。

相关问题