Wednesday, 20 June 2007

Quoi de neuf dans JDBC 4.0?

Le lancement récent de Java 6 a été moins dramatique que le lancement de Java 5. Alors que la version 5 de Java a introduit les génériques, les annotations, l'auto-boxing, et les enum, Java 6, lui, ne se vante que des améliorations des performances, quelques retouches des annotations standards, et surtout, JDBC 4.0.

Dans tout le monde Java, les librairies JDBC sont probablement (avec java.io.* peut-être), celles que nous avons utilisées le plus fidèlement depuis le plus longtemps, sans qu'elles aient changées tant que ça. Ce qui ne veut pas dire qu'elles étaient parfaites—quasiment chaque programmeur a son propre petit bibliothèque, écrit soi-même ou trouvé il y a des années dans un ancien boulot, ou sur la toile... Alors, maintenant que JDBC 4.0 est sorti, qu'est-ce qui a changé, et qu'est-ce que ça nous apporte par rapport à la version précédente?

1. Fini le Class.forName(...).newInstance() pour charger la classe de notre pilote. DriverManager.getConnection() est désormais suffisamment rusé pour trouver lui-même la classe pilote en parcourant notre classpath.

2. @Select et @Update, deux annotations avec beaucoup de potentiel. Ces annotations peuvent être combinées avec BaseQuery pour lancer les requêtes avec un minimum de code. En voici un petit exemple:

interface MesRequetes extends BaseQuery {

    @Select(sql="SELECT NOM, PRENOM FROM UTILISATEUR")
    public DataSet<Utilisateur> getUtilisateurs();

    @Update(sql="UPDATE UTILISATEUR SET NOM=?, PRENOM=? WHERE ID = ?")
    public boolean updateUtilisateur(String nom, String prenom, int id);
}
Pour en profiter de MesRequetes, on crée un instance comme suit: MesRequetes mesRequetes = connection.createQueryObject(MesRequetes.class). C'est donc très différent du JDBC traditionnel, mais je pense qu'une fois qu'on s'habitue à l'objet Query, ça va être sympa. (DataSet, vu dans le code exemple, est aussi une nouveauté JDBC 4.0. Il est essentiellement comme un ResultSet, mais il peut fonctionner aussi en mode déconnecté, et il implémente java.util.List, ce qui le rend plus sympa à parcourir.)

3. Et le reste: resultSet.getRowId() et preparedStatement.setRowId() nous permettent de travailler avec des ROWID des BDD telles DB2 et Oracle, ce qui est indispensable quand on a une table qui ne possède pas d'identifiant unique. Clob et Blob ont été améliorés, le plus intéressant c'est la méthode free(), qui permet de libérer les ressources de ces objets lourds. SQLException a maintenant beaucoup de classes filles plus descriptives, un peu comme IOException faisait depuis longtemps. Bref, il y a beaucoup de petites améliorations çà et là, notamment pour ceux qui utilisent les caractères chinois et japonais.

Alors quel bilan: qu'est-ce que ça change vraiment pour ceux d'entre nous qui codent encore du JDBC à la main? A mon avis ceux qui adoptent la nouvelle façon de travailler proposée par les QueryObject vont l'apprécier. Pour le reste, les changements ne sont pas énormes et concernent plutôt les détails. On ne va pas se plaindre pour ces améliorations, mais ils n'auront pas beaucoup d'impact non plus. Néanmoins ça vaut le peine d'essayer les nouvelles annotations @Select et @Update, à mon avis vous les trouverez meilleures que les boîtes à outils JDBC que vous utilisiez jusqu'à maintenant.

Posted by jon at 6:48 AM in Java 
 
« June »
SunMonTueWedThuFriSat
     12
3456789
10111213141516
17181920212223
24252627282930
       
 
Non enim id agimus ut exerceatur vox, sed ut exerceat.