MongoDB, base NoSQL fonctionne avec un format de données orienté JSON. Sa configuration et son usage sont très simple, d'autant plus en utilisant la sur-couche mongo-Jack et MonjaDB sous eclipse.
MongoDB, base NoSQL fonctionne avec un format de données orienté JSON. Sa configuration et son usage sont très simple, d'autant plus en utilisant la sur-couche mongo-Jack et MonjaDB sous eclipse.
Installation de MongoDB sous Linux :
Import Maven :
Driver MongoDB :
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.11.1</version>
</dependency>
Mongo Jack :
<dependency>
<groupId>org.mongojack</groupId>
<artifactId>mongojack</artifactId>
<version>2.0.0-RC5</version>
</dependency>
Créer le DAO :
On peut remarquer dans le code ci-dessous :
Une fois la connexion créé, il peut gérer de deux façon différentes les collections d'objets :
DBCollection : Objet qui gère uniquement des DBObject. On accède à ses éléments par : DBObject.get(KEY)
JacksonDBCollection : Objet qui gère permet de manipuler des POJO. Voir exemple de Pojo plus bas.
On peut gérer des index et de l'unicité avec la déclaration suivante :
(Ici on créé un index sur l'email de l'utilisateur, qui doit être unique)
userCollectionJackson.ensureIndex(new BasicDBObject("email", "1"), new BasicDBObject("unique","true"));
L'objet GridFS, permet lui de stocker des fichiers :
GridFS gfsPhoto = new GridFS(database, "photo");
public class DAO
{
private static final DAO instance = new DAO();
private static MongoClient mongo;
private static DB database;
// Users
// Collection Mongo
private static DBCollection userCollection;
// Collection Jackson
private static JacksonDBCollection<User, String> userCollectionJackson;
// Plantes
// Collection Mongo
private static DBCollection planteCollection;
// Collection Jackson
private static JacksonDBCollection<Plante, String> planteCollectionJackson;
// Photos
private static GridFS gfsPhoto;
// Constructeur qui lance la connexion à la base
private DAO()
{
// On lance la connexion
try
{
mongo = new MongoClient("127.0.0.1", 27017);
}
catch (UnknownHostException e)
{
e.printStackTrace();
}
database = mongo.getDB("plantecite");
userCollection = database.getCollection("user");
userCollectionJackson = JacksonDBCollection.wrap(userCollection, User.class, String.class);
userCollectionJackson.ensureIndex(new BasicDBObject("email", "1"), new BasicDBObject("unique","true"));
planteCollection = database.getCollection("plante");
planteCollectionJackson = JacksonDBCollection.wrap(planteCollection, Plante.class, String.class);
planteCollectionJackson.ensureIndex(new BasicDBObject("nom_latin", "1"), newBasicDBObject("unique", "true"));
planteCollectionJackson.ensureIndex(new BasicDBObject("random", "2d"));
gfsPhoto = new GridFS(database, "photo");
}
// On ajout un utilisateur à la base
public static void insertUser(User user)
{
// Si il existe alors on envoi une exception
if(userCollectionJackson.findOne(DBQuery.is("email", user.getEmail()))!=null)
{
throw new ConflictException("Doublon");
}
List<String> roles = new ArrayList<String>();
roles.add("webapp-user");
user.setRoles(roles);
userCollectionJackson.insert(user);
}
// On insère une photo dans la base
public static void addPhoto(File file)
{
try
{
GridFSInputFile gfsFile = gfsPhoto.createFile(file);
gfsFile.save();
}
catch(IOException e)
{
e.printStackTrace();
}
}
// On récupère la photo d'une plante à partir du nom de sa photo
public static InputStream getPhoto(String fileName)
{
GridFSDBFile imageForOutput = gfsPhoto.findOne(fileName);
return imageForOutput.getInputStream();
}
// On récupère toutes les plantes de la base
public static List<Plante> getAllPlante()
{
return planteCollectionJackson.find().toArray();
}
// On insère ou met à jour une plante
public static void upsertPlante(Plante plante)
{
Plante planteOld = planteCollectionJackson.findOne(DBQuery.is("nom_latin", plante.getNom_latin()));
// Si elle existe alors on est en update
if(planteOld != null)
{
planteCollectionJackson.updateById(planteOld.getId(), plante);
}
else
{
double[] random = {Math.random(), 0.0};
plante.setRandom(random);
planteCollectionJackson.insert(plante);
}
}
// On insère une plante
public static void insertPlante(Plante plante)
{
// Si il existe alors on envoi une exception
if(planteCollectionJackson.findOne(DBQuery.is("nom_latin", plante.getNom_latin()))!=null)
{
throw new ConflictException("Doublon");
}
planteCollectionJackson.insert(plante);
}
// On met à jour une plante
public static void updatePlante(Plante plante)
{
planteCollectionJackson.updateById(plante.getId(), plante);
}
// On modifie un plante pour lui associer une url de photo
public static void setPhotoPlante(Plante plante, String url_photo)
{
plante.setUrl_photo(url_photo);
updatePlante(plante);
}
// On supprime une plante
public static void deletePlante(Plante plante)
{
try
{
planteCollectionJackson.removeById(plante.getId());
}
catch (NullPointerException e)
{
System.out.println("Delete : " + plante.getNom_latin() + " n'existe pas");
}
}
// On récupère une plante à partir de son id
public static Plante getPlanteById(String id)
{
return planteCollectionJackson.findOneById(id);
}
// On récupère une plante à partir du champ "nom latin"
public static Plante getPlanteByNomLatin(String nom_latin)
{
return planteCollectionJackson.findOne(DBQuery.regex("nom_latin", Pattern.compile(nom_latin, Pattern.CASE_INSENSITIVE)));
}
// On rècupère nbPlantes de la base de facon aléatoire
public static List<Plante> getRandomPlante(int nbPlantes)
{
return planteCollectionJackson.find((DBObject)JSON.parse("{url_photo:{$ne:null}, random : { $near : [" + Math.random() + ", 0] } }")).limit( nbPlantes ).toArray();
}
}
POJO Plante :
public class User implements Serializable
{
private static final long serialVersionUID = 8685607534046299572L;
@Id
@ObjectId
private String id;
private String email;
private String passwordhash;
private List<String> roles;
public User() {
super();
}
public User(String id) {
super();
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPasswordhash() {
return passwordhash;
}
public void setPasswordhash(String passwordhash) {
this.passwordhash = passwordhash;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
}
MonjaDB :
MonjaDB est un plugin d'Eclipse qui permet de se connecter à une base MongoDB, de la consulter, modifier, requêter.
Connexion à la base :
Pour un usage local la config de base est suffisante. On peut configurer des connexions à distance en SSH (Pour nos serveurs d'intégration par exemple)
Exemple de requête :
db.plante.count({famille : 'Araceae'})
Cette requête permet de compter le nombre de lignes dont la famille est 'Araceae'
Je vous invite à consulter la documentation pour connaître les différentes façon de requêter la base (qui n'a donc rien à voir avec du SQL!)
http://docs.mongodb.org/manual/reference/method/
Interface de MonjaDB :