3i017 - technologies du web - introduction - sql...3i017 - technologies du web - introduction - sql...
TRANSCRIPT
-
3I017 - TECHNOLOGIES DUWEBIntroduction - SQL
Thursday 6th February, 2020
Laure Soulier
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Gestion des données
• L’information est partout dans les entreprises : personnes, produits,comptabilité, finance, relations, ...
• Données = or noir du 21ème siècle• Besoin de la stocker, l’organiser, l’interroger
Sinon....
L3 Info - 3IN017 1/36
-
Rappel / Pré-requis
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
SGBD et SQL: "One size fits all"
• Facilité d’utilisation et abstraction : utilisation sans se soucier des détailsd’implémentation
• Cohérence des données : liens logique entre les données• Persistance des données : application peut se terminer sans perdre lesdonnées (enregistrement sur disque / serveur distant)
• Fiabilité et tolérance aux pannes : continue à fonctionner (de façondégradée)
• Efficacité• Universalité : représente les données pour différentes fonctionnalités
Vocabulaire important
Vues, SQL, Données structurés, transaction, optimisation de requêtes,indexation de données
L3 Info - 3IN017 2/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Propriétés ACID
• Atomicité : Une transaction se fait complètement ou pas du tout
• Cohérence : Le système passe toujours d’un état valide à un autre(maintient les contraintes d’intégrités, procédures, etc...)
• Isolation : Indépendance entre les transactions
• Durabilité : Une transaction effectuée l’est de façon durable (même en casde panne)
L3 Info - 3IN017 3/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Modélisation
• 3 étapes de construction d’une base de données– Modélisation conceptuelle
– Modélisation logiqueEtudiant (Numero, Nom, Prénom)Livre (ISBN, Auteur, Titre)Emprunter (Numero#, ISBN#)
– Modélisation physique : implémentation dans un SGBDCREATE TABLE etudiant (numero char(8) PRIMARY KEY, nomvarchar(40), prenom varchar(40));
L3 Info - 3IN017 4/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Interrogation des données
• Algèbre relationnelle– Formalisation des opérations sur les bases de données– Basée sur la théorie des ensembles (union, intersection, différence,
produit cartésien) et des opérations relationnelles (fusion etprojection)
– Opérations dérivées. E.g., jointure = produit cartésien et sélection• SQL : Langage d’interrogation
– Structure de base :select att1, att2, ... → attributsfrom t1, t2, ... → tableswhere predicat1, ... → prédicats / conditions
Exemple : Liste des livres empruntés par un étudiant
SELECT etudiant.nom, livre.titreFROM etudiant, livre,emprunterWHERE etudiant.numero = emprunter.numeroAND livre.isbn = emprunter.isbnAND etudiant.numero = 123513223;
L3 Info - 3IN017 5/36
-
Programmation et SGBD
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Programmation et bases de données
Langages de programmation :• Java, C, C#, Javascript, ...
– Langage procédural :"je fais quoi ?"
– Accès itératif : boucles,récursion
– Types complexes
Programmation d’applications
Données structurées et stockéesen mémoire
Langages de requêtes :• SQL : Structured Query Language
– Langage déclaratif :"je veux quoi ?"
– Accès ensembliste :Q → {a,b,c}
– Types simples
Accès aux données gérées par SGBD
Données structurées sur disque
L3 Info - 3IN017 6/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Programmation et bases de données
• Accès aux données par fichier– opérations simples : ouvrir/fermer, lire/écrire– méthodes d’accès : séquentiel, indexé, haché, ...– utilisation par plusieurs programmes difficile (format, accès
concurrents, ...)
L3 Info - 3IN017 7/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Programmation et bases de données
• Accès aux données par base de données– méthodes d’accès par requêtes– facilité d’accès par l’index– transactions assurent les propriétés ACID (Atomicité, Cohérence,
Isolation, Durabilité)
L3 Info - 3IN017 8/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Fichiers vs. BD
Fichier :• Faible structuration desdonnées
• Dépendance entre programmeet fichiers
• Redondance des données• Absence de contrôle decohérence globale des données
BD :• Structuration des données àtravers un schéma de données
• Indépendance entreprogramme et BD
• Données partagées /atomiques
• Contrôle de la cohérencelogique et physique (schémas,transactions, ...)
L3 Info - 3IN017 9/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Couplage SQL - langage de programmation (Embedded SQL)
• SQL n’est pas suffisant pourécrire des applications (SQLn’est pas "Turing complet")
• SQL a des liaisons (bindings)pour différents langages deprogrammation (C, C++,Java, PHP, ...)
• Les liaisons décrivent laconnexion de langages hôtesavec un SGBD relationnel
Figure 1: source : Wikipedia
L3 Info - 3IN017 10/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
JDBC
• API Java standard pour accéder à des données tabulaires (BDrelationnelles, mais aussi excel, ...)
• A ce jour : JDBC 4.2• Pour mysql : jdbc-connector-java-8.0.18.jar
– Supporte MySQL 5.6, 5.7, et 8.0.– Supporte JDBC 4.2– pour Java 8 (pour java 7 ou moins récents, utiliser connector 5.1)– doc : https://dev.mysql.com/doc/connector-j/8.0/en/
• Fonctions : requêtes SQL, gestion des transactions, traitement desexceptions/erreurs
L3 Info - 3IN017 11/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
JDBC et architecture logicielle
L3 Info - 3IN017 12/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
JDBC et architecture logicielle
L3 Info - 3IN017 13/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Programmation JDBC
Etapes à mettre en place dans votre code(sur une ou plusieurs clases/méthodes):
• Changer Driver JDBC• Créer connexion BD• Accéder aux données (requêtes, mises à jour) :
– Créer un ordre SQL (statement object)Exécuter ordre SQLTraiter le résultat (ResultSet, curseur)
– Fermer ordre SQL (close)
• Fermer la connexion
L3 Info - 3IN017 14/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Programmation JDBC
• Driver = classe Java• Class.forName("package.classe_driver")
– Class.forName("com.mysql.jdbc.driver");– Class.forName("oracle.jdbc.driver.OracleDriver");– Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
• Exception / erreur :– Par exemple : le driver n’est pas accessible par CLASSPATH :
java.lang.ClassNotFoundException e
Code pour MySQL
1 try {2 Class.forName("com.mysql.jdbc.Driver");3 }4 catch(java.lang.ClassNotFoundException e) {5 System.err.print("Exception: ");6 System.err.println(e.getMessage());7 }
L3 Info - 3IN017 15/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Connexion au SGBD
• Option 1– Etablir une connexion :
Connection c = Driver.getConnection(, , )
formattage de l’url : = ::@Exemple : jdbc : oracle : thin : @oracle.ufr − info−p6.jussieu.fr : 1521 : ora10
–• Option 2– Etablir une connexion :
Connection c = Driver.getConnection()
formattage du paramètre : = toutes les infos de la connexionExemple : jdbc:mysql://:3306/user=password=
L3 Info - 3IN017 16/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Créer et exécuter des ordres (statement) SQL
–• Créer un ordre (statement) :– Statement stmt = c.createStatement();– c est une connexion ouverte/active vers une bases de données
• Exécuter un ordre :– stmt.executeQuery() : interrogation (QL)– stmt.executeUpdate() : mises-à-jour données (DML) et schéma
(DDL)– exemple : statement.executeQuery("select A,B,C from R")
• Comment accéder au résultat d’une requête ?– ResultSet res = statement.executeQuery("select A,B,C from R"); →curseur
– int executeUpdate(“insert ...”) → nombre de lignes insérées– int executeUpdate(“update ...”) → nombre de lignes modifiés– int executeUpdate(“create table ...”)– int executeUpdate(“drop table ...”)
L3 Info - 3IN017 17/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
ResultSet : accès à la réponse
• rs.beforeFirst() : Place le curseuravant la première ligne (défaut àl’ouverture du curseur)
• rs.next() :– Avance vers la prochaine ligne
dans la réponse (premierappel avance vers la premièreligne)
– Retourne false si fin ou erreur
• rs.close():– Libère les ressources
JDBC/BD– rs est fermé automatiquement
avec l’exécution d’unenouvelle requête
L3 Info - 3IN017 18/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
ResultSet : accès aléatoire
• rs.get()– Retourne la valeur de l’attribut avec transformation vers le
type java – : nom ou position de l’attribut– : double, byte, int, Date, String, float, short, long, Time,Object
• rs.previous(): Recule vers la ligne précédente• rs.absolute(int ): Aller vers la ligne • rs.relative (int ): Avancer (positif) ou reculer (négatif) lignes
• rs.first() / rs.last() : Aller vers la première / dernière ligne
L3 Info - 3IN017 19/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
ResultSet : métadonnées
• Metadonnées :– Nombre d’attributs– Nom et type d’un attributs
• int rs.getMaxRows() / setMaxRows(int max):– Détermine la taille maximale (nombre de lignes) d’un ResultSet– 0 = taille illimitée
• int getQueryTimeout() / setQueryTimeout(int ms):– Détermine le temps d’attente maximal avant de déclencher une
exception (SQLException)
• Accès à la structure des métadonnéesResultSetMetaData md = rs.GetMetaDataObject():int md.getColumnCount();String md.getColumnName(int column);String md.getTableName(int column);String md.getColumnTypeName(int column);
L3 Info - 3IN017 20/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
ResultSet : mises à jour
• Possible sous certaines contraintes :– Une seule table dans FOR– Pas de group by– Pas de jointures
• Conditions pour insert : Tous les attributs non nuls et sans valeurs pardéfaut sont dans SELECT
• Sinon on utilise les ordres SQL: UPDATE, DELETE, INSERT
• Mise-à-jour d’une ligne :– rs.update(,), ... : maj en mémoire– rs.updateRow() : propagation dans la BD
• Effacement d’une ligne (actuelle) : rs.deleteRow()• Insertion d’une ligne :
– rs.moveToInsertRow();– rs.updateInt(1,123) ;– rs.updateString(2, ’toto’) ;– rs.insertRow();
L3 Info - 3IN017 21/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Transformation de types : SQL - Java
L3 Info - 3IN017 22/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Exemple
1 try {2 Class.forName("oracle.jdbc.driver.OracleDriver");3 connexion = DriverManager.getConnection(url, user, password);4 Statement lecture = connexion.createStatement();5 ResultSet curseur = lecture.executeQuery("select...");6 while (curseur.next()) {7 out.println(curseur.getString("nom"));8 out.println(curseur.getInt("age"));9 }
10 curseur.close();11 lecture.close();12 connexion.close();13 }14 catch(java.lang.ClassNotFoundException e) {15 System.err.print("Exception: ");16 System.err.println(e.getMessage());17 }
L3 Info - 3IN017 23/36
-
JDBC Avancé
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Statement - création, préparation...
• Ordre avec exécution unique :– Statement s = createStatement();
• Ordre avec exécution multiple :– PreparedStatement ps = prepareStatement(, );
• Appel de procédure stockée :– CallableStatement pc = prepareCall(, );
L3 Info - 3IN017 24/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Create Statement
Statement s = createStatement();
• int resultSetType– TYPE_FORWARD_ONLY : lecture avant (par défaut)– TYPE_SCROLL_INSENSITIVE : lecture aléatoire– TYPE_SCROLL_SENSITIVE : lecture aléatoire, lectures sales
• int resultSetConcurrency– CONCUR_READ_ONLY : sans maj (verrous partagés), concurrence
élevée– CONCUR_UPDATABLE : avec maj (verrous exclusives), concurrence
plus faible
• int resultSetHoldability– HOLD_CURSORS_OVER_COMMIT : curseur reste ouvert au
moment d’un commit– CLOSE_CURSORS_AT_COMMIT : curseur est fermé au moment
d’un commit
Voir documentation pour des exemples...
L3 Info - 3IN017 25/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
PreparedStatement
Prepared Statement
PreparedStatement ps = prepareStatement(, ): RequêteSQL avec un ’?’ pour chaque paramètreset(,) : remplace le i-ème ’?’ par la valeur de type
• Exécution plus rapide : une seule phase d’optimisation pour plusieurs exé-cutions
• Réutilisation de code• Facilite le passage de paramètres : par exemple chaînes avec “’ ”
Exemple
String updateString = "update NOTES set NOTE = ? where NO_ETUDIANT = ?";PreparedStatement updateSales = con.prepareStatement(updateString);int [] notes = {12,20,2,9};int [] nums = {123456,289068,376876,465687};for(int i = 0; i < notes.length; i++) {
updateSales.setInt(1, notes[i]);updateSales.setInt(2, nums[i]);updateSales.executeUpdate();
}L3 Info - 3IN017 26/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Traitement des exceptions
• Pratiquement toutes les méthodes peuvent déclencher des exceptionSQLException avec
– SQLException sqle ;– sqle.GetMessage() : description de l’erreur– sqle.GetSQLState() : état SQLState (spécification Open Group SQL
specification)– sqle.GetErrorCode() : code d’erreur– sqle.GetNextException() : exception suivante (si présente)
try {... // JDBC statement.
} catch (SQLException sqle) {while (sqle != null) {
System.out.println("Message:"+sqle.getMessage());System.out.println("SQLState:" + sqle.getSQLState());System.out.println("Vendor Error:"+ sqle.getErrorCode());sqle.printStrackTrace(System.out);sqle = sqle.getNextException();
}}
L3 Info - 3IN017 27/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Transactions dans JDBC
• Transaction : Exécution atomique (tout ou rien) d’une collection d’ordres• Mode automatique (autocommit) :
– mode par défaut à la création d’une connexion– chaque ordre est traité comme une transaction
• Contrôle explicite : c.setAutoCommit(false);• Validation explicite : c.commit();• Annulation explicite : c.rollback();
L3 Info - 3IN017 28/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Exemple complet JDBC (1/4)
import java.sql.*;import java.io.*;
public class Acces {String url = "jdbc:oracle:thin:@oracle.ufr-info-p6.jussieu.fr:1521:ora10";String user = "M1000"; // loginString password = "M1000"; // mot de passeConnection connexion = null;PrintStream out = System.out;
public static void main(String in[]) {Acces c = new Acces();String sql = in[0];c.traiteRequete(sql);
}public Acces(){
try {Class.forName("oracle.jdbc.driver.OracleDriver");
} catch(Exception e) {gestionDesErreurs(e);
}}
L3 Info - 3IN017 29/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Exemple complet JDBC (2/4)
public void traiteRequete(String requete) {out.println(requete);try {
connexion = DriverManager.getConnection(url, user, password);Statement lecture = connexion.createStatement();ResultSet curseur = lecture.executeQuery(requete);ResultSetMetaData infoResultat = curseur.getMetaData();int nbChamp =infoResultat.getColumnCount();out.println("le resultat de la requete est:");String entete = "";for(int i=1; i
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Exemple complet JDBC (3/4)
/* affichage des tuples */while (curseur.next()) {
String tuple = "";for(int i=1; i
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Exemple complet JDBC (4/4)
protected void gestionDesErreurs(Exception e) {out.println("Exception: " + e);e.printStackTrace();try {
if (connexion != null)connexion.close();
}catch(Exception se) {out.println("Tout autre probleme: " + se);
} throw new RuntimeException("Arret immediat");}
L3 Info - 3IN017 32/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Poolinge de connexions : Datasource
• Une connexion à la base de données soulève de nombreuses questions :– Quand ouvrir et fermer une connexion ?– Faut-il garder une connexion ouverte entre deux utilisations ?
Pooling de connexion
• Ensemble de connexions déjà ouvertes pouvant être utilisées par le client lorsde l’accès à une BD• A la fin de la connexion, le client appelle la méthode close(). La connexionest remise dans le pool. Elle reste donc ouverte.
Figure 2: Source : PYnative
L3 Info - 3IN017 33/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Datasource
• Remplace DriverManager :– Connection getConnection();– Connection getConnection(username, password) ;
• Avantages : Portabilité du code et gestion des ressources (pool deconnexions)
En pratique....
L3 Info - 3IN017 34/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Datasource : en pratique...
• context.xml
• web.xml
DB Connectionjdbc/Databasejavax.sql.DataSourceContainer
L3 Info - 3IN017 35/36
-
Rappel / Pré-requis Programmation et SGBD JDBC Avancé
Appel Servlet Java
import javax.naming.*;import javax.sql.*;import java.sql.*;
public class DBTest {public void init() {
try{Context ctx = new InitialContext();if(ctx == null ) throw new Exception("Boom");DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/db");if (ds != null) {
Connection conn = ds.getConnection();if(conn != null) {
Statement stmt = conn.createStatement();ResultSet rst = stmt.executeQuery("select ...");if(rst.next()) {
... }conn.close();
}} catch(Exception e) { e.printStackTrace(); }
}}
L3 Info - 3IN017 36/36
Rappel / Pré-requisProgrammation et SGBDJDBC Avancé