Base de données - Tableaux Query Rapport de projet



Documents pareils
Guide Enseignant de l application OpenERP

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Début de la procédure

1 Introduction et installation

Gestion de stock pour un magasin

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Utilisation du BDE pour la maintenance des fichiers DBF de l'application TopoCad:

La base de données XML exist. A. Belaïd

Base de données relationnelle et requêtes SQL

Créer et partager des fichiers

Mettre en place un accès sécurisé à travers Internet

MODE OPERATOIRE OPENOFFICE BASE

Migration d une Base de données

Construire des plug-ins pour SAS Management Console SAS 9.1

Lancez le setup, après une phase de décompression, la fenêtre d installation des prérequis apparaît, il faut les installer :

clef primaire ; clef étrangère ; projection ; restriction ; jointure ; SQL ; SELECT ; FROM ; WHERE

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java DataBaseConnectivity

Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Le langage SQL Rappels

Bases Java - Eclipse / Netbeans

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Rokia Missaoui - UQO. INF4163 Hiver 2008

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

SQL MAP. Etude d un logiciel SQL Injection

Devenez un véritable développeur web en 3 mois!

EXCEL TUTORIEL 2012/2013

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Logiciel de gestion de caisse et d ardoises

GUIDE DE DÉMARRAGE. SitagriPro Infinite FINANCEAGRI. Un service. c o r p o r a t e

Compte Rendu d intégration d application

Administration du site (Back Office)

IBM* DB2 Universal Database* Tutoriel Business Intelligence : Introduction à Data Warehouse Center

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Microsoft Hosted Exchange 2010 DOCUMENT D EXPLOITATION

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

Information utiles. webpage : Google+ : digiusto/

FileMaker 10. Guide ODBC et JDBC

Bases de données relationnelles

Le Langage SQL version Oracle

Tutoriel d installation de Hibernate avec Eclipse

Plateforme PAYZEN. Définition de Web-services

Business Talk IP Centrex. guide. web utilisateur. pour. les services standards

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

Développement Logiciel

Créer le schéma relationnel d une base de données ACCESS

MANUEL POUR L UTILISATION DE L APPLICATION EN LIGNE DU SYSTÈME DE NOTIFICATION DES ACCIDENTS INDUSTRIELS

Utilisation d Hyperplanning 2011

GESTION DES MENUS. Un menu est un ensemble de liens permettant la navigation dans le site.

BIRT (Business Intelligence and Reporting Tools)

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

Tutorial sur SQL Server 2000

Langage SQL : créer et interroger une base

TP Bases de données réparties

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Mysql. Les requêtes préparées Prepared statements

Compte-rendu de projet de Système de gestion de base de données

Plateforme de support en ligne. Guide d utilisation

Présentation du langage et premières fonctions

TP1 : Initiation à Java et Eclipse

Introduction à JDBC. Accès aux bases de données en Java

Contrôle Parental Numericable. Guide d installation et d utilisation

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Les tablettes et l'extranet Intermixt Mode d'emploi

Formation. Module WEB 4.1. Support de cours

Définition des Webservices Ordre de paiement par . Version 1.0

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Utilisation d objets : String et ArrayList

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Bases de programmation. Cours 5. Structurer les données

contact@nqicorp.com - Web :

Table des matières L INTEGRATION DE SAS AVEC JMP. Les échanges de données entre SAS et JMP, en mode déconnecté. Dans JMP

SUPPORT DE COURS ACCESS 2010

TAGREROUT Seyf Allah TMRIM

Guide SQL Server 2008 pour HYSAS

KPI (Key Performance Indicator) dans MOSS

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

SOMMAIRE. Travailler avec les requêtes... 3

contact@nqicorp.com - Web :

Bases de données documentaires et distribuées Cours NFE04

OpenPaaS Le réseau social d'entreprise

Tutoriel. Votre site web en 30 minutes

TP1. Outils Java Eléments de correction

Rechercher et supprimer les doublons!

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

et Groupe Eyrolles, 2006, ISBN :

Guide d utilisation des services My Office

TP Programmation Java / JDBC / Oracle

Guide de configuration. Logiciel de courriel

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

