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

时间:2018-01-28 05:23:43

标签: 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不支持这种基本转换?

1 个答案:

答案 0 :(得分:2)

JDBC只是一组接口和requirements,必须在驱动程序中显式实现该行为(在您的情况下,MySQL Connector / J)。对于getObject(int/String, Class),API指定:

  

检索当前行中指定列的值   这个ResultSet对象将从SQL的类型转换而来   如果转换是,则为所请求的Java数据类型的列   支持的。如果不支持转换或指定了null   类型,抛出SQLException

     

实施必须至少支持定义的转化   在附录B,表B-3 和适当用户定义的转换   SQL类型为实现SQLDataStruct的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使用IntegersetObject支持Short(和其他人)之间的脱节在很大程度上是历史性的。在JDBC 4.1(Java 7)之前,getObject只有一个映射(没有Class参数),并且JDBC的初始版本映射了除BIGINT到{{java.lang.Integer之外的所有整数类型1}}。这在规范中明确提到:

  

注 - JDBC 1.0规范定义了Java对象映射   SMALLINTTINYINT JDBC类型为Integer。 Java   当语言没有包含ByteShort数据类型时   JDBC 1.0规范已经完成。 SMALLINT和。{{}}的映射   保持TINYINTInteger以保持倒退   兼容性。

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