2017-09-01 3 views
1

Bonne journée. Quelqu'un peut-il expliquer pourquoi JDBC n'implémente pas le mappage d'objet pour certains types. Par exemple, Postgres JDBC n'a pas de mappage Byte et Short. Je peux obtenir des octets primitifs et courts, mais en format objet, je ne peux obtenir que Integer.Le mappage des types d'objets JDBC ResultSet n'a pas d'octet ou de short? Pourquoi Integer seulement?

C'est le code source here

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

Quel est le problème wtih types d'octets et objet court? Comment puis-je travailler avec TINYINT, SMALLINT et ainsi de suite.

Quel est le problème à mettre en œuvre getByte et getShort semblable à getInt

Répondre

2

La réponse est dans la JDBC™ 4.1 Specification JSR 221 à la page 187

Remarque - La spécification JDBC 1.0 défini la mise en correspondance d'objets Java pour la Les types JDBC SMALLINT et TINYINT sont Integer. Le langage Java n'incluait pas les types de données Byte et Short lorsque la spécification JDBC 1.0 était finalisée. Le mappage de SMALLINT et TINYINT à Entier est conservé pour préserver la rétrocompatibilité.

+0

Il est vraiment triste. Nous utilisons maintenant la spécification 4.1, mais conservons la rétrocompatibilité avec la version 1.0. Je me fiche de la compatibilité. Je me suis fatigué pour écrire les wrappers ResultSet et les méthodes sql util. – Binakot

0

La rétrocompatibilité avec la spécification JDBC 1.0 ne permet pas d'ajouter des types d'objet Byte et Short dans les pilotes JDBC. Il n'y a qu'une seule solution: la béquille java.

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

Ou

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; 
} 

Et

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

Vous pouvez simplement utiliser 'getObject (idx, Integer.class)' si vous voulez vraiment un objet. Pas besoin de le faire vous-même. –