FileMaker 13. Guide ODBC et JDBC

Création d un service web avec NetBeans 5.5 et SJAS 9

Transcription:

Base de données - Tableaux Query Rapport de projet Xavier Dubuc 30 mars 2009 Table des matières 1 Introduction. 2 1.1 Qu est-ce qu un tableau query?................................. 2 1.2 Le tupple résumé.......................................... 2 2 Implémentation en JAVA. 2 2.1 Justification du langage utilisé.................................. 2 2.2 Compilation, Installation et Exécution.............................. 2 2.3 Utilisation............................................. 3 2.4 Algorithme de conception de la requête SQL.......................... 5 2.5 Mécanismes mis en oeuvre pour atteindre les objectifs..................... 6 3 Limites de l application et problèmes rencontrés. 8 1

1 Introduction. 1.1 Qu est-ce qu un tableau query? Un tableau query est un tableau contenant des constantes et/ou des variables, celles-ci servant respectivement à fixer la valeur d un tupple pour un attribut ou à laisser cette valeur libre. L ensemble ainsi créé, en association avec le tupple résumé, permet d exprimer des requêtes qui pourront être traduites en SQL dans le but d être évaluées sur une base de données. Le projet qui nous a été demandé vise à convertir une requête, exprimée a l aide de ces tableaux querys en une requête SQL et d évaluer celle-ci sur une base de données. Le programme ainsi créé doit être capable de gérer à la fois les bases de données de type SQLite et les bases de données de type MySQL, il doit également permettre à l utilisateur d entrer un (ou plusieurs) tableau(x) query(s) ainsi qu un tupple résumé via une G.U.I.. 1.2 Le tupple résumé. Le tupple résumé est utilisé pour formatter le résultat à renvoyer par la requête SQL. Par exemple, si l on veut que la requête nous affiche les 2 colonnes respectivement nommées actor et movie, il faut que le tupple résumé soit de la forme t resume = (x actor, x movie ) et que dans un des (ou plusieurs) tableaux querys il y ait au moins 2 colonnes telles que x actor et x movie soient des valeurs d un des tupples de ce(s) tableau(x) query(s). Exemple le plus simple : Exemple plus probable : actor x actor movie x movie actor x actor movie nationality x nationality year x movie x year 2 Implémentation en JAVA. 2.1 Justification du langage utilisé. J ai choisi d implémenter ce langage de programmation pour différentes raisons. La première est tout simplement que c est celui que je connais le mieux vu que je l ai appris pendant toute ma première année au sein de l UMH et que je continue à le perfectionner activement cette année. Ensuite, le projet demandant une G.U.I.et ne connaissant pas l utilisation de celle-ci en Python cela a définitivement orienté mon choix vers le JAVA. Ceci, malgré le fait que ce dernier requiert plus de lignes de code inutiles. 2.2 Compilation, Installation et Exécution. Pour utiliser le SQL en JAVA il faut installer des drivers (qui sont en fait des librairies JAVA), un pour le MySQL et un pour le SQLite. Ces 2 drivers sont mis à disposition dans l archive contenant le programme, ils doivent être ajoutés dans les CLASSPATH de JAVA. Si d aventure l archive serait trop volumineuse pour être rendue, ces 2 drivers sont également disponibles en ligne sur mon site personnel dont l url est : http://xionhearts.site.voila.fr/bdd/drivers.html. Pour l exécution, il vous suffit de taper java graphic.run dans un terminal (en vous plaçant dans le dossier où les codes ont été compilés, évidemment). Vous obtiendrez alors une fenêtre graphique vous permettant de vous connecter à une base de données. 2

