Date de première publication : 2016/11/16
Java DataBase Connectivity (JDBC) est un mécanisme qui permet d'utiliser
une base de données (relationnelle) au travers d'un programme Java.
La connexion se fait en téléchargeant préalablement un driver de connexion spécifique à la base utilisée.
Les classes du package java.sql
permettront de manipuler les données.
Pour la découverte de JDBC, nous allons utiliser un moteur de base de données très simple puisque orienté fichiers, SQLITE installé sur etud et berzet. En adaptant le driver, on pourrait faire la même chose avec une base MySQL, Oracle ou JavaDB par exemple.
Préparation de l'environnement
Driver et paramétrage de l'EDI
Télécharger le driver SQLite sur le site officiel ou ici (pas forcément à jour)
Le driver est un fichier jar (archive java) qu'il faut ajouter au classpath pour être utilisé. Si vous êtes sous Eclipse, vous avez deux solutions :
- Le driver n'est utilisé que dans un seul projet, vous pouvez le mettre dans la racine du projet (éventuellement dans src mëme si ce n'est pas prévu pour cela. En tout cas, il ne faut jamais mettre quoique ce soit dans bin)
- Le placer dans un répertoire spécial si vous l'utilisez dans plusieurs projets
Une fois que vous avez choisi l'emplacement, accéder à la fenêtre des bibliothèques du projet
- Clic droit sur le projet : Menu Properties
- Sélectionner le menu Java Build Path
- Onglet Libraries
- Bouton ADD EXTERNAL JARs
Données
Les données que nous allons utiliser sont des données "communautaires" provenant de Pokedex VEEKUN. Vous pouvez télécharger une copie de la base SQLite ici
Pour utiliser SQLite, c'est facile, il faut lier le fichier avec le gestionnaire de la base de données :
$ sqlite3 nom_de_la_base
Les commandes "admin" de SQLite sont préfixées par ".". Essayer les commandes suivantes en mode interactif :
.help
.exit
- La commande
.tables
permet d'avoir une liste des tables. - La commande
.fullschema
permet d'avoir une description complète de toutes les tables (instructions en SQL) - La commande
.shema table
se limite à la table donnée
Pour connaître le nombre de pokemons dans la base :
select count(*) from pokemon;
Un schéma regroupe un utilisateur et tout ce qui appartient à cet utilisateur (structures et données)
Manipulation des données
On cherche à afficher les données sous forme d'une page EXCEL
Utiliser une base de données relationelle avec JDBC
import java.io.*;
import java.sql.*;
public class Bdd {
public static void main(String[] argv) {
try {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:pokemon.sqlite");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from pokemon");
while (rs.next()) {
String nom = rs.getString("identifier");
String h = rs.getString("height");
String w = rs.getString("weight");
System.out.println(nom+" "+h+" "+w); // StringBuffer serait plus intelligent
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
En toute rigueur, on doit appeler les méthodes close()
des objets Connection
, Statement
et ResultSet
.
Deux autres méthodes utiles au cas où (je vous laisse deviner ce que l'on peut faire avec) :
stmt.executeUpdate( "drop table if exists dummy" );
stmt.setQueryTimeout(temps_max);
Si vous voulez faire deux parcours imbriqués de la base de données, il faudra deux ResultSet
s mais aussi deux Statement
s.
Mettre sous forme de tableau...
Comme pour le TP Houzehou, utilisez un JTable
pour afficher les données.
J'aimerai que vous affichiez les noms des pokemons et leurs capacités dans un tableau (avec le nom des capacités en français).
Aller plus loin...
Nous avons manipulé au plus bas niveau une base de données en Java. JDBC sert de base pour des manipulations de plus haut niveau, notamment lorsque l'on fait du Java Entreprise.
On ajoute une couche logicielle entre la base de données et JDBC et les classes utilisées. Une mise en correspondance (Object Relation Mapping)
est faite entre les classes objets (appelées alors des entités) et les données en base, la norme la plus populaire est
Java |
ORM |
JDBC |
Base de données |