Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums
java de www.developpez.com et de l'expérience personnelle des auteurs. Je tiens à
souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose
sont correctes. Les auteurs font le maximum, mais l'erreur est humaine.
Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que
vous souhaitez nous aider en devenant rédacteur, lisez les modalités de participation.
L'équipe Java
Ont contribué à cette FAQ :
-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Cette faq a été conçue pour être la plus simple possible d'utilisation. Elle tente d'apporter des réponses simples et
complètes aux questions auxquelles sont confrontés tous les débutants (et les autres).
L'organisation :
Les questions sont organisées par thème, les thèmes pouvant eux-même contenir des sous-thèmes. Lorsqu'une question
porte sur plusieurs thèmes, celle-ci est insérée dans chacun des thèmes rendant la recherche plus facile.
Les réponses :
Les réponses contiennent des explications et des codes sources. Certaines sont complétées de fichier à télécharger
contenant un programme de démonstration. Ces programmes sont volontairement très simples afin qu'il soit aisé de
localiser le code intéressant. Les réponses peuvent également être complétées de liens vers d'autres réponses, vers la
documentation en ligne de Sun ou vers un autre site en rapport.
Lors de l'ajout ou de la modification d'une question/réponse, un indicateur est placé à coté du titre de la question.
Cet indicateur reste visible pour une durée de 15 jours afin de vous permettre de voir rapidement les modifications
apportées.
J'espère que cette faq pourra répondre à vos questions. N'hésitez pas à nous faire part de tous commentaires/remarques/
critiques.
Rédacteur :
Web designer :
Toute personne capable de faire une meilleure mise en page, une feuille de style ou de belles images...
Correcteur :
-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Malgré nos efforts, des fautes d'orthographe ou de grammaire peuvent subsister. Merci de contacter les administrateurs
si vous en débusquez une... Idem pour les liens erronés.
Remerciements
Auteurs : L'équipe Java ,
Un grand merci à tous ceux qui ont pris de leur temps pour la réalisation de cette FAQ.
Aux rédacteurs :
Remerciements tout d'abord à tous ceux qui ont rédigé les questions et les réponses.
Aux correcteurs :
Remerciements également aux personnes qui ont relu les textes pour supprimer un maximum de fautes de français.
Notamment merci à Anomaly
A l'équipe Java :
Remerciements tous particuliers aux membres de la rubrique Java pour leurs conseils, corrections, relectures, idées,
etc. Bref, merci pour leur travail d'équipe qui a permis de faire aboutir ce projet.
Remerciements enfin à tous ceux qui ont consulté cette FAQ, et qui, par leurs remarques, nous ont aidé à la
perfectionner.
-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Cette API est constituée d'un ensemble d'interfaces et de classes qui permettent l'accès, à partir de programmes java, à
des données tabulaires (i.e. triées sous forme de table ou de tableur). Par données tabulaires, on entends généralement
des bases de données contenues dans des SGBD relationnels. Mais, JDBC n'est pas restreinte à ce type de source de
données. On peux aussi accéder à des sources de données sous forme de fichiers (fichiers XML par exemple).
SQL (Structured Query Language) : Le "langage de requêtes structuré" est un langage d'interrogation universel
permettant la définition, la manipulation et le contrôle des données, pour les bases de données relationnelles. SQL est
un standard supporté par la plupart des SGBD.
SGBDR (Système de gestion de bases de données relationnelles) : Un SGBDR est un logiciel assurant la structuration,
le stockage, la maintenance, la mise à jour et la consultation d'une base de données relationnelle. Sachant qu'une base
de données relationnelle est une collection de données structurées sous forme de tableaux à deux dimensions (lignes et
colonnes). Exemples : Oracle, Sybase, MySql, DB2, Interbase, etc.
ODBC (Open DataBase Connectivity) : Interface écrite en C qui permet la communication avec les bases de données.
Tout comme JDBC, ODBC permet la manipulation des bases de données "indépendamment" du SGBD.
-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• Le traitement des erreurs retournées par le SGBD lors de l'exécution d'une instruction
L'utilisation du langage de programmation java en collaboration avec l'API JDBC est donc une solution véritablement
portable d'écrire des applications utilisant les bases de données.
Voici une liste non exhaustive des SGBD acessibles avec JDBC :
• DB2
• FoxPro
• Ingres
• Interbase
• MS Access
• MS SQL Server
• MySQL
• Oracle
• Paradox
• PostgreSQL
• Sybase
-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
On peux distinguer sur ce schéma simplifié trois types de technologies. En jaune nous avons la technologie Java, dont
une partie de JDBC (gestionnaire et pilotes). Pour les trois premiers types de drivers, on remarque en vert la présence
d'intermédiaires non java comme les API natives ou les serveurs intermédiaires. Enfin, en bleu, viennent les différents
SGBD.
Remarque : les noms des drivers et SGBD sont donnés ici à titre d'exemple. Il en exite bien d'autres.
Et voici, les étapes généralement rencontrées dans un programme utilisant cette technologie :
-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour de plus amples informations sur les différentes fonctionnalités apparues (dans tous les packages) au fil du temps
regardez la description du package java.sql.
Et JDBC 4.0 alors ? La version 4.0 de JDBC est déjà en cours de conception : JSR 221: JDBC 4.0 API Specification.
Elle prévoit notament l'intégration des nouveautés de la version 1.5 de J2SE, comme la généricité.
• JDBC Technology
• JDBC API Documentation
• FAQ JDBC Sun
• JDBC Basic Tutorial
• JDBC Advanced Tutorial
• JDBC RowSet Tutorial
Sur www.developpez.com :
Sur jGuru :
-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Si vous ne trouvez pas votre bonheur dans ces différentes sources, il reste le forum général java et le forum J2EE de
www.developpez.com
- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Il existe 4 types de drivers JDBC (cf. Quels sont les différents types de driver JDBC ?) qui se différencient par leur
implémentation (notamment par l'utilisation ou non de méthodes natives)
Ce driver est présent dans J2SE (sun.jdbc.odbc.JdbcOdbcDriver). Il permet l'acces au SGBD via le driver ODBC.
Ce type de driver traduit les appels de JDBC à un SGBD particulier, grâce à un mélange d'API java et d'API natives.
Ce type de driver (écrit entièrement en java) passe par un serveur intermédiaire pour l'accès au SGBD.
- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
La portabilité : Ce critère à toujours une place prépondérante dans les considérations sur le développement
d'applications Java. Sur ce point, les drivers de type 3 et 4, dits "purs java", mènent sur leurs homologues de type 1
et 2, qui utilisent des API natives. On peut, par exemple, noter l'impossibilité d'utiliser un driver de type 1 ou 2 dans
une Applet.
Le respect des spécifications : Ce critère est peut-être tout aussi important que le premier lors du choix d'un driver. En
effet, il est toujours préférable d'avoir un driver respectant (et implémentant) les dernières spécifications. Les facilités
de développement s'en voient naturellement accrues. Sur ce point, il est difficile de départager les drivers en fonction
de leur type, car tout dépend de l'implémentation. On peut simplement remarquer que le pont JDBC-ODBC (driver
de type 1 implémenté par Sun), un des plus populaires de son type, ne respecte que partiellement les spécifications de
JDBC 3.0. De plus, la popularité (*) des drivers de type 3 et 4 laisse présager d'un développement plus suivi.
Les performances : Sur ce dernier point l'utilisation d'API natives donne en général l'avantage aux drivers de type
1 ou 2. Ceci est à pondérer par le fait que cela deviens de moins en moins vrai. On peux prendre l'exemple d'Oracle
qui annonce que dans "la plupart des cas" le driver Thin est aussi (voir plus) rapide que son homologue de type 2, le
driver OCI.
En conclusion, nous pouvons dire que les drivers de type 3 ou 4 sont préférables à ceux de type 1 ou 2. Naturellement,
ceci est une analyse rapide et la conclusion n'est pas à prendre au pied de la lettre. Prenez le temps de vous documenter
et adaptez ces remarques en fonction de vos besoins.
* : environ 75 % des drivers disponibles. Observations faites sur les 210 drivers référencés sur le site de Sun en juillet 2004.
- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour trouver des informations sur un driver spécifique la meilleure solution est de s'informer sur le site même du
distributeur.
Utiliser la méthode Class.forName, qui aura pour effet d'enregistrer le Driver auprès du DriverManager. N'oubliez pas
de vérifier que le jar contenant le driver est bien dans le classpath ;-)
En pratique, à cause d'implémentations imparfaites des spécifications, il sera parfois nécessaire d'utiliser cette syntaxe :
Class.forName(nomDriver).newInstance();
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//pour le pont JDBC-ODBC
Class.forName("com.mysql.jdbc.Driver");
//pour MySQL et ConnectorJ
Deuxième méthode :
Troisième méthode :
Enregistrer le driver comme un argument de la commande java, lors de l'exécution. Cela revient en fait à définir la
variable d'environnement jdbc.drivers.
lien : java.sql.Driver
- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
lien : java.sql.DriverManager
lien : Comment obtenir des informations sur un Driver donné, à partir de l'application ?
lien : java.sql.Driver
lien : java.sql.DriverManager
- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
DriverManager.setLogWriter(new PrintWriter(System.out));
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection = DriverManager.getConnection(url,user,password);
Attention : cette méthode obéit à des règles de sécurité cf. doc de DriverManager
- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
lien : java.sql.Driver
lien : java.sql.DriverManager
- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Une seconde possibilité est de spécifier au DriverManager un ensemble de propriétés. Ces propriété sont définies en
fonction du Driver utilisé (cf. Comment obtenir des informations sur un Driver donné, à partir de l'application ? ).
- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Par exemple :
• jdbc:odbc:maBase;CacheSize=30;ExtensionCase=LOWER
• jdbc:mysql://localhost/maBase
• jdbc:oracle:oci8@:maBase
• jdbc:oracle:thin@://localhost:8000:maBase
• jdbc:sybase:Tds:localhost:5020/maBase
- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
if(connection.isClosed()){
//on essaye de réinitialiser la connexion
connection = DriverManager.getConnection(...);
}else{
//traitement normal
}
Attention : cette méthode est sûre de renvoyer true seulement si la méthode close a été appelée. En définitive, elle ne peux
pas servir à determiner si une connexion est valide ou non. Pour cela, il faudra gérer une potentielle SQLException.
- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
En général, une DataSource est utilisée (appelée) via JNDI (Java Naming and Directory Interface). Mais, ce n'est pas
une obligation, c'est simplement ce qui est le plus courament rencontré.
• Basiques : ces implémentations produisent des instances de Connection normales, telles que l'on pourrait les
obtenir avec DriverManager.
• Pool de connexions : ces implémentations produisent des instances de Connection qui appartiennent à un pool.
Pour savoir à quoi celà correspond exactement, regardez : Qu'est ce qu'un pool de connexions ? .
• Transactions distribuées : ces implémentations produisent des instances de Connection, qui peuvent être
utilisées pour des transactions ditribuées. En général, ce type de DataSource utilise aussi les pools de
connexions.
Pour savoir ou trouver des implémentations de dataSource, regardez : Ou trouver des implémentations de DataSource ?
.
• Les drivers ne sont plus obligés de s'enregistrer eux même, comme ils le faisaient avec DriverManager.
• Les implémentations de DataSource permettent de facilement changer les propriétés des sources de données.
Par exemple, il n'est plus nécessaire de modifier du code applicatif lors de changements concernant la base de
données, son emplacement physique ou encore un driver.
• Les instances de Connection fournies par les DataSouce ont des capacités étendues (pool de connexion,
transactions ditribuées, etc.).
Il y a d'autres avantages à utiliser les DataSource. Pour des informations plus détaillées, vous pouvez suivre ce liens :
•
Gestion d'un pool de connexions (avec Tomcat), par Christophe Jollivet
•
Cours JDBC de la rubrique Java
•
Description détaillé de javax.sql
- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
•
Resource Connections (J2EE 1.4 Tutorial)
// ...
Voici les quelques classes concernant les pools de connexions du package javax.sql :
• ConnectionPoolDataSource : cette interface représente une source de données gérant les pools de connexions.
• PooledConnection : cette interface représente une connexions appartenant à un pool.
• ConnectionEventListener : ce listener permet de se mettre à l'écoute des événements relatifs à une
PooledConnection. La méthode connectionClosed(ConnectionEvent event) est appellée lorsqu'une connexion est
retournée au pool. La méthode connectionErrorOccurred(ConnectionEvent event) est appellée lors d'une erreur
lors de la connexion (crash du serveur, par exemple). Le listener est "prioritaire" par rapport à l'application
(i.e. les méthodes sont appellées avant que le driver informe l'application d'une SQLException).
• ConnectionEvent : cette classe représente un événement de ConnectionEventListener. Deux informations sont
accessibles à partir de cet événement : la PooledConnection (source) et la SQLException, si elle existe.
Attention, aucune méthode de javax.sql ne retourne directement une ConnectionPoolDataSource. Pour pouvoir utiliser
les méthodes spécifiques de cette interface vous devrez faire vous même le "casting" adéquat.
Suivez les liens ci-dessous pour des exemples pratiques de création et d'utilisation d'un pool de connexions.
- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• DBCP (Database Connection Pool) : Cette API du projet Jakarta Commons permet d'obtenir des
implémentations de DataSource avec pool de connexions. Elle est intégrée et utilisée par de nombreux projets
(Tomcat par exemple).
• JDBC-ODBC Bridge : Le pont JDBC-ODBC proposé par Sun propose aussi des implémentations de
DataSource. Pour plus d'informations suivez ce lien : http://java.sun.com/j2se/1.5.0/docs/guide/jdbc/bridge.html
• Il existe de nombreux projets Open-Source comme proxool ou encore c3p0.
• De très nombreux distributeurs de drivers fournissent leurs propres implémentations (MySQL, Oracle,
Sybase, etc.). Pour une liste détaillée, regardez JDBC technology-enabled drivers (sélectionnez simplement
Conn.Pooling et/ou DataSource pour les fonctionnalités requises).
Une fois ce lien créé, il ne vous reste plus qu'à récupérer la DataSource comme ceci :
- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
D'autres exemples sont disponibles pour DBCP et Tomcat dans la documentation de celui-ci : JNDI Datasource HOW-
TO.
- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
try{
Connection connection = ...
Statement statement = connection.createStatement();
}
catch(Exception e){
//cf. Comment gérer les erreurs ?
}
Une deuxième méthode permet de spécifier le type des ResultSet crées avec ce Statement. Voir Quels sont les différents
types de ResultSet ?. Par exemple :
• Les méthodes execute : méthodes génériques pour n'importe quelle expression SQL.
• Les méthodes executeQuery : méthodes appropriées à l'exécution d'un SELECT.
• Les méthodes executeUpdate : méthodes appropriées à l'exécution d'une instruction menant à la modification
de la BD (INSERT, UPDATE, DELETE, CREATE, etc.).
• Les méthodes executeBatch : Voir la partie réservée aux transactions
- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
lien : Qu'est-ce qu'un ResultSet ? Que sont les lignes, les colonnes et le curseur ?
Je n'ai pas d'exception, mais la méthode executeXXX ne fais pas ce que je veux ?
Auteurs : Ioan Calapodescu ,
Dans ce cas de figure, vérifiez :
- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• que vous utilisez la bonne méthode execute : par exemple, un execute ou un executeUpdate pour "INSERT
INTO ..."
- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
lien : Qu'est-ce qu'un ResultSet ? Que sont les lignes, les colonnes et le curseur ?
Une SQLException est levée si il y a une erreur durant une exécution ou si max est négatif.
lien : Qu'est-ce qu'un ResultSet ? Que sont les lignes, les colonnes et le curseur ?
- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
On peux aussi limiter les clefs conservées en utilisant executeXXX(String sql, int[] columnIndexes) ou
executeXXX(String sql, String[] columnNames) .Les arguments représentent les indexes/noms des colonnes à observer
(NB : les indexes commencent à 1). Une SQLException est levée si les indexes/noms des colonnes sont éronnés ou si
l'instruction SQL n'est pas de type INSERT, UPDATE ou DELETE.
lien : Qu'est-ce qu'un ResultSet ? Que sont les lignes, les colonnes et le curseur ?
lien : Comment retrouver les valeurs contenues dans un ResultSet ?
lien : Comment parcourir un ResultSet ?
String sql = "SELECT * FROM Annuaire WHERE nom LIKE '%{escape '''}%'";
//sélection dans un annuaire des personnes ayant une apostrophe dans leur nom
ResultSet resultat = statement.executeQuery(sql);
- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
{d 'yyyy-mm-dd'}
//format pour DATE
{t 'hh:mm:ss'}
//format pour TIME
{ts 'yyyy-mm-dd hh:mm:ss.f . . .'}
//format pour TIMESTAMP
- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les instructions - Statement > Les instructions paramétrées - PreparedStatement
Qu'est-ce qu'un PreparedStatement ?
Auteurs : Ioan Calapodescu ,
L'interface PreparedStatement étend Statement et représente une instruction paramétrée. Cette interface diffère de
Statement sur deux points principaux :
• Les instances de PreparedStatement contiennent une instruction SQL dèjà compilée. D'où le terme prepared.
Cela améliore notamment les performances si cette instruction doit être appelée de nombreuses fois.
• Les instructions SQL des instances de PreparedStatement contiennent un ou plusieurs paramètres d'entrée, non
spécifiés lors de la création de l'instruction. Ces paramètres sont représentés par des points d'interrogation(?).
Ces paramètres doivent être spécifiés avant l'exécution.
L'exécution des PreparedStatement est identique à celle des simples Statement, à la différence près qu'il n'y a pas
d'argument aux méthodes executeXXX.
//etc.
Une fois l'instance de PreparedStatement récupérée, il ne reste plus qu'à définir la valeur des paramètres et à l'exécuter.
String sql = "UPDATE Stocks SET prix = ?, quantite = ? WHERE nom = ?";
//préparation de la requête
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//on assigne un décimal au premier paramètre
preparedStatement.setBigDecimal(1,15.6);
//on assigne un entier au second paramètre
preparedStatement.setIntl(2,256);
//on assigne une chaîne de caractères au troisième
preparedStatement.setStringl(3,"café");
//exécution de la requête
- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
preparedStatement.executeUpdate();
Pour vider un paramètre on peut utiliser la méthode setXXX correspondante, cela a pour effet d'écraser la valeur passée
précédemment. Pour vider tous les paramètres, vous pouvez utiliser la méthode clearParameters().
L'objet java, passé comme valeur, sera convertit dans le type SQL indiqué avant d'être envoyé au SGBD. Si ce dernier
implémente SQLData, le driver appellera la méthode writeSQL pour l'écrire dans la base de données.
Une dernière méthode setObject prend en argument un entier définissant le nombre de chiffres après la virgule pour
Types.NUMERIC et Types.DECIMAL. En cas de types incompatibles une SQLException sera levée lors de l'exécution.
String sql = "INSERT INTO MaTable (unString, unInt, uneDate) VALUES (?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1,null, Types.VARCHAR);
statement.setNull(2);
statement.setDate(3,null);
- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les instructions - Statement > Les procédures stockées et fonctions - CallableStatement
Qu'est-ce qu'un CallableStatement ?
Auteurs : Ioan Calapodescu ,
L'interface CallableStatement, qui étends PreparedStatement, permet de faire appel aux procédures stockées et
aux fonctions de manière standard pour tous les SGBD. Pour que cet appel soit indépendant du SGBD ciblé,
CallableStatement utilise la syntaxe d'échappement (Cf. Qu'est-ce que la syntaxe d'échappement ?).
La principale différence avec les PreparedStatement se situe au niveau des paramètres. Ceux-ci sont toujours définis par
des points d'interrogation, mais en plus des paramètres d'entrée (IN), CallableStatement peux avoir des paramètres de
sortie (OUT). Ces paramètres définissent le résultats de la procédure. On peux aussi combiner ces deux types (INOUT).
Les autres arguments de la méthode prepareCall servent à déterminer les types de ResultSet obtenus à partir de la
procédure. Par exemple :
- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
lien : Comment avoir la liste de toutes les procédures stockées dans une base de données ?
Voici un exemple, pour une procédure stockée chargée de retrouver les abonnés d'un annuaire ayant un certain nom.
Cette procédure renvoie plusieurs ResultSet
//CHARGEMENT DU DRIVER
Class.forName("com.mysql.jdbc.Driver");
//CONNECTION AU SGBD
String url = "jdbc:mysql://localhost/test";
String user = "user";
String password = "root";
connection = DriverManager.getConnection(url,user,password);
//CREATION DE LA PROCEDURE
Statement statement = connection.createStatement();
statement.executeUpdate("DROP PROCEDURE IF EXISTS rechercherNom");
statement.executeUpdate(
"CREATE PROCEDURE rechercherNom(IN leNom VARCHAR(50))\n"
+ "BEGIN\n"
+ " SELECT * FROM Annuaire WHERE nom = leNom;\n"
+ " SELECT COUNT(*) FROM Annuaire WHERE nom = leNom;\n"
+ "END\n");
//APPEL DE LA PROCEDURE
String sql = "{call rechercherNom(?)}";
CallableStatement call = connection.prepareCall(sql);
//passage de la chaîne "ioio" comme valeur du premier paramètre
call.setString(1,"ioio");
if(call.execute()){
//récupération des ResultSet
ResultSet resultat1 = call.getResultSet();
call.getMoreResults(Statement.KEEP_CURRENT_RESULT);
ResultSet resultat2 = call.getResultSet();
//traitement des informations
while(resultat1.next()){
for(int i=0;i<resultat1.getMetaData().getColumnCount();i++){
System.out.print(resultat1.getObject(i+1)+", ");
}
System.out.println("");
}
resultat2.next();
System.out.println("Nombre de lignes = "+resultat2.getObject(1));
resultat1.close();
resultat2.close();
}
Comme pour les PreparedStatement, les paramètres IN peuvent être identifiés par leur index dans l'instruction SQL
ou par leur nom. Pour cet exemple, les instructions ci-dessous sont équivalentes :
call.setString("leNom","ioio");
call.setObject(1,"ioio");
call.setObject(1,"ioio", Types.VARCHAR);
- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
call.setObject("leNom","ioio",Types.VARCHAR);
Le corps de la procédure :
Le code java : comme pour les paramètres d'entrée, un paramètre peux être ciblé par son nom ou par son index.
//statement.registerOutParameter(1, java.sql.Types.INTEGER);
statement.execute();
//récupération du résultat en fonction de l'index
int resultat = statement.getInt(1);
//récupération du résultat en fonction du nom du paramètre
- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
statement.registerOutParameter(1,Types.INTEGER);
statement.execute();
int resultat = statement.getInt(1);
if(statement.wasNull()){
System.out.pritnln("Le résultat est de type SQL NULL");
}else{
System.out.println("Le résultat vaut "+resultat);
}
- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
La structure des ResultSet est très semblable à celle d'une Table dans une base de données relationnelles. C'est à dire :
• Les colonnes (column) : Ce sont les éléments verticaux de la table (ou ResultSet). Ils symbolisent les attributs
des différents enregistrements de la table. Ils sont caractérisés par un nom et un domaine dans lequel ils puisent
leurs valeurs (par exemple pour les entiers INTEGER ou VARCHAR pour les chaînes de caractères).
• Les lignes (row) : Ce sont les éléments horizontaux de la table. on les nomme aussi tuples ou n-uplets. Ils sont les
différents enregistrements contenus dans la table (ou ResultSet). Chaque ligne renseigne les attributs définis par
les colonnes.
• Le curseur (cursor) : Cet objet pointe sur une "ligne". Cette ligne peux être soit une ligne comme définie ci-
dessus (contenant les données), soit une ligne spéciale comme afterLast, insertRow, etc... C'est le curseur qui
permet le déplacement dans le ResultSet, pour l'accès aux différents enregistrements.
Voir Quels sont les différents types de ResultSet ?, Comment parcourir un ResultSet ? et Comment retrouver les valeurs
contenues dans un ResultSet ? pour plus d'informations.
Les méthodes , createStatement, prepareStatement et prepareCall, présentent toutes trois la possibilité de spécifier ces
attributs.
- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• ResultSet.TYPE_FORWARD_ONLY : C'est la valeur par défaut (et la seule possible pour JDBC 1.0). Elle
indique que les déplacements du curseur ne peuvent se faire "qu'en avant" (de la première à la dernière ligne).
Une fois la dernière ligne atteinte (la méthode last renvoyant true) le ResultSet est fermé et les données ne sont
plus accessibles.
• ResultSet.TYPE_SCROLL_INSENSITIVE : Cette valeur indique que le curseur peut être déplacé dans
les deux sens, mais aussi arbitrairement (de manière absolue ou relative). Le terme insesitive indique que le
ResultSet est insensible aux modifications des valeurs dans la base de données. Cela définit en fait une vue
statique des données contenues dans le ResultSet.
• ResultSet.TYPE_SCROLL_SENSITIVE : Cette valeur indique que le curseur peut être déplacé dans les deux
sens, mais aussi arbitrairement (de manière absolue ou relative). Le terme sesitive indique que le ResultSet
est sensible aux modifications des valeurs dans la base de données. Cela définit en fait une vue dynamique des
données contenues dans le ResultSet.
• ResultSet.CONCUR_READ_ONLY : C'est la valeur par défaut (et la seule possible pour JDBC 1.0). Elle
indique que les données contenues dans le ResultSet ne peuvent qu'être lues.
• ResultSet.CONCUR_UPDATABLE : Cette valeur indique que l'on peut modifier les données de la base via le
ResultSet.
• ResultSet.HOLD_CURSORS_OVER_COMMIT : Les objets ResultSet ne sont pas fermés. Ils restent ouverts
lorsqu'une validation est effectuée implicitement ou explicitement.
• ResultSet.CLOSE_CURSORS_AT_COMMIT : Les objets ResultSet sont fermés lorsqu'une validation est
effectuée implicitement ou explicitement.
Voici le code java permettant de récupérer toutes les valeurs contenues dans celle-ci :
- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Comme pour les paramètre de retour d'une procédure stockée, on peut récupérer une valeur en fonction de son index,
mais aussi en fonction de son nom. Le code suivant est donc équivalent à celui ci-dessus :
int id = resultat.getInt("id");
String nom = resultat.getString("nom");
double prix = resultat.getDouble("prix");
java.sql.Date date = resultat.getDate("date");
On peut noter que les méthodes getString et getObject sont des méthodes génériques qui peuvent être employées quelque
soit le type SQL de la valeur recherchée.
Pour connaître les correspondances entre les types java et les types SQL, regardez : Tableau de relations.
- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
NB : naturellement cette fonctionnalité n'est disponible que pour les ResultSet vérifiant
ResultSet.TYPE_SCROLL_SENSITIVE.
La méthode wasNull doit être appelée juste après l'appel de la méthode getXXX correspondante.
lien : Comment savoir qu'un paramètre de retour(OUT) est de type SQL NULL ?
lien : Comment retrouver les valeurs contenues dans un ResultSet ?
Voici un exemple :
- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Il existe quatre autres méthodes relatives aux déplacements, voir : Comment déplacer le curseur sur une ligne précise ?
et Comment insérer une ligne dans un ResultSet ? . NB : Ces différentes méthodes peuvent lever une SQLException si
le type de mouvement n'est pas autorisé, ou si le ResultSet est fermé.
Ces méthodes lèvent naturellement une SQLException si le ResultSet est de type SCROLL_FORWARD_ONLY ou si
la valeur passée en paramètre est en dehors des limites.
- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour annuler les mises à jour du ResultSet on peut utiliser la méthode cancelRowUpdates. Cette méthode ne marche
que si elle est appelée avant la méthode updateRow.
Si vous changez la position du curseur avant l'appel de la méthode updateRow, toutes les mise à jour sont perdues.
- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Les méthodes updateXXX (ou XXX indique le type des données) sont aussi utilisées lors de l'insertion de nouvelles
lignes dans le ResultSet.
La méthode moveToCurrentRow permet de se replacer sur la ligne pointée avant l'appel à moveToInsertRow.
- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
System.out.println(sConcurrency);
System.out.println(sHoldability);
}
Cette méthode est susceptible de lever une SQLException si aucune colonne ne correspond au nom passé en paramètre.
- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
NB : pour faire l'opération inverse, c'est à dire retrouver le nom d'une colonne à partir d'un index, il est nécessaire
de passer par ResultSetMetaData.
- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Le principal avantage des RowSet est le fait qu'ils ajoutent à l'API JDBC toute la puissance des JavaBeans. Ce qui
signifie des facilités pour :
• La gestion des propriétés : On peut facilement configurer un RowSet grâce à un ensemble de méthodes setXXX.
Ces méthodes permettent, par exemple, de spécifier le nom de l'utilisateur, l'url de connexion ou encore une
commande (instruction) SQL.
• La géstion des événements : Les RowSetListener peuvent se mettre à l'écoute des événements relatifs aux
RowSet.
Indépendance :
• Par rapport à l'API : Tous les types de RowSet sont capables de se connecter et de lancer une instruction SQL.
Il n'est plus nécessaire de passer explicitement par une Connection ou un Statement.
• Par rapport au matériel utilisé : Tous les types de RowSet peuvent être mis à jour et permettent n'importe quel
mouvement du curseur. Donc, vous pourrez utiliser ces fonctionnalités même si la base de données ou le driver
ne les fournissent pas directement.
• Connectés : En dehors des propriétés générales des RowSet, leur fonctionnement est identique à celui d'un
ResultSet. C'est à dire que ceux ci gardent une connexion ouverte vers le SGBD durant tout leur cycle de vie.
• Déconnectés : Les RowSet de cette catégorie sont capables de rompre la connexion à la source, faire des
modifications sur les données puis de se reconnecter afin de transmettre les modifications, tout en gérant un
éventuel conflit.
- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• RowSet : super-interface de tous les autres types. Définie depuis JDBC 2.0.
• CachedRowSet : RowSet déconnecté stockant ses données en mémoire. Il n'est pas particulièrement adapté à de
grandes quantités de données. Par contre, il est parfaitement adapté pour fournir aux clients légers (comme les
PDA (Personal Digital Assistant) ou les téléphones portables) des données tabulaires, provenant d'une base de
données.
• WebRowSet : RowSet déconnecté. Particulièrement adapté aux applications web, grâce à sa faculté de lire
(écrire) ses données à partir (sous forme) de fichiers XML ou de flux de données.
• FilteredRowSet : RowSet déconnecté. Permettent de filtrer les données présentées à l'utilisateur grâce à la classe
Predicate.
• JoinRowSet : RowSet déconnecté. Permettent de réaliser facilement des JOIN à partir de toute classe ou
interface implémentant Joinable.
• JdbcRowSet : RowSet connecté. C'est une enveloppe légère autour d'un ResultSet permettant de faire du driver
JDBC un bean java.
.
//CHARGEMENT DU DRIVER
Class.forName("com.mysql.jdbc.Driver");
//CREATION DE LA CONNEXION
String url = "jdbc:mysql://localhost/maBase";
String user = "utilisateur";
String password = "motDePasse";
connection = DriverManager.getConnection(url,user,password);
//RECUPERATION D'UN RESULTSET
Statement statement = connection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
String sql = "SELECT * FROM Annuaire";
ResultSet resultat = statement.executeQuery(sql);
//CREATION D'UN ROWSET
CachedRowSet rowset = new CachedRowSetImpl();
//propriétés du RowSet
rowset.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
rowset.setConcurrency(ResultSet.CONCUR_UPDATABLE);
//peuplement du RowSet avec les données du ResultSet
rowset.populate(resultat);
- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
//FERMETURE DE LA CONNECTION
connection.close();
System.out.println(connection.isClosed());
//FINALEMENT TRAITEMENT DES DONNEES HORS CONNECTION
while(rowset.previous()){
.
//CREATION DU ROWSET
JdbcRowSet rowset = new JdbcRowSetImpl();
//MISE EN PLACE DES DIFFERENTES PROPRIETES
String url = "jdbc:mysql://localhost/MaBase";
String user = "utilisateur";
String password = "motDePasse";
String command = "SELECT * FROM Annuaire WHERE nom = ?";
//propriétés nécessaires à la connexion
rowset.setUrl(url);
rowset.setUsername(user);
rowset.setPassword(password);
//propriétés nécessaires à l'exécution
rowset.setCommand(command);
rowset.setString(1,"unNom");
//EXECUTION DU ROWSET POUR LE PEUPLER
rowset.execute();
//puis traitement des différentes données
try{
//CHARGEMENT DU DRIVER
Class.forName("com.mysql.jdbc.Driver");
//CREATION D'UN ROWSET
JdbcRowSet rowset = new JdbcRowSetImpl();
//propriétés du RowSet
rowset.setUrl("jdbc:mysql://localhost/maBase");
- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
rowset.setUserName("utilisateur");
rowset.setPassword("motdePasse");
rowset.setType(ResultSet.TYPE_SCROLL_INSENSITIVE);
rowset.setConcurrency(ResultSet.CONCUR_UPDATABLE);
rowset.setCommand("SELECT nom, prenom FROM Annuaire");
//execution et peuplement du RowSet
rowset.execute();
//TRAITEMENT DES DONNEES
rowset.last();
//parcours des résultats du dernier au premier tuple
while(rowset.previous()){
System.out.println("Nom = "+rowset.getObject("nom")+
" Prenom = "+rowset.getString(2));
}
//modification de la colonne d'index 1 de la première ligne
rowset.first();
rowset.updateString(1,"modification");
rowset.updateRow();
//positionnement sur la seconde ligne et suppression de celle-ci
rowset.relative(1);
rowset.deleteRow();
//insertion d'une nouvelle ligne
rowset.moveToInsertRow();
rowset.updateString("prenom", "un nouveau prénom");
rowset.updateString("nom", "un nouveau nom");
rowset.insertRow();
rowset.moveToCurrentRow();
//etc.
rowset.addRowSetListener(new RowSetListener(){
public void cursorMoved(RowSetEvent rse){
System.out.println("Le curseur à bougé\n"+rse);
}
public void rowChanged(RowSetEvent rse){
System.out.println("Une ligne du RowSet à changé\n"+rse);
}
public void rowSetChanged(RowSetEvent rse){
System.out.println("Le RowSet a complétement changé\n"+rse);
}
});
- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les RowSet > Les RowSet déconnectés (CachedRowSet, etc.)
Comment fonctionnent les RowSet déconnectés ?
Auteurs : Ioan Calapodescu ,
Les RowSet déconnectés ne se connectent à la source des données que lorsqu'ils ont besoin de lire ou écrire dans celle-
ci. Le reste du temps ils sont déconnectés de la source. Pour pouvoir se connecter ils passent par l'intermédiaire d'un
SyncProvider. Cette classe abstraite du package javax.sql.rowset.spi oblige à définir, entre autres, un RowSetReader
et un RowSetWriter. Ce sont ces deux interfaces qui définissent l'écriture et la lecture de la source de données.
//...
- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
rowset.setUrl(url);
rowset.setUserName(user);
rowset.setPassword(pass);
//sans ces trois lignes un appel à acceptChanges lèverais une exception
Si vous ne voulez pas passer ces trois propriétés, les méthodes acceptChanges et execute peuvent être appelées avec une
Connection en paramètre. Vous n'aurez pas à vous soucier de la fermeture de celle-ci, les méthodes le feront à votre
place. Par exemple :
- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
L'implementation de base, RIOptimisticProvider, doit son nom au fait qu'elle suit le modèle d'accès concurrentiel
optimiste. C'est-à-dire qu'aucun verrou n'est posé sur les données et qu'elles peuvent être modifiées à tout moment
par d'autres utilisateurs (ou programmes). En cas de détection de conflit les modifications ne sont tout simplement pas
validées. Par contre, acceptChanges lève une javax.sql.rowset.spi.SyncProviderException (fille de SQLException).
Les SyncProviderException permettent l'accès à un SyncResolver qui permet de gérer les conflits.
Un exemple plus complet est donné dans la description de la classe SyncResolver. Par contre, la RI (intégrée dans le
JDK 5.0) ne semble pas fonctionner correctement. Le problème de synchronisation est bien détecté, mais la méthode
getConflictValue renvoi systématiquement null. Il est donc impossible de comparer la valeur du RowSet et celle de la
source de données. Par la suite, il est donc impossible de faire appel à la méthode setResolvedValue. Si quelqu'un à une
solution, elle est la bienvenue :)
- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Utilisez la méthode setShowDeleted pour permettre au curseur de passer sur les lignes qui ont été supprimées.
• columnUpdated(int index) : Cette méthode indique si la colonne d'index index à été mise à jour.
• columnUpdated(String nom) : Cette méthode indique si la colonne identifiée par nom à été mise à jour.
Ces méthodes peuvent lever une SQLException si l'index ou le nom ne sont pas valides, ou alors si il n'y a pas de ligne
courante.
On peux noter que ces trois méthodes peuvent être appelées à n'importe quel moment précédant un appel à
acceptChanges. Toutes trois lèvent une SQLException si la ligne pointée n'a pas été insérée, supprimée ou modifiée
(selon la méthode). Une exception est aussi levée si le curseur pointe sur une ligne comme beforeFirst, afterLast ou
insertRow.
Une dernière méthode permet l'annulation de toutes les modifications : c'est la méthode restoreOriginal. Cette méthode
annule toutes les insertions, suppressions et mises à jour et place le curseur avant la première ligne.
• getOriginal() : Cette méthode retourne un ResultSet contenant les valeurs originales du RowSet. Ce
ResultSet réponds au standard des RowSet, c'est à dire ResultSet.TYPE_SCROLL_INSENSITIVE et
ResultSet.CONCUR_UPDATABLE . Le curseur est placé avant la première ligne.
• getOriginalRow() : Cette méthode retourne un ResultSet contenant les valeurs originales de la ligne courante.
Ce ResultSet réponds au standard des RowSet, c'est à dire ResultSet.TYPE_SCROLL_INSENSITIVE et
- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
ResultSet.CONCUR_UPDATABLE . Le curseur est placé avant la première ligne. De plus une SQLException
est levée si il n'y a pas de ligne courante (ie. beforeFirst, afterLast ou insertRow).
Naturellement les méthodes proposées dans la réponse à la question Comment connaître le nombre de lignes/colonnes
d'un ResultSet ? restent valables. Mais plus très utiles ;-)
- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
La méthode setPageSize peut lever une SQLException si le paramètre est inférieur à zéro ou supérieur à la valeur
retournée par getMaxRows.
lien : Comment limiter le nombre de lignes des ResultSet renvoyées par l'instruction ?
//par contre les propriétés (url, user, password, commande, ...) sont maintenues
Il ne faut pas confondre cette méthode avec la méthode close. Cette dernière en plus de vider le RowSet le rends
disponible pour le GarbageCollector.
• createCopy() : Crée une copie en profondeur de l'instance. Les modifications faites sur la copie ne sont pas
répercutées sur l'original. Les éventuels RowSetListener à l'écoute de l'original ne prennent pas en compte les
modifications de la copie. La copie aura par contre les mêmes caractéristiques que l'original en ce qui concerne
la possibilité d'être mis à jour, les mouvements possibles du curseur et les différents attributs (url, datasource,
etc .).
• createCopyNoConstraints() : Crée une copie en profondeur des données de l'instance. Les caractéristiques de la
copie sont les mêmes que pour la méthode createCopy.
• createShared() : Crée un "clone" de l'instance copiée. Toutes les modifications faites au clone sont répercutées
sur l'original, mais aussi sur tous les autres clones existants. De même, tout RowSetListener à l'écoute des
événements relatifs à l'original est enregistré auprès du (des) clone(s). Inversement tout nouveau listener mis à
l'écoute d'un clone l'est aussi sur l'original et les autres clones.
• createCopySchema() : Crée une copie vide de l'instance. C'est à dire une copie ne contenant aucune donnée.
Cette copie ne conserve que le schéma (la structure) du RowSet. Les modifications de la copie ne sont pas
répercutées sur l'original. Cette méthode peut facilement être utilisée pour stocker le schéma d'un WebRowSet
sous forme de fichier XML.
Toutes ces méthodes retournent des instances de CachedRowSet sauf createCopySchema qui renvoie simplement un
RowSet.
- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Attention : ces copies peuvent lever des SQLException en fonction de l'implémentation. La javadoc est très évasive sur
le sujet. Par exemple, pour l'implémentation de Sun, une SQLException est levée pour toute copie si l'original à déjà
un RowSetListener (???).
- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Ecriture
Lecture
Naturellement, le fichier source doit être un fichier XML bien formé (Cf.Comment sont formés les fichiers XML des
WebRowSet ?).
- 61 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Class.forName("com.mysql.jdbc.Driver");
//récupération des paramètres de la requête
String url = request.getParameter("url");
String username = request.getParameter("username");
String password = request.getParameter("password");
String command = request.getParameter("command");
//écriture de la réponse
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
//rajout d'une éventuelle feuille de style
out.println("<?xml:stylesheet type=\"text/xsl\" href=\"simple.xsl\"?>");
//écriture du rowset
rowset.writeXml(out);
out.close();
Le contenu du WebRowSet est directement écrit sur le flux de la réponse. Vous pouvez même ajouter en début de page
un lien vers une feuille de style XSL pour mettre en forme les résultats.
Structure générale :
<?xml version="1.0"?>
<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
<properties>
<!-- Contient les propriétés du WebRowSet -->
</properties>
<metadata>
<!-- Contient les méta-données du WebRowSet -->
</metadata>
<data>
<!-- Contient les données du WebRowSet -->
</data>
</webRowSet>
<properties>
<command>SELECT * FROM TestWebRowSet</command>
<concurrency>1008</concurrency>
- 62 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
<datasource><null/></datasource>
<escape-processing>true</escape-processing>
<fetch-direction>1000</fetch-direction>
<fetch-size>0</fetch-size>
<isolation-level>2</isolation-level>
<key-columns></key-columns>
<map></map>
<max-field-size>0</max-field-size>
<max-rows>0</max-rows>
<query-timeout>0</query-timeout>
<read-only>true</read-only>
<rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
<show-deleted>false</show-deleted>
<table-name>TestWebRowSet</table-name>
<url>jdbc:mysql://localhost/JDBC</url>
<sync-provider>
<sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
<sync-provider-vendor>Sun Microsystems Inc.</sync-provider-vendor>
<sync-provider-version>1.0</sync-provider-version>
<sync-provider-grade>2</sync-provider-grade>
<data-source-lock>1</data-source-lock>
</sync-provider>
</properties>
Cette partie contient les propriétés du WebRowSet, mais aussi des informations sur le SyncProvider (celui de Sun
dans l'exemple). On peut remarquer l'absence des propriétés username et password, qui naturellement doivent rester
secrètes.
<metadata>
<column-count>4</column-count>
<column-definition>
<!-- Informations sur la première colonne -->
</column-definition>
<column-definition>
<!-- Informations sur la deuxième colonne -->
</column-definition>
<!-- etc. -->
</metadata>
Les balises column-definition contiennent les informations relatives aux colonnes. Ces informations sont les mêmes que
celles accessibles grâce aux méta-données. Par exemple :
<column-index>2</column-index>
<auto-increment>false</auto-increment>
<case-sensitive>true</case-sensitive>
<currency>false</currency>
<nullable>1</nullable>
<signed>true</signed>
<searchable>true</searchable>
<column-display-size>7</column-display-size>
<column-label>unDecimal</column-label>
<column-name>unDecimal</column-name>
<schema-name></schema-name>
<column-precision>5</column-precision>
<column-scale>2</column-scale>
<table-name>TestWebRowSet</table-name>
<catalog-name></catalog-name>
<column-type>3</column-type>
<column-type-name>DECIMAL</column-type-name>
- 63 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
<currentRow>
<columnValue>1</columnValue>
<columnValue>0.01</columnValue>
<columnValue>chaine 0</columnValue>
<columnValue>1088200800000</columnValue>
</currentRow>
<currentRow>
<!-- données de la deuxième ligne -->
</currentRow>
<!-- etc. pour chaque ligne du WebRowSet -->
La balise data peut contenir trois autres types de balises, dont le contenu est identique à currentRow. Celles-ci définissent
les lignes ajoutées, modifiées ou supprimées.
<insertRow></insertRow>
<modifyRow>
<columnValue>valeurInitiale</columnValue>
<updateValue>valeurModifiee</updatevalue>
</modifyRow>
<deleteRow></deleteRow>
Les trois types de balise peuvent contenir des balises updateValue, qui représentent les valeurs modifiées.
- 64 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 65 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Ce prédicat prends en arguments 4 tableaux. Les deux premiers définissent les minimums et maximums. ce sont les
ensembles de valeurs acceptées par le filtre. Les deux derniers indiquent les colonnes sur lesquelles il faut appliquer le
filtre. Un seul de ces paramètres doit être spécifié. C'est à dire que l'on identifie les colonnes en fonction de leur indexe
ou en fonction de leur nom. Voici une exemple d'utilisation :
- 66 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 67 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
rowset.execute();
System.out.println("#################################################");
while(rowset.next()){
//par défaut toutes les lignes sont visibles
System.out.println(rowset.getObject("nom")+" , "+rowset.getObject("prenom"));
}
gestionnaire.addFiltre("filtre 1", new MonPredicat());
gestionnaire.addFiltre("filtre 2", new MonPredicat2());
rowset.beforeFirst();
System.out.println("#################################################");
while(rowset.next()){
//les deux filtres sont appliqués
System.out.println(rowset.getObject("nom")+" , "+rowset.getObject("prenom"));
}
gestionnaire.removeFiltre("filtre 1");
rowset.beforeFirst();
System.out.println("#################################################");
while(rowset.next()){
//seulement le second filtre est appliqué
System.out.println(rowset.getObject("nom")+" , "+rowset.getObject("prenom"));
}
On peut facilement améliorer cet exemple en définissant toutes les possibilités de la logique des prédicats.
- 68 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Il est même tout à fait envisageable de faire des jointures entre différentes bases de données, tournant sur différents
modèles de SGBDR.
• CROSS_JOIN
• FULL_JOIN
- 69 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour spécifier le type de jointure, il faut utiliser la méthode setJoinType, en prenant soin de vérifier que l'implémentation
accepte le type de JOIN en question. Si le type de JOIN n'est pas supporté, une SQLException sera levée. Voici un
exemple :
- 70 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Par défaut, les Connection sont en mode auto-commit. C'est à dire que chaque instruction SQL est considérée comme
une transaction. Vous pouvez changer ce comportement en utilisant la méthode setAutoCommit(boolean).
Dans le cas ou l'auto-commit est desactivé, vous devrez appeller la méthode commit pour effectivement valider la
transaction. Voici un exemple :
Voici un exemple :
if(jeVeuxValider){
connection.commit();// c'est ici que l'on valide la transaction
connection.setAutoCommit(true);
}else{
connection.rollback();
}
}catch(SQLException sqle){
try{connection.rollback();}catch(Exception e){}
}catch(Exception e){
try{connection.rollback();}catch(Exception e){}
}finally{
try{connection.close();}catch(Exception e){}
- 71 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Voici 4 des 5 niveaux d'isolation possibles, définis par des constantes de la classe Connection :
Le dernier niveau est TRANSACTION_NONE et indique que les transactions ne sont pas supportées.
• Lecture impropre (dirty read) : cette anomalie se produit lorsqu'une transaction lis des données qui sont en
train d'être modifiées par votre transaction (non encore validée).
• Lecture non répétable (non-repeatable read) : cette anomalie survient si une requête ne renvoie pas les mêmes
résultats lors d'exécutions successives. C'est le cas si les données que vous lisez sont modifiées par une autre
transaction (c'est un peu l'inverse de la lecture impropre).
• Lecture fantôme (phantom reads) : cette anomalie se produit si des exécutions successives d'une même requête
renvoient des données en plus ou en moins. Cela peut être le cas si une autre transaction est en train de
supprimer ou d'ajouter des données à la table.
Pour connaître le niveau d'isolation, vous pouvez utiliser la méthode getIsolationLevel de la classe Connection. De la
même manière vous pouvez changer ce niveau avec la méthode setIsolationLevel. Attention, toutes fois, car tous les
SGBDR ne supportent pas tous les types d'isolation.
Voici un exemple :
- 72 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
statement.addBatch("UPDATE ...");
statement.addBatch("...");
int[] resultat = statement.executeBatch();
//voir les différents types de retour possibles
connection.commit();
connection.setAutoCommit(false);
}
• Statement.EXECUTE_FAILED : L'exécution de la commande à échoué, mais aucune exception n'a été levée.
• Statement.SUCCESS_NO_INFO : L'exécution a réussi, mais il n'y a aucune information disponible sur le
nombre de lignes affectées par la mise à jour.
• Un entier supérieur ou égal à zéro : L'exécution a réussi. Cet entier représente le nombre de lignes affectées par
la mise à jour.
- 73 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Voici un exemple :
- 74 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
On peut juste noter que les méthodes getObject et getString sont génériques et peuvent servir pour tous ces types.
Il ne faut pas oublier que ce tableau est simplifié, il existe d'autres types et correspondances. Pour plus d'informations,
suivez les liens ci-dessous.
lien : Comment connaître les types SQL supportés par la base de données ?
lien : Comment obtenir la liste des mots clefs SQL non standard d'un SGBDR ?
- 75 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Vous pouvez aussi utiliser la méthode setTime pour modifier une de ces instances.
Seconde méthode : passage par la syntaxe d'échappement Ces trois classes proposent une méthode statique
valueOf(String s) qui renvoye une instance correspondante. La chaîne de caractères passée en paramètre doit respecter
la syntaxe d'échappement. Par exemple :
Pour connaître les différents formats regardez Qu'est-ce que la syntaxe d'échappement ?.
Dans cet exemple, on crée un nouveau type TELEPHONE. Celui-ci correspond à une chaîne de 10 caractères.
Attention : la syntaxe utilisée est celle de la norme SQL3, elle est peu utilisée en pratique.
La manipulation du type se fait grâce aux méthodes du type qu'il "étend". En imaginant un ResultSet contenant une
colonne Telephones contenant des données de type TELEPHONE :
- 76 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
De la même manière, on utiliserait setString pour le passage d'un argument de type TELEPHONE.
Pour connaître le type SQL des données contenues dans le Array, vous pouvez utiliser les méthodes getBaseType()
et getBaseTypeName(). La première méthode est la plus intéressante, puisqu'elle renvoye le type correspondant dans
java.sql.Types.
Voici une autre méthode pour parcourir les données de l'Array, peut-être plus "élégante" et dans l'esprit JDBC car
elle utilise un ResultSet :
Quelle que soit la méthode que vous utilisez pour récuperer les données de l'Array, vous pouvez spécifier l'index et le
nombre d'éléments à récuperer. Par exemple :
- 77 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
BLOB
Un BLOB ou Binary Large OBject permet de stocker de grandes quantités de données sous forme binaire. On peut par
exemple insérer dans une table des fichiers (images, musique, etc.).
CLOB
Un CLOB ou Character Large OBject permet de stocker de grandes quantités de données sous forme de caractères.
On peut par exemple insérer dans une table des articles de journaux, des livres ou les pages d'un site internet.
JDBC a prévu pour la manipulation de ces deux types SQL les classes Clob et Blob du package java.sql. La plupart des
manipulations de ce objets se font directement en utilisant des flux. Pour plus d'informations, suivez les liens ci dessous.
//insertion de l'image
statement.setString(1, nom);
statement.setBinaryStream(2, stream, (int)file.length());
statement.executeUpdate();
}catch(Exception e){
//traitement des erreurs SQL, IO, etc .
}finally {
//fermeture de la connexion, du flux, etc.
}
}
- 78 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour un exemple plus complet regardez Utilisation de JDBC pour la gestion d'images en base de données par Ricky81 .
lien :
lien : Utilisation de JDBC pour la gestion d'images en base de données par Ricky81
lien : Comment lire un BLOB dans une base de données ?
Dans l'exemple ci-dessous, on lis une image dans une base de données afin de l'écrire sur le disque. L'utilisation de
ImageIO permet de facillement de récupérer le contenu du Blob sous forme de BufferedImage.
}catch(Exception e){
//traitement des erreurs SQL, IO, etc .
}finally {
//fermeture de la connexion, du flux, etc.
}
}
Pour une exemple plus complet regardez Utilisation de JDBC pour la gestion d'images en base de données par Ricky81.
lien :
lien : Utilisation de JDBC pour la gestion d'images en base de données par Ricky81
lien : Comment insérer un BLOB dans une base de données ?
- 79 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
//préparation de la connexion
connection = DriverManager.getConnection("url","login","pass");
String sql = "INSERT INTO ClobTable (nom,article) VALUES (?, ?)";
statement = connection.prepareStatement(sql);
//exécution de l'instruction
statement.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try{fileReader.close();}catch(Exception e){}
try{stringReader.close();}catch(Exception e){}
try{statement.close();}catch(Exception e){}
try{connection.close();}catch(Exception e){}
}
}
//exécution de la requête
- 80 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
resultset = statement.executeQuery();
//exécution de la requête
String sql = "SELECT * FROM ClobTable";
resultset = statement.executeQuery(sql);
- 81 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
}
}
UDT PERSONNE :
//Implémentation de SQLData
public String getSQLTypeName() {
return typeSql;
}
public void readSQL(SQLInput stream, String type)
throws SQLException {
typeSql = type;
nom = stream.readString();
prenom = stream.readString();
age = stream.readInt();
}
Utilisation :
- 82 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
// utilisation
Statement statement = ...;
String sql = "SELECT Personnes FROM Annuaire";
ResultSet resultset = statement.executeQuery(sql);
while(resultset.next()){
Personne personne = (Personne)resultset.getObject(1);
System.out.println("Nom = "+personne.getNom());
System.out.println("Prenom = "+personne.getPrenom());
System.out.println("Age = "+personne.getAge());
}
- 83 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 84 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les méta-données - MetaData > Généralités et informations sur le SGBD
Que sont les méta-données ?
Auteurs : Ioan Calapodescu ,
Les méta-données sont les informations, accessibles via JDBC, sur une base de données ou sur le résultat d'une requête
SQL. Ce sont en fait les informations accessibles en dehors des données elles même. Les méta-données sont gérées par
plusieurs classes :
• DatabaseMetaData : Informations sur la base de données dans son ensemble. Récupérable avec la méthode
getMetaData de Connection.
• ResultSetMetaData : Informations sur les types et propriétés des colonnes d'un ResultSet. Récupérable avec la
méthode getMetaData de ResultSet ou de PreparedStatement.
• ParameterMetaData : Informations sur le paramètres des objets PreparedStatement. Récupérable avec la
méthode getParameterMetaData de PreparedStatement.
Toutes ces interfaces font partie du package java.sql. On peut aussi noter l'existence de RowSetMetaData dans le
package javax.sql.
- 85 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Bien d'autres informations sont accessibles, il ne vous reste qu'à fouiller dans la javadoc ;-).
- 86 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour mieux comprendre les informations retournées, voici une partie des noms, types et significations des colonnes de
ce ResultSet.
On peut donc cibler notre recherche selon ces colonnes. Par exemple, pour ne récuperer que le nom des types, on peut
faire comme ceci :
BIT BOOL TINYINT BIGINT LONG VARBINARY MEDIUMBLOB LONGBLOB BLOB TINYBLOB
VARBINARY BINARY LONG VARCHAR MEDIUMTEXT LONGTEXT TEXT TINYTEXT CHAR NUMERIC
DECIMAL INTEGER INT MEDIUMINT SMALLINT DOUBLE FLOAT DOUBLE DOUBLE PRECISION REAL
VARCHAR ENUM SET DATE TIME DATETIME TIMESTAMP
- 87 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour retrouver les UDT (User Defined Type), on peut utiliser la méthode getUDTs(String catalog, String schemaPattern,
String typeNamePattern, int[] types) (Cf. javadoc pour l'utilisation de cette méthode).
Comment obtenir la liste des mots clefs SQL non standard d'un SGBDR ?
Auteurs : Ioan Calapodescu ,
Cette liste est obtenue grâce à la méthode getSQLKeywords de DatabaseMetaData. Cette méthode renvoie une seule
chaîne de caractères (String) dans laquelle les différents mots clefs sont séparés par une virgule. Par mots clefs SQL
non standard, on entends les mots clefs n'appartenant pas à la norme SQL92.
AUTO_INCREMENT
BINARY
BLOB
ENUM
INFILE
LOAD
MEDIUMINT
OPTION
OUTFILE
REPLACE
SET
TEXT
UNSIGNED
ZEROFILL
- 88 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• getStringFunctions() : retourne une chaîne de caractères contenant les noms des fonctions travaillant sur les
chaînes de caractères.
• getNumericFunctions() : retourne une chaîne de caractères contenant les noms des fonctions travaillant sur les
nombres.
• getSystemFunctions() : retourne une chaîne de caractères contenant les noms des fonctions système.
• getTimeDateFunctions() : retourne une chaîne de caractères contenant les noms des fonctions travaillant sur le
temps (TIME, TIMESTAMP ou DATE).
Par exemple :
Comment avoir la liste de toutes les procédures stockées dans une base de données ?
Auteurs : Ioan Calapodescu ,
L'accès à cette information se fait grâce à DatabaseMetaData et grâce à la méthode getProcedures. Par exemple :
- 89 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Dans cet exemple, on passe % comme paramètre de recherche sur le nom, ce qui a pour effet de rechercher toutes les
procédures.
- 90 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
On peut naturellement utiliser cette méthode comme getTables pour vérifier l'existence d'une procédure stockée, ou
d'un paramètre bien précis.
Il existe une vingtaine de méthodes getMaxXXX dans l'interface DatabaseMetaData. Vous n'avez plus qu'à foullier
dans la javadoc ;-)
- 91 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les méta-données - MetaData > Informations sur les tables
Comment récupérer les noms des tables d'une base de données ?
Auteurs : Ioan Calapodescu ,
L'interface DatabaseMetaData permet d'acceder à de nombreuses informations sur les tables d'une base de données,
notamment grâce à la méthode getTables.
Ce premier exemple permet d'obtenir toutes les tables et informations disponibles. On peut remarquer la présence du
symbole % pour l'attribut définissant le nom de la table. Celui-ci permet d'indiquer que l'on recherche n'importe quel
nom.
On peux naturellement cibler sa recherche en spécifiant une colonne précise du ResultSet. Voici la liste des principales
colonnes du ResultSet renvoyé par getTables.
Remarque : il en existe d'autres, mais elles ne sont pas toujours présentes. Cela dépend de l'implémentation et du SGBD.
On peut par exemple facilement créer une méthode nous indiquant la présence d'un table dans une base.
- 92 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 93 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Vous trouverez plus d'informations, sur les paramètres de cette méthode et sur la structure du ResultSet retourné, dans
la Javadoc.
De la même manière, on peut utiliser la méthode getColumnPrivileges pour avoir des informations sur les droits sur
une colonne ou un ensemble de colonnes. Les colonnes du ResultSet sont identiques.
Attention, ces deux méthodes sont susceptibles de lever une SQLEception, si l'utilisateur n'a pas certains droits. Par
exemple pour MySQL, il faut avoir les droits de lecture sur la base de données mysql. Tout dépends de l'implémentation.
- 94 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Explication :
Les deux premiers paramètres correspondent au catalogue et au schéma. Ensuite, on indique le nom de la table (ici
"MaTable"). Pour ce paramètre, on peut, comme toujours avec les méta-données, utiliser les caractères % et _, pour
sélectionner plusieurs tables. Vous trouverez plus d'informations sur ces paramètres et sur la structure du ResultSet
récupéré dans la Javadoc.
- 95 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Les méta-données - MetaData > Informations sur les ResultSet
Comment connaître le nombre de lignes/colonnes d'un ResultSet ?
Auteurs : Ioan Calapodescu ,
Pour connaître le nombre de colonnes d'un ResultSet, il suffit d'utiliser ResultSetMetaData. Par exemple :
Par contre, il n'existe pas de méthode toute faite pour récupérer le nombre de lignes d'un ResultSet. Cette fonctionnalité
à été retirée des premières spécifications, car les implementations étaient trop gourmandes en ressources. Il existe
plusieurs possibilités pour connaître cette valeur.
Si le ResultSet est de type TYPE_FORWARD_ONLY, la seule possibilité est d'utiliser une autre requête faisant un
COUNT.
Une dernière possibilité est d'utiliser les RowSet qui proposent une méthode toute faite pour récupérer cette
information.
• getColumnName(int column) : String : Cette méthode renvoye le nom de la colonne dont l'index est column.
• getColumnLabel(int column) : String : Cette méthode renvoye le nom, suggéré pour l'affichage, de la colonne
dont l'index est column
Attention : en pratique les implementations renvoient souvent les mêmes chaînes de caractères pour les deux méthodes.
Voici une méthode pour récupérer les noms des colonnes d'un ResultSet sous forme de tableau de String :
- 96 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour récupérer les noms de toutes les colonnes d'une table, on pourrais utiliser cette méthode comme ceci :
Comment récupérer les types SQL et Java des colonnes d'un ResultSet ?
Auteurs : Ioan Calapodescu ,
Trois méthodes de ResultSetMetaData peuvent nous renseigner sur le type SQL et sur la classe java correspondante
d'une colonne donnée.
• getColumnClassName(int index) : renvoie une chaîne de caractères correspondant au nom complet de la classe
java de la colonne ciblée par index.
• getColumnType(int index) : renvoie un entier correspondant au type SQL de la colonne ciblée par index. Cet
entier est un de ceux définis dans java.sql.Types.
• getColumnTypeName(int index) : renvoie une chaîne de caractères correspondant au type SQL de la colonne
ciblée par index. Cette chaîne est le nom de la variable renvoyée par getColumnType dans java.sql.Types.
Par exemple :
- 97 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Quelles informations peut-on avoir sur les colonnes de type numérique d'un ResultSet ?
Auteurs : Ioan Calapodescu ,
ResultSetMetaData possède plusieurs méthodes spécifiques aux colonnes contenant des données numériques. Par
exemple :
La méthode getTableName renvoie une chaîne vide si la colonne n'est pas remplie à partir d'une table. C'est la seconde
vérification que nous faisons dans le if.
- 98 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 99 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• getErrorCode() : retourne un entier représentant le code de l'erreur. Ce code est spécifique a chaque
distributeur (Driver).
• getSQLState() : retourne une chaîne de caractères représentant le "SQLState" de l'erreur. Cet état est défini
par une des deux conventions : XOPEN ou SQL99.
• getNextException() : retourne une possible SQLException liée à l'instance.
Voici un exemple :
try{
//code susceptible de lever une SQLException
}catch(SQLException sqle){
System.out.println("Exception SQL : ");
while (sqle != null) {
String message = sqle.getMessage();
String sqlState = sqle.getSQLState();
int errorCode = sqle.getErrorCode();
System.out.println("Message = "+message);
System.out.println("SQLState = "+sqlState);
System.out.println("ErrorCode = "+errorCode);
sqle.printStackTrace();
sqle = sqle.getNextException();
}
}
finally{
//etc.
}
On peut aussi spécifier la prochaine SQLException grâce à la méthode setNextException. Par exemple :
- 100 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
• Connection : La méthode getWarnings retourne le premier warning relatif à cette Connection. Si la connexion
est fermée une SQLException est levée.
• Statement : La méthode getWarnings retourne le premier warning relatif à ce Statement. Si un ResultSet est
en train d'être lu, les warnings relatifs à celui-ci sont ajoutés à la liste. Les warnings sont remis à zéro à chaque
exécution du Statement. Si le Statement est fermé une SQLException est levée.
• ResultSet : La méthode getWarnings retourne le premier warning relatif à ce ResultSet. La liste des warnings
est remise à zéro à chaque lecture de ligne. Si le ResultSet est fermé une SQLException est levée.
Voici un exemple :
try{
Class.forName("nom.du.Driver").newInstance();
String url = "jdbc:...";
String user = "user";
String password = "mdp";
Connection connection = DriverManager.getConnection(url,user,password);
//étude des warnings relatifs à la connexion
SQLWarning warning = connection.getWarnings();
printWarning(warning);
//exécution d'un statement
Statement statement = connection.createStatement();
ResultSet resultat = statement.executeQuery("une requête");
//étude des warnings relatifs à l'exécution de l'instruction
warning = statement.getWarnings();
printWarning(warning);
while(resultat.next()){
//étude des warnings relatifs au ResultSet
warning = resultat.getWarnings();
printWarning(warning);
//traitement des infos
}
} catch(SQLException sqle){
//traitement des exceptions
}
Et voici le corps de la méthode printWarning qui permet juste d'afficher sur la sortie standard les informations sur le
SQLWarning passé en paramètre.
- 101 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Remarque : on peut explicitement nettoyer les warnings (pour les trois classes) grâce à la méthode clearWarnings.
On peux facilement identifier une DataTruncation par son SQLState qui est 01004. Par contre, sachant qu'aucune
méthode ne renvoie une instance de DataTruncation, il sera nécessaire de faire un cast. Par exemple :
} catch(SQLException sqle){
System.out.println("Exception SQL : ");
while (sqle != null) {
String message = sqle.getMessage();
String sqlState = sqle.getSQLState();
int errorCode = sqle.getErrorCode();
System.out.println("Message = "+message);
System.out.println("SQLState = "+sqlState);
System.out.println("ErrorCode = "+errorCode);
if(sqle instanceof DataTruncation){
//on fait ici la vérification sur la classe et non sur le SQLState
//car la spécification n'est pas toujours suivie à la lettre
DataTruncation dt = (DataTruncation)sqle;
System.out.println("Taille qui aurait du être transférée (bytes) : "+dt.getDataSize());
System.out.println("Taille effectivement transférée (bytes) : "+dt.getTransferSize());
//etc.
}
sqle = sqle.getNextException();
}
}
- 102 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Pour le reste, il faut se renseigner auprès du distributeur pour connaître la signification exacte d'un ErrorCode. Pour
SQLState, il faut faire les vérifications en fonction de la norme utilisée.
- 103 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 104 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Mapping O/R, frameworks de persistance et autres API > Généralités
Existe-t-il des API de plus "haut niveau" que JDBC ?
Auteurs : Ioan Calapodescu ,
JDBC reste une API de "bas niveau". Elle est parfois difficile à prendre en main. Il existe de nombreuses API construites
sur JDBC, qui sont plus faciles d'utilisation. En voici quelques unes :
• DbUtils : API du projet Jakarta Commons créée pour faciliter le travail avec JDBC.
• Commons SQL : API du projet Jakarta Commons permettant de travailler avec des bases de données et de
créer des DDL.
• Les frameworks de persistance ou de mapping O/R : pour plus d'informations regardez : Que sont le mapping
Objet/Relationnel et les frameworks de persistance ?.
• Hibernate : http://www.hibernate.org/
• JPOX : http://www.jpox.org/index.jsp
• iBatis : http://ibatis.com/common/sqlmaps.html
• OJB : http://db.apache.org/ojb/
- 105 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Mapping O/R, frameworks de persistance et autres API > JDO
Qu'est ce que JDO ?
Auteurs : Ioan Calapodescu ,
JDO (Java Data Objects) est une spécification définissant une API pour la persistance. Vous pouvez trouver une
définition plus détaillée dans le tutoriel sur l'utilisation de JDO sur une base de donnée relationnelle de Benoit
Moussaud : JDO : Définition.
- 106 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Sommaire > Mapping O/R, frameworks de persistance et autres API > DbUtils
Le QueryRunner peut-il utiliser un objet DataSource ?
Auteurs : Christophe Jollivet ,
Le QueryRunner peut utiliser un objet DataSource pour interroger la base de données. Le DataSource peut être donné
en paramètre au constructeur du QueryRunner ou préciser par la méthode
setDataSource(DataSource ds)
• la connexion sous la forme d'un objet Connection. Ce paramètre est optionnel si l'on a paramètré un
DataSource
• la requête SQL sous la forme d'un String avec des points d'interrogation à la place des paramètres
• un tableau d'objet correspondant aux paramètres (String, Integer,#) dans l'ordre de substitution.
• le ResultSetHandler qui parsera le ResultSet et renverra la réponse.
String1 = String2
avec String1 une référence qu'on peut appeler et String2 la requête que l'on veut charger.
- 107 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Des implémentation d'origine existent permettant de retourner un objet List, un ArrayList, un Bean, un Map, ou un
List des deux précédents types.
donc votre implémentation de cette interface peut renvoyer n'importe quel type d'objet. C'est à vous de caster l'objet
renvoyé dans le type adapté. Seuls les types primitifs ne peuvent être retournés, il faut utiliser les classes permettant
de les encapsuler (Integer, Boolean, Float,#)
- 108 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
- 109 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Attention, il ne faut pas confondre getParameterMetaData et getMetaData. La seconde méthode permet de récupérer
les méta-données des ResultSet produits par le PreparedStatement. Ces méta-données sont récupérées sous forme de
ResultSetMetaData.
Heureusement, il existe une API pouvant aider à surveiller les requêtes envoyées au SGBD : P6SPY.
Cette API définit en fait un "driver" qui va englober le driver réel. Pour plus d'informations, regardez la documentation
de P6SPY : http://www.p6spy.com/documentation/
Il existe tout de même une possibilité : il faut utiliser une Connection factice qui servira de pont entre vous et le SGBD.
A partir de cette Connection vous pourrez exécuter une instruction spécifique au SGBD pour créer une autre base de
données.
Voici une méthode qui permet de créer un base de données MySql et d'obtenir une Connection à celle-ci :
Class.forName("com.mysql.jdbc.Driver");
- 110 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/
La FAQ JDBC
Comment se connecter à une base de donnée Access sans créer un lien ODBC ?
Auteurs : duj ,
Il suffit d'utiliser l'URL suivante :
Bien entendu, à la place de "labase", mettez le chemin complet de votre base (par exemple c:/temp/labase.mdb).
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url= "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/temp/thebase.mdb";
String user = "user";
String pass = "pass";
Connection connection = DriverManager.getConnection(url,user,pass);
- 111 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2004 - 2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://java.developpez.com/faq/jdbc/