Académique Documents
Professionnel Documents
Culture Documents
• Puis la connexion:
String url = "jdbc:oracle:thin:@127.0.0.1:1521/XEPDB1";
String user = "patrick";
String password = "Soleil01";
try
{
Connection con = DriverManager.getConnection(url, user, password);
}
catch(SQLException e)
{
System.err.println("Erreur lors de la connexion : "+e);
}
Insert avec JDBC
• Insertion « classique »:
Statement stmt = conn.createStatement();
stmt.executeUpdate ( "INSERT INTO CLIENT (prenom, nom, courriel, telephone ) VALUES (….)");
ResultSet rs = stmt.executeQuery(SQL);
while(rs.next()){
System.out.print("Id: " + rs.getString("id"));
System.out.print(", Prénom: " + rs.getString("prenom"));
System.out.print(", Nom: " + rs.getString("nom"));
System.out.println(", Courriel: " + rs.getString("courriel"));
System.out.println(", Téléphone: " + rs.getString("telephone"));
}
Update avec JDBC
PreparedStatement ps = conn.prepareStatement("UPDATE CLIENT SET nom=?,
prenom=?, courriel=?, telephone=? WHERE id=?");
ps.setString(1, nom_update_txt.getText());
ps.setString(2, prenom_update_txt.getText());
ps.setString(3, courriel_update_txt.getText());
ps.setString(4, telephone_update_txt.getText());
ps.setString(5, id_update_txt.getText());
ResultSet rs = ps.executeQuery();
Delete avec JDBC
PreparedStatement ps = conn.prepareStatement("DELETE FROM CLIENT WHERE id
= ?");
ps.setString(1, id_update_txt.getText());
ResultSet rs = ps.executeQuery();
Bonnes pratiques avec JDBC
Utilisez les « Prepared Statement »
• L'instruction préparée est utilisée pour exécuter une instruction SQL précompilée. Les
PreparedStatement convient à l'exécution de commandes SELECT, INSERT, UPDATE
et DELETE.
• L'instruction préparée est plus rapide que l'instruction standard, car elle est utilisée pour
exécuter des instructions SQL précompilées. Par conséquent, la même requête SQL peut
être exécutée à plusieurs reprises dans l'instruction préparée.
Désactiver « Auto Commit Mode »
• Il est recommandé d'exécuter une requête SQL avec la désactivation du mode commit
automatique.
• Avec le mode commit automatique désactivé, nous pouvons regrouper les instructions
SQL dans une transaction, tandis que dans le cas du mode de commit automatique
activé, chaque instruction SQL s'exécute sur sa propre transaction et est validée dès
qu'elle se termine. Faire le regroupement améliore les performances.
Utilisez les « batch statements »
• L'API JDBC fournit la méthode addBatch() pour ajouter des requêtes SQL dans un lot
et executeBatch() pour envoyer des requêtes par lots pour exécution.
• La raison derrière cette bonne pratique est que la mise à jour par lots JDBC réduit
potentiellement le nombre d'allers-retours de la base de données, ce qui entraîne un gain
de performances significatif. Utilisez donc toujours la mise à jour par lots JDBC pour
les requêtes d'insertion et de mise à jour.
Accès à l'ensemble de résultats par noms
de colonnes
• L'API JDBC permet d'accéder aux données du ResultSet à l'aide du nom de la colonne
ou de l'index de la colonne.
• Il est suggèré d'utiliser le nom de colonne afin d'éviter l’erreur
InvalidColumnIndexException qui survient si un index de la colonne est incorrect (le
plus courant d'entre eux est 0) car l'index de colonne ResultSet commence à partir de 1
et 0 n'est pas valide.
• Certains peuvent faire valoir que l'accès à une colonne de base de données à l'aide d'un
index est plus rapide qu'un nom, ce qui est vrai. Mais si nous regardons en termes de
maintenance, de robustesse et de lisibilité, accéder à la colonne de la base de données
en utilisant le nom dans l'itérateur ResultSet est préférable.
• resultSetObj.getString(2)
vs
resultSetObj.getString("nom")
Utiliser des variables liées au lieu de la
concaténation
• Comme vu précédemment, il est préférable d'utiliser des PreparedStatement pour
obtenir de meilleures performances. Cependant les performances ne peuvent être
améliorées que si le on utilise des variables liées (?) ou des espaces réservés qui
permettent à la base de données d'exécuter la même requête avec un paramètre
différent.
• En plus d'obtenir de meilleures performances, cette façon de faire offre une protection
contre l'injection SQL.
• Variable liée:
prepStmt = con.prepareStatement("select * from EMPLOYEE where ID=? ");
prepStmt.setInt(1, 8);
• Concaténation:
String query = "select * from EMPLOYEE where id = ";
int i = 2 ;
stmt.executeQuery(query + String.valueOf(i));
Fermer les connexions
• C'est une pratique de codage
courante de fermer n'importe
quelle ressource dans le bloc
finally dès que nous avons fini
d'utiliser la ressource.
• La connexion et les classes JDBC
sont une ressource coûteuse et
doivent être fermées dans le bloc
finally pour garantir la libération
de la connexion même en cas
d'exception SQL.
Mise en cache des instructions
• La mise en cache des instructions améliore les performances en mettant en cache les
instructions exécutables qui sont utilisées à plusieurs reprises, comme dans une boucle.
• L'activation du pool d'instructions permet au pilote JDBC de réutiliser les objets
d'instruction préparée et sont renvoyés au pool au lieu d'être libérés et repréparer.
• Properties propObj = new Properties();
propObj.setProperty("user", "root");
propObj.setProperty("password", "admin@123");
propObj.setProperty("MaxPooledStatements", "250");
Connection connObj = DriverManager.getConnection("jdbc:mysql://localhost:3306/tutorialDb",
propObj);
Utiliser la bonne méthode getX()
• L'interface ResultSet fournit de nombreuses méthodes getX() pour obtenir et convertir
les types de données de base de données en types de données Java et est flexible dans la
conversion de types.
• Par exemple : getString(String columnName) renvoie l'objet Java String.
• La conversion d’un type vers un autre est couteux en terme de performance. Utilisez
donc toujours les méthodes getX() appropriées conformément aux type de données en
BD.
Utiliser des instructions SQL standard
• Il est facile de commencer à utiliser une fonctionnalité spécifique à la base de données
qui peut être présente dans MySQL mais pas dans Oracle, etc.
• En utilisant ANSI SQL ou en n'utilisant pas de SQL spécifique à la base de données,
nous assurons un changement minimal dans la couche applicative en cas de changement
de base de données.
• *** Selon la situation, cela peut être préférable d’utiliser des procédures stockées ou
des fonctions pour la logique applicative plutôt que de l'écrire dans la classe Java. Cette
approche réduit les accès à la base de données et améliore considérablement les
performances des applications. ***