Optimiser l'accès à une base de données d'enquêtes :: Utilisation de l'ORM Hibernate Florian Guéniot Journées techniques 2015 - Avignon 2 Problématique ¡ Les enquêtes génèrent des données hétérogènes dans des formats différents : ¡ Texte simple (fichiers Word) ¡ Tableurs (Excel) ¡ Enregistrements audio ¡ Trouver un solution simple et élégante pour peupler une base de donnée existante ¡ Quels outils avons nous à disposition pour remplir manuellement nos bases de données ? ¡ SGBD (PGAdmin, PHPMyAdmin, …) ¡ SIG (QGIS, ArcGIS) ¡ Comment automatiser la saisie ? Journées techniques CATI ACTION - 17 avril 2015 3 Plan ¡ La programmation orientée objet ¡ Le langage Java ¡ Un ORM c'est quoi ? ¡ Hibernate, un ORM en Java ¡ Petite démo (avec plein de code partout) Journées techniques CATI ACTION - 17 avril 2015 4 Programmation orientée objets ¡ Un objet : ¡ C’est un concept, une idée ou une entité. ¡ Un outil de modélisation du monde réel ¡ Il possède : ¡ Des attributs (ou propriétés) : ses traits de caractère ¡ Des méthodes : les actions qu’il peut effectuer, son comportement ¡ Pourquoi c'est bien la POO ? ¡ Avoir des entités bien séparées ¡ "Diviser pour mieux régner" ¡ Le représenter avec des diagramme de classe (UML) ¡ Les objets peuvent interagir entre eux via des messages Journées techniques CATI ACTION - 17 avril 2015 Voiture Personne Couleur Marque modèle nom prénom voiture Rouler() Freiner() Conduire(voiture) 5 Programmation orientée objet Véhicule ¡ L’héritage ¡ Une classe fille est une classe qui hérite des attributs et des méthodes de sa classe mère ¡ Ex. La classe Moto possède les mêmes attributs qu’une classe Véhicule (poids, puissance, modèle) mais possède des attributs propres (seulement 2 roues, kick de démarrage, …) ¡ Lors du codage de la classe Moto, il donc inutile de coder toutes les Voiture propriétés de la classe Véhicule dont il hérite NbRoues=4 Journées techniques CATI ACTION - 17 avril 2015 Couleur Marque Modèle Rouler() Freiner() Moto BoiteDeVitesse Volant NbRoues=2 BoiteDeVitesse Guidon Démarrer() changerRapport() Démarrer() changerRapport() 6 Véhicule Couleur Marque Modèle Rouler() Freiner() Voiture Moto NbRoues=4 BoiteDeVitesse Volant NbRoues=2 BoiteDeVitesse Guidon Démarrer() changerRapport() Démarrer() changerRapport() Journées techniques CATI ACTION - 17 avril 2015 7 POO : Le langage Java Journées techniques CATI ACTION - 17 avril 2015 8 POO : le langage Java ¡ Pourquoi Java ? ¡ Java est un langage purement orienté-objet ¡ Développé par Sun, puis racheté par Oracle ¡ La syntaxe proche du C++, mais sans les pointeurs et l’héritage multiple ¡ Java permet de faire des applications multi-plateformes. L’application compilée en bytecode permet de tourner sur plusieurs plateformes (Windows, Linux, MacOS, …) ¡ C’est le langage le plus utilisé sur la plateforme mobile Android ¡ Mais on aurait pu choisir un autre langage : Python, C++, PHP, C#, Objective-C, … Journées techniques CATI ACTION - 17 avril 2015 9 POO : le langage Java public class Vehicule // Les public public public { propriétés Color couleur; String marque; String modele; //Le constructeur public Vehicule(String marque, String modele){ this.marque = marque; this.modele = modele; } //Les méthodes public void rouler(){ //... } } public void freiner(){ //... } Journées techniques CATI ACTION - 17 avril 2015 Ecriture de la classe Véhicule en Java composé de : • 3 propriétés (attributs) • 1 constructeur : méthode qui se charge d’initialiser un objet • 2 méthodes (fonctions) Véhicule Couleur Marque Modèle Rouler() Freiner() 10 POO : le langage Java ¡ Le processus de création d’un objet est l’instanciation. C’est le fait d’appeler le constructeur d’une classe pour générer une instance de cette classe. ¡ Ex : ¡ Vehicule Clio = new Vehicule("Renault", "Clio"); ¡ Vehicule 207 = new Vehicule("Peugeot", "207"); Classe Vehicule instanciation Objet Clio Journées techniques CATI ACTION - 17 avril 2015 Objet 207 11 POO : le langage Java ¡ L’héritage en Java est appelé avec le mot-clé extends. ¡ On appelle les propriétés et les méthodes de la classe mère à l’aide de super. Véhicule Couleur Marque Modèle Rouler() Freiner() public class Moto extends Vehicule{ // Constructeur public Moto(...){ super(); super.marque = "Suzuki"; } } Journées techniques CATI ACTION - 17 avril 2015 Moto NbRoues=2 BoiteDeVitesse Démarrer() changerRapport() 12 POO : le langage Java ¡ Les getters et les setters sont des fonctions permettant d’accéder et de modifier des attributs privées // Définition de l’attribut age private int age; //Getter public int getAge(){ return this.age; } //Setter public void setAge(int age){ this.age = age; } Journées techniques CATI ACTION - 17 avril 2015 13 ORM Object Relational Mapping Journées techniques CATI ACTION - 17 avril 2015 14 L’héritage dans une base de donnée ¡ L’héritage est un notion couramment utilisée en POO. ¡ Cependant, les SGBD classiques ne gèrent pas l’héritage (sauf PostGreSQL) ¡ Une astuce consiste à mettre la clé primaire sur l’identifiant unique de la table mère et une clé étrangère sur l’identifiant unique de la classe fille Clé primaire vehicule moto id Couleur Marque modele #id nbRoues boiteDeVitesse Journées techniques CATI ACTION - 17 avril 2015 Clé étrangère 15 ORM ¡ ORM : Object Relational Mapping ou mise en correspondance relationnel objet. Permet de créer et manipuler une base de donnée objet à partir d’une base de donnée relationnelle ¡ Quelques bases de données relationnelles : MySQL, PostgreSQL, Oracle, MariaDB, MS Access, … Personne id nom prenom age Table SQL Personne id nom prenom age personne() getId() setId(int id) ….. Objet Journées techniques CATI ACTION - 17 avril 2015 16 Un ORM : Hibernate Journées techniques CATI ACTION - 17 avril 2015 17 Hibernate ¡ Hibernate est un ORM Java open source ¡ C’est un Framework qui gère la persistance des objets dans une base de données relationnelle ¡ Hibernate est une composante de Java Persistant API (JPA) Journées techniques CATI ACTION - 17 avril 2015 18 Hibernate : configuration ¡ Le fichier hibernate.cfg.xml gère le lien vers la base de données <hibernate-configuration> <session-factory> <property name="hibernate.dialect"> org.hibernate.dialect.PostgreSQLDialect </property> <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.connection.password">postgres</property> <property name="hibernate.connection.url"> jdbc:postgresql://localhost:5432/MaDataBase </property> <property name="connection_pool_size">1</property> <property name="show_sql">true</property> <mapping class="Vehicule"/> <mapping class="Moto"/> </session-factory> Journées techniques CATI ACTION - 17 avril 2015 </hibernate-configuration> 19 Hibernate ¡ Ecriture des classes Java liées à une table de la base de données : exemple de la classe Vehicule. @Entity @Table(name="vehicule") public class Vehicule{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="id") public int id; @Column(name="couleur") private Color couleur; @Column(name="marque") private String marque; @Column(name="modele") private String modele; //Constructeur par défaut public Vehicule () {} Journées techniques CATI ACTION - 17 avril 2015 } //Constructeur d'initialisation public Vehicule(Color couleur, String marque, String modele){ this.couleur = couleur; this.marque = marque; this.modele = modele; } 20 Hibernate : l’héritage ¡ La gestion de l’héritage se fait simplement avec Hibernate en rajoutant le tag @Inheritance dans la classe mère : //Classe mère : Vehicule @Entity @Table(name="vehicule") @Inheritance(strategy=InheritanceType.JOINED) public class Vehicule{ } //Classe fille : Moto @Entity @Table(name="moto") public class Moto extends Vehicule{ Journées techniques CATI ACTION - 17 avril 2015 } 21 Hibernate : jointures ¡ La relation de n à 1 (many to one) est faite avec le tag @ManyToOne ¡ Exemple : une personne possède une ou plusieurs moto qui n’appartiennent qu’à lui (version capitaliste) Personne Moto Id Nom Prenom Moto_id Id …. @ManyToOne @JoinColumn(name="moto_id") private Moto moto; Journées techniques CATI ACTION - 17 avril 2015 22 Hibernate : jointures ¡ La relation de n à n (many to many) est faite avec le tag @ManyToMany ¡ Exemple : une personne possède une ou plusieurs moto et une moto possède un ou plusieurs propriétaire (version communiste) Personne PersonneMoto Moto Id Nom Prenom Moto_id Personne_id Id …. @ManyToMany(cascade = CascadeType.ALL) @JoinTable( name="personnemoto", joinColumns= @JoinColumn(name="moto_id"), inverseJoinColumns=@JoinColumn(name="personne_id") ) private Collection <Moto> motos; Journées techniques CATI ACTION - 17 avril 2015 23 Hibernate : Update / Insert ¡ La manipulation des objets s’effectue facilement et de manière transparente (presque) sans requêtes SQL ¡ Ajout ou modification d’un enregistrement en utilisant la fonction saveOrUpdate(). Si l'objet existe déjà, il est juste mis à jour. C'est l'équivalent de la requête UPDATE ou INSERT. ¡ Exemple : ajout du véhicule Clio //Création d’un objet véhicule Vehicule clio = new Vehicule("Renault", "Clio"); //Ajout de l'objet dans la BDD Transaction tx = session.beginTransaction(); session.saveOrUpdate(clio); tx.commit(); Journées techniques CATI ACTION - 17 avril 2015 24 Hibernate : Select ¡ La sélection d'un objet s'effectue avec la fonction get(Class classe, int id). ¡ Exemple : sélection de l'enregistrement de la table Vehicule dont l'id = 1. C'est l'équivalent de la requête SQL SELECT. Transaction tx = session.beginTransction(); Vehicule clio = (Vehicule)session.get(Vehicule.class, 1); tx.commit(); Journées techniques CATI ACTION - 17 avril 2015 25 Hibernate : Delete ¡ Suppression d’un enregistrement en utilisant la fonction delete(). C'est l'équivalent de la requête SQL DELETE. ¡ Exemple : suppression du véhicule Clio Transaction tx = session.beginTransction(); //Récupération de l'objet voulu Vehicule clio = (Vehicule)session.get(Vehicule.class, 1); tx.commit(); //Suppression de l'objet de la BDD session.delete(clio); tx.commit(); Journées techniques CATI ACTION - 17 avril 2015 26 Hibernate : requêtes ¡ Il est tout de même possible de faire des requêtes SQL pour des cas particuliers, comme pour la sélection avec critères. ¡ Hibernate propose la fonction createQuery(String requete) ¡ Exemple : sélection du véhicule dont le nom est Clio Transaction tx = session.beginTransction(); Query q = session.createQuery("SELECT id FROM vehicule WHERE nom = 'Clio'"); List liste = q.list(); Vehicule clio = (Vehicule)session.get(Vehicule.class, liste.get(0)); tx.commit(); Journées techniques CATI ACTION - 17 avril 2015