3i017 - technologies du web - introduction - sql...3i017 - technologies du web - introduction - sql...

40
3I017 - TECHNOLOGIES DU WEB Introduction - SQL Thursday 6 th February, 2020 Laure Soulier

Upload: others

Post on 30-Jan-2021

6 views

Category:

Documents


0 download

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é