Mysql JDBC在Short和Integer之间的转换:不支持?

Mysql JDBC在Short和Integer之间的转换:不支持?,mysql,jdbc,Mysql,Jdbc,MySql列类型smallint,映射到java类型java.lang.Integer。它应该是java.lang.Short resultSet.getObject(index, Short.class) java.sql.SQLException: Conversion not supported for type java.lang.Short 为什么JDBC不支持这样的基本转换?JDBC只是一组接口,必须在驱动程序(在您的例子中是MySQL Connector/J)中显式实现该行为。

MySql列类型
smallint
,映射到java类型
java.lang.Integer
。它应该是
java.lang.Short

resultSet.getObject(index, Short.class)

java.sql.SQLException: Conversion not supported for type java.lang.Short

为什么JDBC不支持这样的基本转换?

JDBC只是一组接口,必须在驱动程序(在您的例子中是MySQL Connector/J)中显式实现该行为。对于,API规定:

检索当前行中指定列的值 此
ResultSet
对象,并将从 列转换为请求的Java数据类型(如果转换为 支持。如果不支持转换或为指定了null 将抛出类型
SQLException

实现至少必须支持定义的转换 在附录B中,表B-3和相应用户定义的转换 SQL类型转换为实现
SQLData
Struct
的Java类型。 可能支持其他转换,并由供应商定义

表B-3规定了
smallint
的以下转换:

SMALLINT
|
Integer

换句话说,MySQL连接器/J驱动程序的行为符合JDBC规范,尽管MySQL可以支持对
getObject(String/int,Class)
进行更广泛的转换

据我所知,许多JDBC驱动程序确实支持更广泛的转换,并且还将支持表B-4中为
setObject
指定的反向映射:

Short
|
SMALLINT

此映射意味着
setObject(int,)
应该为参数设置SQL类型
SMALLINT
(对于支持动态(或需要显式)键入参数值的数据库/驱动程序)

而且,有些还支持从B-5对
getObject
进行额外的
setObject
转换:

Short
|
TINYINT、SMALLINT、INTEGER、BIGINT、REAL、FLOAT、DOUBLE、DECIMAL、NUMERIC、BIT、BOOLEAN、CHAR、VARCHAR、LONGVARCHAR

使用
Integer
getObject
与支持
Short
setObject
之间的断开(以及其他)很大程度上是历史遗留下来的。在JDBC 4.1(Java 7)之前,
getObject
只有一个映射(没有
Class
参数),JDBC的初始版本将除
BIGINT
之外的所有整数类型映射到
Java.lang.Integer
。规范中明确提到了这一点:

注意–JDBC1.0规范定义了
SMALLINT
TINYINT
JDBC类型为
Integer
。爪哇 当 JDBC1.0规范最终确定。
SMALLINT
和的映射
TINYINT
to
Integer
被维护为向后保留 兼容性


因此要求
getObject(String/int,Class)
至少为
smallint
支持
java.lang.Integer
,保留了与
getObject(String/int)
的向后兼容性和对称性,对于
smallint
返回
java.lang.Integer
。不需要(但允许)为
setObject
强制执行的全套转换,使得驱动程序实现的添加/转换更加容易。

它不是JDBC,这是MySQL JDBC驱动程序。相关:基本上不能依赖JDBC进行转换。有没有办法检查是否支持到java类型的转换?@Sunnyday没有,但是在这种情况下,如果你真的需要一个短代码,为什么不直接使用
getShort
?getShort(…)会将任何数字转换为短代码?实际上,在我们的例子中,java类型是动态的。@Sunnyday是的,请参见规范中的表B-6,但是具体的行为可能会有所不同,如果值超出范围,一些驱动程序将抛出异常,其他驱动程序将注册警告并应用与强制转换时相同的转换。