Mysql JDBC在Short和Integer之间的转换:不支持?
MySql列类型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)中显式实现该行为。
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
toInteger
被维护为向后保留
兼容性
因此要求
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,但是具体的行为可能会有所不同,如果值超出范围,一些驱动程序将抛出异常,其他驱动程序将注册警告并应用与强制转换时相同的转换。