Fig. 1 Identification.png (LogFrame.java) 2.3 Utilisation. La fenêtre (voir Fig 1.)qui s affiche, comme dit ci-haut, vous permet de vous connecter à une base de données. Pour ce faire vous devez entrer différentes données. Voici à quoi correspondent exactement chaque champ selon que vous utilisiez une base de données MySQL ou SQLite. 1. MySQL. URL de la base de données MySQL. Vous devez entrer ici un lien http :// vers le serveur où est hébergée la base de données. Nom de la base de données. Vous devez entrer ici le nom de la base de données à utiliser sur ce serveur. Nom d utilisateur. Vous devez entrer ici un nom d utilisateur valable pour vous connecter au serveur. Mot de passe. Vous devez entrer ici le mot de passe correspondant au nom d utilisateur entré ci-haut. 2. SQLite. Lien complet vers la base de données SQLite. Vous devez entrer ici un lien complet (ou relatif) vers le fichier.db (le lien doit donc se terminer par.db ). Nom de la base de données. Vous devez entrer ici le nom de la base de données stockée dans le fichier à utiliser. Nom d utilisateur. Vous ne devez pas vous préoccuper de ce champ. Mot de passe. Vous ne devez pas vous préoccuper de ce champ. Une fois toutes les données bien entrées, cliquez sur Connexion pour ouvrir une nouvelle fenêtre (voir Fig 2.). Dans cette fenêtre apparaissent des tables. Les tables du dessus correspondent aux tableaux querys que vous pouvez remplir à votre gré afin d exprimer votre requête. Chaque tableau correspond à une table présente sur la base de données entrée lors de la connexion. Pour introduire une variable, il faut que la chaîne de caractères entrée dans la case désirée commence par un x, tout autre chaîne de caractères est considérée comme une constante. Le panel contenant toutes ces tables est placé dans un JScrollPane afin que le panel puisse être scrollé lorsque beaucoup de tables sont à afficher. La table d en dessous quant à elle correspond au tupple résumé que vous devez utiliser afin de parachever votre requête. 3

Fig. 2 Main.png (MainFrame.java) Fig. 3 Resultat.png (ShowFrame.java) 4

Une fois que votre requête est correctement exprimée, cliquez sur Convertir pour ouvrir une dernière fenêtre (voir Fig 3.) où s affichent la requête SQL ainsi que le résultat de son évaluation sur la base de données entrée lors de la connexion. 2.4 Algorithme de conception de la requête SQL. La classe.java servant à construire la requête SQL s appelle naïvement QueryConverter.java. Elle comporte : Le constructeur Celui-ci prend comme paramètres un objet Connexion qui est en fait un lien vers la base de données, un ArrayList contenant des objets DataTable qui comportera tous les tableaux querys à utiliser et un tableau de String qui symbolisera le tupple résumé. La méthode private void convert() Cette méthode est exécutée dans le constructeur, elle permet d initialiser la variable d instance sql- Query en y plaçant la requête SQL correspondant à la requête exprimée par les tableaux querys et le tupple résumé. Cette méthode fait appel à 2 autres méthodes, private getselectandfromclauses() et private getwhereclause() dont elle concatène les résultats respectifs en ajoutant un point virgule en fin de chaîne afin de compléter la requête SQL. La méthode private String getselectandfromclauses() Cette méthode permet de construire les clauses SELECT et FROM de la requête SQL. Elle est implémentée par 4 boucles imbriquées : la première parcourt chaque élément du tupple résumé, la seconde parcourt chaque tableaux query contenus dans l ArrayList et les deux dernières parcourent chaque tupple du tableaux courant et chaque colonne de ces tupples. Pour chaque tableau on va executer la requete SELECT * FROM nom de la table et on va récupérer grâce à celà les noms des colonnes de la table désignée par le tableau query. J ai privilégié cette façon de faire car elle fonctionne dans tous les cas, pour n importe quel type de base de données SQL. (Il y a en effet moyen de récupérer les noms de colonnes via les «MetaData» lorsque la base de données est de type MySQL.) Il y a une petite subtilité quant à la sélection des tables, en effet, afin d éviter toute complexité dans les codes et donc éviter les sous requêtes, on sélectionne autant de tables que l on a de tupples. De manière plus claire, si on a 4 tupples dans une table, on selectionnera 4 fois la table (dans la clause FROM) avec un alias différent à chaque fois (une simple numérotation de table dans ce cas-ci). Dès lors le rôle de la variable tablefrom est de conserver cet alias et de permettre l utilisation de cet alias pour complèter le clause SELECT. On complète en fin de méthode la chaîne de caractères à renvoyer de manière à ne pas avoir de redondances. (d où les tests avec la méthode contains) La méthode private String getwhereclause() Cette méthode permet de construire la clause WHERE de la requête SQL. Elle est implémentée par 3 boucles imbriquées qui servent à parcourir toutes les colonnes de tous les tupples de toutes les tables concernées par les tableaux querys. Ces boucles ont pour rôle de stocker tous les attributs trouvés dans les tableaux querys ainsi que les colonnes correspondantes dans la case suivante d un même tableau que l on nomme allattributes. Ces noms de colonnes sont stockés précédés par l alias de leur table pour permettre de les atteindre de manière unique. En fin de méthode on lance 2 boucles imbriquées visant à vérifier lorsque 2 variables sont les mêmes ou si une case contient une constante. Dans les 2 cas, on va utiliser les noms de colonnes pour imposer l égalité entre ces 2 colonnes ou l égalité entre la colonne et une chaîne de caractères. On complète la chaîne de caractères à renvoyer en fin de méthode de manière à ne pas avoir de redondances (A = B => B = A). On prend également soin que si ce n est pas la première des conditions, il faut ajouter un AND afin que toutes les égalités trouvées soit respectées par le résultat de la requête SQL. 5

