Utilisation d`un ORM

publicité
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
programme objet & stockage relationnel
Fabien Coelho
MINES ParisTech
[email protected]
Composé avec LATEX
ORM – Object-Relational Mapping
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
2
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
ORM - opérations
Concepts : objets vs relations
(S)CRUD (Search) Create, Read, Update, Delete
— données + fonctions
— données + contraintes
— programmation
— déclaration
— langage procédural
— algèbre relationnelle
— typage fort, statique/dynamique
— typage fort
— classe, encapsulation
— relation, tuples à plat (struct ?)
code ORM très similaire, très répétitif, très spécifique
. . . mais pas les mêmes types
Génération automatique de code : portabilité
Java JPA, Hibernate, iBATIS, MyBatis
scalaire et relations. . .
listes, ensembles, tableaux
— référence/pointeurs
— associations
3 stratégies
— héritage
— héritage possible (modèle OR)
1. Relationnel vers objet
— levée d’exceptions, à l’exécution
— contraintes d’intégrité déclarées
2. Objet vers relationnel
— modifications locales
— transactions globales
3. Description vers relationnel et objet
Scala Squeryl, SORM, (Anorm)
Python Django, SQLAlchemy
Ruby Active Records, RBATIS
.NET NHibernate, iBATIS
ORM – Object-Relational Mapping
3
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
4
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
Approche
— séparation code application / lien base de donnée
MyBatis – SQL Mapping Framework for Java
couche d’abstraction qui cache JDBC et SQL
— basé sur Apache iBATIS, fork en 2010
— philosophie base POJO : Plain Old Java Object
http://mybatis.org
il existe aussi une version .Net
vs objects contraints (héritage, méthode)
— fichiers XML pour l’environnement et les mappings
— déclaration via XML ou annotations. . .
génération code Java & SQL, ou introspection. . .
contrôle complet des requêtes (appels de procédures. . .)
efficacité SQL ? en général, non :
support SQL dynamique : variantes de requêtes
éventuellement spécifié avec des annotations
pourquoi une requête avec 100 résultats si je peux faire 100 requêtes ?
— utilisation par un runtime
— services : connexion, cache (policies), pooling, prefetch. . .
lecture fichiers XML
persistence automatique ou à la demande
configuration connexion et définition des tables/objets
— appel explicite des requêtes
ORM – Object-Relational Mapping
Fabien Coelho
5
JAVA : ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
6
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
MyBatis – fichier XML
<sqlMap namespace="StudentMapper">
<!-- correspondance des attributs -->
<resultMap id="studentResult" class="Student">
<result property="id" column="pk"/>
<result property="name" column="nom"/>
</resultMap>
<select id="allStudents" resultMap="studentResult">
SELECT * FROM Student
</select>
<select id="studentById" parameterClass="int" resultClass="Student">
SELECT ... FROM Student WHERE pk = #{id}
</select>
<insert id="insertStudent" parameterClass="Student">
INSERT INTO Student(pk,nom) VALUES(#{id}, #{name});
</insert>
<update id="updateStudent" parameterClass="Student">
UPDATE Student SET nom=#name# WHERE pk=#{id}
</update>
<delete id="deleteStudent" parameterClass="int">
DELETE FROM Student WHERE pk=#{id}
</delete>
</sqlMap>
doc MyBatis
ORM – Object-Relational Mapping
7
ORM – Object-Relational Mapping
8
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
MyBatis – Java annoté
— plutôt pour des requêtes assez simples
MyBatis – code Java
public interface StudentMapper
{
@Select("SELECT * FROM Student WHERE pk=#{id}")
Student selectStudent(int id);
SqlSession session = ...("student.xml");
StudentMapper sm = session.getMapper(StudentMapper.class);
List<Student> ls = sm.allStudents();
Student s = sm.studentById(12);
s.setNom("Calvin");
sm.updateStudent(s);
session.close();
@Insert("INSERT INTO Student(pk,nom) VALUES(#{id},#{name})")
@Options(useCache=true,flushCache=true,keyProperty="pk")
void insertStudent(Student s);
// etc.
}
ORM – Object-Relational Mapping
9
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
10
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
MyBatis Generator
JPA – Java Persistence API
— dérivation des classes et requêtes
— Standard Java 5.0, package javax.persistence
à partir du schéma de la base de données
— utilise des annotations Java. . .
— DAO – Data Access Object par table
— implémentations OpenJDA (Apache), Hibernate (Red Hat)
— éventuellement, construction d’objets au dessus
requêtes plus complexes impliquant des jointures. . .
Ne jamais modifier du code généré automatiquement !
ORM – Object-Relational Mapping
11
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
12
Fabien Coelho
JAVA : ORM – Object-Relational Mapping
Comparaison rapide
MyBatis simple, souple, SQL donc spécifique, contrôle
Red Hat – Hibernate
Hibernate standard, complet, rigide, portable mais HQL, communauté
— similaire à MyBatis, mais SQL plutôt généré. . .
possibilité de ré-écrire les requêtes trop inefficaces
— est un JPA provider
— intégré à JBoss – implémentation J2EE Red Hat
ORM – Object-Relational Mapping
13
Fabien Coelho
ORM – Object-Relational Mapping
JAVA : ORM – Object-Relational Mapping
List of Slides
Philosophies
Domaine application OO, DB simple stockage
Titre
2
OO > DB
ORM – Object-Relational Mapping
ORM – Object-Relational Mapping
— une seule application
— données non partagées entre applications
3
Concepts : objets vs relations
— intégrité assurée par l’application
4
ORM - opérations
— MySQL, Hibernate
4
Génération automatique de code : portabilité
5
Approche
— applications multiples
6
MyBatis – SQL Mapping Framework for Java
— données partagées
8
MyBatis – fichier XML
— intégrité assurée par la DB
9
Base de données a les données, utilisée en OO
DB > OO
— PostgreSQL, MyBatis
ORM – Object-Relational Mapping
15
MyBatis – Java annoté
10
MyBatis – code Java
11
MyBatis Generator
12
JPA – Java Persistence API
14
13
Red Hat – Hibernate
14
Comparaison rapide
15
Philosophies
Téléchargement