Escolar Documentos
Profissional Documentos
Cultura Documentos
db
Mohamed ELADNANI
Spécificités de db4o
Léger
Pas de maintenance / administration
Simple d’emploi
API simple pour Java et .NET
Requêtes natives
Pas un SGBDOO ODMG, pas de requêtes OQL par
exemple
l
Convient bien à une application embarquée (BD pas
partagée
t é entret plusieurs
l i applications)
li ti )
Exemple basique
ObjectContainer bd = Db4o.openFile("bd.data");
Personne personne =
new Personne("Dupond", "Pierre", 35);
// Aj
Ajoute
t dans
d la
l base
b de
d ddonnées
é
bd.store(personne);
bd commit();
bd.commit();
// Passe un exemple de ce qui est cherché
ObjectSet<Personne> personnes =
bd.queryByExample(new Personne(null, null, 40));
for (Personne p : personnes) {
S t
System.out.println(p);
t i tl ( ) }
}
bd close()
bd.cl
Paquetages
Tous les paquetages sont des sous paquetages de
com.db4o
L paquetage
Le t com.db4o
db4 contient
ti t les
l interfaces
i t f ett
classes de base :
ObjectContainer, ObjectSet,
ObjectContainer ObjectSet
ObjectServer, Db4o (la seule classe)
Connexion à une BD db4o
La classe Db4o contient des méthodes static pour
démarrer un moteur db4o
2 façons
f de
d se connecter
t :
en local, à une BD qui se trouve sur la même machine
<T> ObjectSet<T>
queryByExample (Object modele)
throws Db4oIOException,
DatabaseClosedException
queryByExample(null) renvoie tous les objets de la
BD
queryByExample(modele)
B E l ( d l ) renvoie i tous les
l objets
bj d
de
la BD qui correspondent à l’objet passé en paramètre
(recherche par l’exemple)
l exemple)
Méthode query
Méthode surchargée
<T> ObjectSet<T> query(Class<T> classe) récupère
t
tous lles objets
bj t de
d la
l BD dud type
t de
d la
l classe
l passée
é
en paramètre
<T> ObjectSet<T>
query(Predicate<T> prédicat) permet une requête
native ; renvoie les objets qui correspondent au prédicat
Un deuxième paramètre de type Comparator<T>
permet d’indiquer
d indiquer un ordre dans les objets renvoyés
ObjectSet Item
ObjectSet<Item>
try {
// travail avec db4o
...
container.commit();();
}
catch (Exception ex){ .... }
finally {
container close();
container.close();
}
Exemple avec rollback
try {
// travail avec db4o
...
container.commit();
}
catch (Exception ex){
container.rollback();
...
}
finally { container.close(); }
Méthodes de ExtObjectContainer
j
boolean isClosed()
boolean isStored(Object)
void refresh(Object, int profondeur) ramène les
valeurs qui sont actuellement dans la BD jusqu’à une
BD jusqu
BD, jusqu’à
à certaine profondeur
void store(Object, profondeur) pour ajouter ou
modifier un objet dans le cache de l’objectContainer
l objectContainer en
indiquant la profondeur de modification
Méthodes de ExtObjectContainer
j
Identité interne
long getId(objet) retourne l’identité «
interne » (physique)
d’ objet
d’un bj t géré
é é par l’ObjectContainer
l’Obj tC t i ; garantie
ti
d’unicité dans un seul ObjectContainer ( mais change
si la base est défragmentée)
<T> T getById(long) accès le plus rapide à un objet dont
on co
o connaît
a l’id
d ; n’active
ac e pas l’objet
obje (ga
(garde
de le
e niveau
eau
d’accès qu’il a déjà dans le cache local géré par
l’objectContainer)
Méthodes de ExtObjectContainer
j
Identité logique
ObjectInfo getObjectInfo(objet) pour avoir la
référence à un objet géré par l’ObjectContainer
La méthode Db4oUUID getUUID() de l’interface
Obj tI f retourne
ObjectInfo t l’UUID de
d l’objet
l’ bj t (garantie
( ti
d’unicité dans toutes les bases de données db4o)
<T> T getByUUID(Db4oUUID)
La génération d’UUID doit être configurée (méthode
generateUUID de ll’interface
interface Configuration)
Recherche p
par l’exemple
p
( Query By Example QBE)
L’objet passé en paramètre de
queryByExample indique les objets
recherchés
Ses variables d’instances qui n’ont pas la
valeur null (ou la valeur par défaut si la
variable est d’un des types primitifs Java)
forment le critère de recherche
Exemple
p
ObjectSet<Facture> factures = bd.queryByExample(new Facture("08/54", null,
null))
Avantage: simple
I
Inconvénients:
é i t
Pas possible de faire une recherche des objets qui ont la valeur par
y
défaut des types primitifs
Des conditions ne sont pas exprimables (pas d’autres comparaison que
l’égalité par exemple)
Un constructeur qui accepte les valeurs null doit exister
Impossible de faire une recherche polymorphe sous une classe abstraite
ou une interface (car pas possible de construire l’objet exemple)
Activation d’un objet
j
Predicate<Personne> predicat =
new Predicate<Personne>() {
public boolean match(Personne p) {
return p.getAge() > 60;
}
};
List<Personne> personnes =
db.query(predicat);
Tri du résultat de la recherche
config.objectClass("UneClasse")
.cascadeOnActivate(true);
( );
config.objectClass("UneClasse")
.objectField("champ")
bj tFi ld(" h ")
.cascadeOnActivate(true);
( )
Profondeur de modification
Refactoring automatique:
db4o sait p
prendre en charge
g les modifications
suivantes :
ajouter
j une interface à une classe
supprimer un champ dans une classe
ajouter
j un champ p
changer le type d’un champ
renommer un champ p
renommer une classe
Supprimer/ajouter
pp j un champ
p
Manque de fonctionnalités :
Le code de l’application doit prendre en charge des
f
fonctionnalités
ti lité quii sontt remplies
li par lles SGBDR :
pas de contraintes de clé primaire et de référence –
ll’application
application doit faire attention à ne pas dupliquer les
objets
pas de blocage des objets de la BD – ll’application
application doit
créer des sections critiques
Optimisation
p des requêtes
q natives
2 solutions p
possibles ((à tester sur chaque
q classe
particulière) :
avant la lecture dans la base de données, indiquer à