Structure du tableau allattributes. 1er attribut *alias.colonne du 1er attribut* 2ème attribut *alias.colonne du 2ème attribut*... nème attribut *alias.colonne du nème attribut* La méthode public String evaluate() Cette méthode permet d évaluer la requête SQL sur la base de données et de placer le résultat dans une chaîne de caractères. Cette méthode est peu utilisée, uniquement pour une éventuelle application console (comme pour les programmes tests TestMySQL.java et TestSQLite.java). La méthode public DataTable evaluateintoadatatable() Cette méthode est exactement la même que la précédente mis à part le fait qu elle renvoie son résultat sous forme d une table (Objet DataTable) contenant les tupples demandés par la requête SQL. Cette méthode est utilisée pour afficher graphiquement le résultat de l évaluation de la requête. Remarque : Les méthodes utilisées ne dépendent pas du type de base de données, en conséquence, tout ce qui a été utilisé ci-haut fonctionnera, en particulier si la base de données est de type MySQL ou SQLite. 2.5 Mécanismes mis en oeuvre pour atteindre les objectifs. 1. Structures de données. Afin de faciliter la manipulation de bases de données et de tables de données, j ai créé mes propres structures de données DataBase et DataTable définies dans des classes du même nom. Celles-ci contiennent des méthodes accessors simples afin d accéder aux noms des colonnes, nom de table, nom de base de données et tupples de manière aisée sans passer par de multiples accès à des tableaux. 2. JTable s. La classe JTable est largement utilisée pour afficher les tables graphiquement sur la G.U.I., elle est très facile d utilisation avec les structures de données développées ci-haut. MySQL Pour ce type de base de données, la méthode implémentée de base est compatible, en effet on accède directement aux tables grâce aux MetaData s de l objet Connexion. SQLite Pour ce type de base de données, la méthode explicitée ci-haut ne fonctionne pas, il faut accéder aux noms des tables grâce à une requête SQL sur la table sqlite master. Cette tâche est effectuée par la méthode getsqlitetablesnames() et celle-ci est appelée que si le booléen SQLite est à true. Ce booléen est passé en paramètre lors de la construction de la MainFrame. Ce constructeur est appellé par la LogFrame où une JCheckBox est apposée et l utilisateur doit cocher celle-ci pour spécifier que la base de données utilisée est de type SQLite (ou décocher pour spécifier que la base est de type MySQL). 6

