JDBC

Java DataBase Connectivity

adriencaubel.fr

Définition

Java DataBase Connectivity (JDBC) est une API de bas niveau pour se connecter et interagir avec la base de données

Connection conn = 
    DriverManager
        .getConnection("jdbc:mysql://localhost:3306/mabase", "utilisateur", "motdepasse");

ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM matable");

4 types de base

What the JDBC™ 4.3 API Includes

auto

4 types de base

  • DriverManager
  • Connection
  • Statement
  • ResultSet

=> L'ensemble de ces types vont nous permettre d’interagir avec le BDD

Interagir avec le BDD

1. Ouvrir une connexion

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mabase", "user", "pdw")
  1. Charger le pilote (Driver)
  2. Établir la connexion à la BDD

Interagir avec le BDD

2. Établir un statement

Statement stmt = conn.createStatement();
  • Via l'object connection nous créons un Statement que nous allons exploiter

Interagir avec le BDD

3. Exécuter une requête

Statement stmt = conn.createStatement();
ResultSet resultats = stmt.executeQuery("SELECT * FROM client");
  • Executer une requête SQL
    • executeQuery() pour effectuer un SELECT
    • executeUpdate() pour effectuer un INSERT, UPDATE ou DELETE

Interagir avec le BDD

4. Exploiter le résultat

ResultSet rs = stmt.executeQuery(requete);

while (rs.next()) {
   String nom = rs.getString("nom");
   int age = rs.getInt("age");
}
  • Itérer sur les lignes de l'objet ResultSet

Interagir avec le BDD

Code complet

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mabase", "user", "pdw")

Statement stmt = conn.createStatement();

ResultSet resultats = stmt.executeQuery("SELECT * FROM client");

while (rs.next()) {
   String nom = rs.getString("nom");
   int age = rs.getInt("age");
}

PrepareStatement

Statement stmt = con.createStatement();
String sql = "SELECT * FROM users WHERE name + 'name';"

ResultSet rs = stmt.executeQuery(sql)
  • L'écriture du Statement précédent permet des Injections SQL
  • Une façon plus simple est d’éviter de les utiliser et préférer les PrepareStatement

PrepareStatement

PrepareStatement ps = con.createPrepareStatement("SELECT * FROM users WHERE name = ?");
ps.setString(1, "Paul"); // /!\ On commence à 1 et pas à 0

ResultSet rs = ps.executeQuery();
  1. La requête SQL est paramétrable via le ?
  2. Puis on précise la valeur du paramètre
  3. Et finalement on exécute executeQuery() ou executeUpdate() sans paramètres

Transaction

Par défaut, les opérations JDBC sont exécutées en mode autocommit, ce qui signifie que chaque instruction SQL est exécutée et validée immédiatement

Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
stmt.executeUpdate("UPDATE client SET age = 30 WHERE nom = 'Alice'");
// This statement is automatically committed.

Transaction

Pour grouper plusieurs instructions dans une même transaction

conn.setAutoCommit(false);  // 1) Désactiver auto-commit

try (Statement stmt = conn.createStatement()) {
    // 2) Execute multiple statements
    stmt.executeUpdate("UPDATE client SET age = 30 WHERE nom = 'Alice'");
    stmt.executeUpdate("INSERT INTO client (nom, age) VALUES ('Bob', 25')");

    // 3) Commit transaction
    conn.commit();
} catch (Exception e) {
    // 3bis) Rollback transaction in case of error
    conn.rollback();
    e.printStackTrace();
}