IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ JDBCConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 162, dernière mise à jour : 3 juin 2015  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur 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 ceci.

SommaireLa connexion (6)
précédent sommaire suivant
 

Une connexion à une base de données avec JDBC est représentée par une instance de la classe java.sql.Connection. Pour ouvrir une connexion vers une base de données, il suffit de spécifier l'URL de connexion, le login et le password, à la méthode getConnection de DriverManager. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
String URL = "URL"; 
String login = "log"; 
String password = "pass"; 
try{ 
  Connection connection = DriverManager.getConnection(URL,login,password); 
  //interaction avec la base 
} 
catch(SQLException sqle){ 
   //cf. Comment gérer les erreurs ?  
} 
finally{ 
   //cf. Comment bien fermer une connexion ? 
        }
Une seconde possibilité est de spécifier au DriverManager un ensemble de propriétés. Ces propriétés sont définies en fonction du Driver utilisé (cf. Comment obtenir des informations sur un Driver donné, à partir de l'application ? ).

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String login = "log"; 
String password = "pass"; 
try{ 
  Properties props = new Properties(); 
  props.setProperty("user","userName"); 
  props.setProperty("password","motDePasse"); 
  props.setProperty("autoReconnect", "true"); 
  Connection connection = DriverManager.getConnection(URL,props); 
  //interaction avec la base 
} 
catch(SQLException sqle){ 
   //cf. Comment gérer les erreurs ?  
} 
finally{ 
   //cf. Comment bien fermer une connexion ? 
        }
Le mot de passe et le nom d'utilisateur font partie des propriétés standards.

Mis à jour le 11 avril 2013 Ioan

Les URL JDBC sont définies sous forme de String selon ce schéma :

Code java : Sélectionner tout
String url = "jdbc:<subprotocol>:<subname>"
  • <jdbc> : le protocole dans une URL JDBC est toujours jdbc.
  • <subprotocol> : cela correspond au nom du driver ou au mécanisme de connexion à la base de données.
  • <subname> : une manière d'identifier la source de données. Ce dernier élément dépend complètement du sous-protocole et du driver.

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

Il est nécessaire de se documenter auprès du fournisseur du driver.

Mis à jour le 11 avril 2013 Ioan

La connexion est fermée automatiquement par le garbage collector, mais il est toujours préférable de fermer soi-même une connexion. De manière générale, il est nécessaire de bien gérer les exceptions. Votre code devrait toujours ressembler à ceci :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
String driver = "nom.du.driver"; 
String url = "url"; 
String login = "login" 
String password = "password"; 
Connection connection = null; 
try{ 
   Class.forName(driver); 
   connection = DriverManager.getConnection(url,login,password); 
   //travail avec les données 
} 
catch(ClassNotFoundException cnfe){ 
   System.out.println("Driver introuvable : "); 
   cnfe.printStackTrace(); 
} 
catch(SQLException sqle){ 
   System.out.println("Erreur SQL : "); 
   //Cf. Comment gérer les erreurs ? 
} 
catch(Exception e){ 
   System.out.println("Autre erreur : "); 
   e.printStackTrace(); 
} 
finally 
{ 
   if(connection!=null){try{connection.close();}catch(Exception e){e.printStackTrace();}} 
   //etc. 
}

Mis à jour le 11 avril 2013 Ioan

Pour savoir si la connexion est fermée, il faut utiliser la méthode isClosed() de Connection. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
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 peut pas servir à déterminer si une connexion est valide ou non. Pour cela, il faudra gérer une potentielle SQLException.

Mis à jour le 11 avril 2013 Ioan

La méthode isClosed de Connection n'est pas suffisante pour tester la validité d'une connexion. En effet celle-ci retourne true si, et seulement si, la méthode close a été appelée. La seule possibilité reste de faire une sorte de « ping » vers le serveur. Ce « ping » consiste en l'exécution d'une requête simple. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static boolean isValid(Connection connection){ 
   if(connection==null){ 
      return false; 
   } 
   ResultSet ping = null; 
   try{ 
      if(connection.isClosed()){return false;} 
      ping = connection.createStatement().executeQuery("SELECT 1"); 
      return ping.next(); 
   }catch(SQLException sqle){ 
      return false; 
   } 
   finally{ 
      if(ping!=null){try{ping.close();}catch(Exception e){}} 
   }   
}

Mis à jour le 11 avril 2013 Ioan

Il n'est pas forcément simple de savoir si tous les objets liés à sa requête sont fermés dans le bon ordre et au bon moment.

Avec Java 7, la structure try-with-resources permet de répondre à cette problématique. La liste des objets déclarés dans le bloc try seront alors fermés automatiquement (s'ils implémentent Closable ou AutoClosable).

Voici un exemple :

Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
public void myRequest(Connection cnx, String query) throws SQLException { 
  try (Statement stmt = cnx.createStatement(); 
        ResultSet rs = stmt.executeQuery(query);) { 
    while (rs.next()) { 
      // faire de qu'on doit faire avec les résultats 
    } 
  } 
}

Voici un second exemple permettant de gérer les exceptions SQL directement dans la méthode :
Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
public void myRequest(Connection cnx, String query) { 
  try (Statement stmt = cnx.createStatement(); 
        ResultSet rs = stmt.executeQuery(query);) { 
    while (rs.next()) { 
      // faire de qu'on doit faire avec les résultats 
    } 
  } catch (SQLException e){ 
    // gérer les erreurs 
    Throwable[] t = e.getSuppressed(); // erreurs qui arrivent pendant la fermeture des ressources (stmt.close ou rs.close) si une autre erreur a eu lieu avant. 
  } 
}

Il est possible de mettre autant d'éléments que l'on souhaite dans le try tant que les objets créés implémentent Closable ou AutoClosable. Les éléments sont fermés à la fin de l'exécution du bloc try dans l'ordre inverse de leur déclaration.

Mis à jour le 3 juin 2015 eulbobo Robin56

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.