如果我使用 PreparedStatement.setLong 对应db列为mysql的参数 integer ,通过 int 很明显,它会在java中自动扩展。但是在jdbc的“较低”级别上,它有什么关系吗?可以用吗 long 如果希望db列的数据类型更改为 biginteger 在不久的将来?编辑:我的意思是设置 long 总是收到 int ,所以我不会意外地传递一个对于db列来说太大的值。
PreparedStatement.setLong
integer
int
long
biginteger
x6h2sr281#
从100%正式的Angular 来看,使用它可能是不安全的 setLong 对于一个 INTEGER 列。JDBC4.3规范说 setXXX -方法(除 setObject )遵循附录b.2中的Map,它说 long Map到sql BIGINT . 然后取决于驱动程序或数据库是否可以使用 BIGINT 带有 INTEGER 列。关于这个问题的jdbc 1.20规范说:
setLong
INTEGER
setXXX
setObject
BIGINT
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 在应用程序中匹配数据库。
Long
getObject
TINYINT
SMALLINT
REAL
FLOAT
DOUBLE
DECIMAL
NUMERIC
BIT
BOOLEAN
CHAR
VARCHAR
LONGVARCHAR
getLong
1条答案
按热度按时间x6h2sr281#
从100%正式的Angular 来看,使用它可能是不安全的
setLong
对于一个INTEGER
列。JDBC4.3规范说setXXX
-方法(除setObject
)遵循附录b.2中的Map,它说long
Map到sqlBIGINT
. 然后取决于驱动程序或数据库是否可以使用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
在应用程序中匹配数据库。