Optimiser l`accès à une base de données d`enquêtes :: Utilisation de

publicité
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
Téléchargement