JDBC ResultSet对象类型映射没有Byte或Short?为什么只有Integer?

问题描述:

美好的一天。任何人都可以解释为什么JDBC没有为某些类型实现对象映射。例如,Postgres JDBC没有Byte和Short映射。我可以得到原始字节和简短,但在对象格式,我只能得到整数。JDBC ResultSet对象类型映射没有Byte或Short?为什么只有Integer?

这是here

case Types.TINYINT: 
case Types.SMALLINT: 
case Types.INTEGER: 
    return getInt(columnIndex); 

源代码,什么是错wtih字节和短对象类型?我如何使用TINYINT,SMALLINT等。

什么是实现了getByte和getShort类似getInt

答案是在JDBC™ 4.1 Specification JSR 221 页面上187

注意问题 - JDBC 1.0规范中定义的Java对象为 映射SMALLINT和TINYINT JDBC类型为Integer。 Java语言 在完成JDBC 1.0 规范时未包含字节和短数据类型。将SMALLINT和TINYINT映射到 Integer以保持向后兼容性。

+0

这是很可悲。我们现在使用4.1规范,但仍保持与1.0版本的向后兼容性。我不关心兼容性。我厌倦了编写ResultSet包装器和sql util方法。 – Binakot

向后兼容JDBC Specification 1.0不允许在JDBC驱动程序中添加Byte和Short对象类型。只有一个解决方案:java拐杖。

static public Integer getInteger(final ResultSet rs, final String columnName) throws SQLException { 
    final int value = rs.getInt(columnName); 
    return rs.wasNull() ? null : value; 
} 

或者

public <T> T getObjectValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException { 
    final T value = rs.getObject(columnName, clazz); 
    return rs.wasNull() ? null : value; 
} 

而且

public final class ResultSetWrapper { 

    private final ResultSet rs; 

    public ResultSetWrapper(final ResultSet rs) { 
     this.rs = rs; 
    } 

    public ResultSet getResultSet() { 
     return rs; 
    } 

    public Boolean getBoolean(String label) throws SQLException { 
     // ... 
    } 

    public Byte getByte(String label) throws SQLException { 
     // ... 
    } 

    public Byte getShort(String label) throws SQLException { 
     // ... 
    } 

    // ... 

} 
+0

如果你真的想要一个对象,你可以使用'getObject(idx,Integer.class)'。无需自己做这个。 –