Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
enseignement:d14:tp:tp6 [2018/11/06 16:29] – modification externe 127.0.0.1enseignement:d14:tp:tp6 [2023/09/20 18:52] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== D14 - TP6 - JDBC ======
  
 +<WRAP center round alert 60%>
 +Attention, Java utilise par défaut IPV6 et cela pose des problèmes en TP pour forcer IPV4 suivre les instructions suivantes : [[java:ipv6]]</WRAP>
 +
 +Ce TP peut être fait en utilisant en particulier postgresql (installé en salle de TP) ou la base de données h2 (http://www.h2database.com/html/cheatSheet.html) que vous ferez fonctionner en serveur.
 +
 +Il est aussi possible d'utiliser très simplement un serveur mysql (ou postgresql) avec [[https://www.docker.com/|Docker]] :
 +
 +sous linux mint en root
 +
 +export http_proxy='http://user:password@proxy-host:proxy-port'
 +export https_proxy='http://user:password@proxy-host:proxy-port'
 +
 +# Add the repository to your APT sources
 +sudo echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
 +
 +sudo apt-get update
 +sudo apt-get install -y docker.io cgroup-lite apparmor
 +
 +sudo usermod -a -G docker $USER
 +
 +Edit /etc/defaults/docker and add the following lines:
 +export http_proxy='http://user:password@proxy-host:proxy-port'
 +
 +service docker restart
 +
 +  docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=ArraujUrb4 -d mysql
 +
 +Pour éditer la base de données vous pouvez utiliser pgadmin3, installer http://sqldeveloper.solyp.com/ ou utiliser directement Intellij Idea (http://www.jetbrains.com/idea/webhelp/configuring-a-db-data-source.html).
 +
 +===== Utilisation simple de JDBC =====
 +  - Avec le script {{:enseignement:d14:tp:journal.sql.tgz|}} créer les tables qui représentent des journaux.
 +  - Créer une classe que se connecte à votre base de donnée. Pensez à mettre en place correctement les librairies nécessaires. Pour le moment, la connexion sera représentée par une variable d'instance.
 +  - Ajouter une méthode qui affiche la liste des journaux en utilisant un ''Statment''
 +  - Créer une méthode ''ajouterJournal(...)'' qui permet d'insérer un journal dans la base de données
 +  - En utilisant un ''PreparedStamement'', lire un code de Journal au clavier et afficher les informations correspondantes tant que l'on ne rentre pas 0.
 +
 +===== Utilisation des métadonnées =====
 +  - Ajouter une méthode qui affiche les métadonnées correspondant à la base de données
 +  - Ajouter une méthode qui afficher les métadonnées correspondant à la requête ''select * from journal''
 +
 +===== Batch Update =====
 +  - Utiliser les batch update pour ajouter des journaux en lisant un fichier texte formaté (''code_j:titre:prix:type:periode::adr_j'').
 +
 +<code java>
 +// Création d'un requete
 +PreparedStatemen pstmt = 
 +  conn.prepareStatement("INSERT INTO EMPLOYE (email, nom, prenom) VALUES(?, ?, ?)");
 +
 +//On ajoute les exécution une à une ...
 +conn.setAutoCommit(false);
 +
 +// On fixe les paramètres de la première requête à exécuter
 +pstmt.setString( 1, "...@...");
 +pstmt.setString( 2, "..." );
 +pstmt.setString( 3, "..." );
 +// Et on l'ajoute au batch
 +pstmt.addBatch();
 +
 +// On fixe les paramètres de la seconde requête à exécuter
 +pstmt.setString( 1, "...@...");
 +pstmt.setString( 2, "..." );
 +pstmt.setString( 3, "..." );
 +// Et on l'ajoute au batch
 +pstmt.addBatch();
 +
 +// On ajoute autant de requêtes que nécessaire
 +//Par exemple en lisant un flux de données.
 +.
 +.
 +.
 +.
 +//On créée un tableau d'entiers pour recevoir les résultats.
 +//et on execute toutes les mises à jour en une fois.
 +int[] count = stmt.executeBatch();
 +
 +//On valide les changements.
 +conn.commit();
 +</code>
 +
 +===== Utilisation d'un pool de connexion =====
 +En utilisant la classe suivante, utiliser maintenant un pool de connexion au lieu d'une variable globale.
 +L'objet de cet exercice est de comprendre le fonctionnement jdbc propose maintenant ce mécanisme (http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.html).
 +
 +<code java DatabaseManager.java>
 +package fr.univ_tln.bruno.mycompany.jdbc.pool;
 +
 +import java.sql.Connection;
 +import java.sql.DriverManager;
 +import java.sql.SQLException;
 +import java.util.LinkedList;
 +import java.util.Queue;
 +
 +/**
 + * The Class DatabaseManager.
 + */
 +public class DatabaseManager {
 +
 + /** The Constant freeConnections. */
 + private static final Queue<Connection> freeConnections = new LinkedList<Connection>();
 +
 + /** The Constant numberOfInitialConnections. */
 + private static final int numberOfInitialConnections = 5;
 +
 + /** The Constant password. */
 + private static final String password = System
 + .getProperty("MyCompany.database.password");
 +
 + /** The Constant url. */
 + private static final String url = System
 + .getProperty("MyCompany.database.url");
 +
 + /** The Constant user. */
 + private static final String user = System
 + .getProperty("MyCompany.database.user");
 +
 + static {
 + for (int i = 0; i < numberOfInitialConnections; i++) {
 + try {
 + freeConnections.add(DriverManager.getConnection(url, user,
 + password));
 + } catch (SQLException e) {
 + // TODO Auto-generated catch block
 + e.printStackTrace();
 + }
 + }
 + }
 +
 + /**
 + * Gets the connection.
 +
 + * @return the connection
 +
 + * @throws SQLException
 + *             the SQL exception
 + */
 + public static synchronized Connection getConnection() throws SQLException {
 + Connection connection = null;
 + if (freeConnections.isEmpty()) {
 + connection = DriverManager.getConnection(url, user, password);
 + } else {
 + connection = freeConnections.remove();
 + }
 + return connection;
 + }
 +
 + /**
 + * Release connection.
 +
 + * @param connection
 + *            the connection
 + */
 + public static synchronized void releaseConnection(Connection connection) {
 + if (freeConnections.size() < numberOfInitialConnections) {
 + freeConnections.add(connection);
 + } else {
 + try {
 + connection.close();
 + } catch (SQLException e) {
 + e.printStackTrace();
 + }
 + }
 + }
 +}
 +</code>
 +
 +
 +Attention, les login et password doivent être définit pas des "properties" (cf ''System.setProperty()''). Ensuite, ils pourront être lus dans un fichier de configuration.
 +
 +===== Pour finir =====
 +  * Mettez en place un pool de connections avec Apache Commons DBCP : https://www.baeldung.com/java-connection-pooling
 +  * Créer une interface générique paramétrée par le type qui sera celui de votre entité (Personne, Chien, ...) cette interface proposera par exemple les methodes : T find(long id), List<T> findAll(), persist(T), update(T), remove(T). Vous pourrez ensuite améliorer cette interface.
 +  * Créer une classe d'entité Personne, une classe DAOPersonne qui implante DAO<Personne>.
 +  * Ajouter des méthodes spécifiques à la DAO.
 +
 +{{tag>D14 TP Java JDBC}}
 ---- struct data ---- ---- struct data ----
 +metadata.level       : 
 +metadata.Type        : TP
 +metadata.Nom         : 
 +metadata.Enseignements : D14
 +metadata.Promotions 
 +metadata.Technologies : Java, JDBC
 +metadata.Thèmes     : Base de données
 +metadata.Description : 
 ---- ----