3. Récupération des données - ActionListener. L écouteur se charge de récupérer les données contenues dans les tables. Celui-ci compte également le nombre de lignes non-vides dans les tables afin de ne pas considérer des tupples vides, mais aussi le nombre de colonnes non-vides afin de ne pas afficher des colonnes vides dans les réponses. Une fois les données récupérées, tout est stocké dans des objets DataTable afin de faciliter l utilisation et l objet QueryConverter est initialisé et utilisé. Si tout s est bien passé (c est-à-dire qu aucune exception n a été lancée) une ShowFrame contenant les résultats de l algorithme est affichée. 4. Cas de lancements d exceptions. Introduction d informations erronées pour la connexion. Que ce soit l adresse de la base de données, le nom de la base de données à utiliser, le nom d utilisateur ou le mot de passe ; l utilisateur est prévenu qu une des informations est erronées et il lui est également précisé laquelle de ces informations est erronée. Le tupple résumé est vide. L utilisateur n a pas entré les données du tupple résumé, le programme lui affichera alors un message afin de lui spécifier qu il a laissé le tupple résumé vide. De la même manière si la première colonne de ce tupple est vide, les données entrées ne seront pas bien formattées et l utilisateur en sera averti. Le tupple contient une variable n existant pas dans les tableaux querys. L utilisateur a entré des données erronées, en effet le tupple résumé ne peut contenir que des variables existant dans les tableaux querys vu qu il représente ce qu il faut sélectionner pour l affichage des résultats (la (ou une) colonne correspondant à la variable). Si la variable ne figurait pas dans au moins un tableau query, cela reviendrait à sélectionner une colonne inexistante. En conséquence, l utilisateur est prévenu par le programme de l erreur qu il a commis. La valeur NULL dans un tableau query.. On prend comme convention de ne pas autoriser la valeur null dans un tableau query, idem pour les tables. Si l utilisateur oublie de remplir une colonne (ou plus), le programme l avertit de son oubli. 5. Affichage des résultats. La ShowFrame affiche les 2 résultats attendus de manière simple, en effet, elle affiche simplement la requête SQL dans un JEditorPane qui est lui même placé dans un JScrollPane afin que le panneau puisse être scrollé si la requête est longue. Le second panel permet d afficher la table résultat, la méthode d affichage parcourt simplement la DataTable créée par la méthode evaluateintoadata- Table() de l objet QueryConverter et affiche les éléments 1 à 1 dans une JTable elle aussi scrollée au cas où elle comporterait beaucoup de colonnes et/ou de tupples. 7

3 Limites de l application et problèmes rencontrés. Limites de l application. Les limites de l application sont définies par la manière d exprimer les requêtes par tableaux querys. Les requêtes exprimées de cette façon sont les requêtes conjonctives, en effet, aucune soustraction de table ni union n est possible. La jointure étant assurée par la clause FROM, la selection par les conditions de la clause WHERE la projection par la clause SELECT et finalement, la renommée sera assurée par la clause AS. En SQL, la soustraction impliquerait qu il y ait une négation, or aucune des requêtes SQL renvoyées par le programme ne comportera de NOT ni d inégalité entre 2 colonnes ( NOT = ). Ainsi toutes les requêtes SQL exprimées seront de la forme : SELECT *colonnes* AS *alias* FROM table 10,...,table 1n 1,...,table M0,...,table Mk 1 WHERE col xa0 = col yb 0 AND... AND col xil = col yjl ; - n et k représentent le nombre de fois que la table est sélectionnée, - col xa, col xi, col yb et col yj représentent des colonnes quelconques, - l représente le nombre de conditions d égalité à imposer. Problèmes rencontrés. Le problème le plus handicapant pour commencer l implémentation est certainement les structures de données à utiliser, en effet, le choix entre la classe ArrayList et les simples tableaux n est pas chose facile lorsque l on a pas encore réellement utiliser le programme. Par la suite, lors de l implémentation de la G.U.I., le choix de structure de données devient évident. L autre problème handicapant est l affichage des tables, en effet la libraire swing de JAVA est très puissante mais parfois difficile à utiliser bien que simple sur un premier plan vu que orientée objet (chaque élément à afficher est un objet et l objet sur lequel les assembler s appelle la JFrame, c est assez instinctif). Ainsi, l implémentation de la G.U.I.prendra, pour la plupart du temps, plus de temps que l algorithme à faire fonctionner au travers de celle-ci. Au final, ces 2 problèmes ont été pour moi assez légers mais j ai dû composer avec, comme tout le monde, de manière à ce que le programme soit optimisé. 8