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不支持这种基本转换?
答案 0 :(得分:2)
JDBC只是一组接口和requirements,必须在驱动程序中显式实现该行为(在您的情况下,MySQL Connector / J)。对于getObject(int/String, Class)
,API指定:
检索当前行中指定列的值 这个
ResultSet
对象将从SQL的类型转换而来 如果转换是,则为所请求的Java数据类型的列 支持的。如果不支持转换或指定了null 类型,抛出SQLException
。实施必须至少支持定义的转化 在附录B,表B-3 和适当用户定义的转换 SQL类型为实现
SQLData
或Struct
的Java类型。 可能支持其他转换,并且是供应商定义的。
表B-3指定了smallint
的以下转换:
SMALLINT
|Integer
换句话说,MySQL Connector / J驱动程序的行为符合JDBC规范,但允许MySQL支持getObject(String/int, Class)
更广泛的转换。
据我所知,很多JDBC驱动程序确实支持更广泛的转换,并且还支持在表B-4中为setObject
指定的映射的反转:
Short
|SMALLINT
此映射表示setObject(int, <Short value>)
应为参数设置SQL类型SMALLINT
(对于支持动态(或需要显式)键入参数值的数据库/驱动程序)。
并且,有些人还支持B-5对setObject
的额外getObject
次转化:
Short
|TINYINT, SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, BOOLEAN, CHAR, VARCHAR, LONGVARCHAR
getObject
使用Integer
和setObject
支持Short
(和其他人)之间的脱节在很大程度上是历史性的。在JDBC 4.1(Java 7)之前,getObject
只有一个映射(没有Class
参数),并且JDBC的初始版本映射了除BIGINT
到{{java.lang.Integer
之外的所有整数类型1}}。这在规范中明确提到:
注 - JDBC 1.0规范定义了Java对象映射
SMALLINT
和TINYINT
JDBC类型为Integer
。 Java 当语言没有包含Byte
和Short
数据类型时 JDBC 1.0规范已经完成。SMALLINT
和。{{}}的映射 保持TINYINT
到Integer
以保持倒退 兼容性。
因此要求getObject(String/int, Class)
至少支持java.lang.Integer
smallint
保留向后兼容性和getObject(String/int)
的对称性,为{{1}返回java.lang.Integer
}}。不要求(但允许)smallint
强制要求的全套转换,这使得驱动程序实现的添加/转换更容易。