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以保持向后兼容性。
答
向后兼容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)'。无需自己做这个。 –
这是很可悲。我们现在使用4.1规范,但仍保持与1.0版本的向后兼容性。我不关心兼容性。我厌倦了编写ResultSet包装器和sql util方法。 – Binakot