2017-09-01 134 views
1

美好的一天。任何人都可以解釋爲什麼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

回答

2

答案是在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

0

向後兼容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)'。無需自己做這個。 –

相關問題