Spring data avec Couchbase

Introduction

Dans ce second billet, nous allons regarder comment accéder et gérer nos données enregistrées dans la base de données Couchbase dans une application JAVA.

Couchbase_logo

Couchbase et JAVA

En JAVA, si on souhaite accéder à nos données sous Couchbase, plusieurs solutions existent dont:

Mon choix

Ayant plus une expertise avec une stack Spring, je me suis penché de suite sur le module dédié à Couchbase de spring data. Nous allons donc voir comment utiliser de manière simple les données Couchbase à l'aide de spring data couchbase.

Hello World avec spring data couchbase

Mise en place du projet Maven

Pour démarrer le projet spring,  rien de plus simple avec spring boot que de mettre le starter et la dépendance à Couchbase:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>fr.cavezzan.demo</groupId>
    <artifactId>springdatacouchbase-helloworld</artifactId>
    <version>0.0.1</version>
    <packaging>jar</packaging>

    <name>springdatacouchbase-helloworld</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-couchbase</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

A partir de là, vous êtes aptes à interagir avec votre base de données Couchbase au sein d'une application Spring 🙂

Configuration Couchbase

Grâce à SpringBoot, l'intégration de couchbase se résume à 2 configurations manuelles.

Configuration de notre datasource

On configure les accès à l'instance couchbase au sein du fichier de configuration standard springboot, application.properties :

couchbase.cluster.ip=localhost
couchbase.cluster.bucket=default
couchbase.cluster.password=password

Activation de la datasource Couchbase au sein de Spring

On active notre source de données Couchbase à l'aide d'une classe de configuration JAVA dédiée:

@EnableCouchbaseRepositories
@Configuration
public class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {

	@Value("${couchbase.cluster.bucket}")
	private String bucketName;

	@Value("${couchbase.cluster.password}")
	private String password;

	@Value("${couchbase.cluster.ip}")
	private String ip;

	@Override
	protected List<String> bootstrapHosts() {
		return Arrays.asList(this.ip);
	}

	@Override
	protected String getBucketName() {
		return this.bucketName;
	}

	@Override
	protected String getBucketPassword() {
		return this.password;
	}
}
Configuration JAVA dédiée à Couchbase

Partie Accès aux données - Mapping donnée/objet

Pour interagir avec la base, il nous faut créer une classe capable d'enregistrer les données en mémoire. Appelons-la Person:

@Document
public class Person {
	@Id
	private String id;
	@Field
	private String username;
	@Field
	private String lname;
	@Field
	private String fname;

        @Override 
        public String toString() { 
           return "Person [id=" + id + ",username=" + username + ", lname=" + lname + ", fname=" + fname + "]"; 
        }
Classe Person.java

Ce qui est important de retenir ici, ce sont les annotations:

  • @Document (org.springframework.data.couchbase.core.mapping.Document): décrit qu'une classe représente un document Couchbase;
  • @Id (org.springframework.data.annotation.Id): indique que le champs est l'identifiant du document;
  • @Field(org.springframework.data.couchbase.core.mapping.Field): indique qu'un champs est un champ du document Couchbase;

A partir de là, on a branché couchbase à spring data. Le reste du code est du standard, spring data, avec la déclaration de notre repository où sont stockés nos objets:

public interface PersonRepository extends CouchbaseRepository<Person, String> {
}
Le repository PersonRepository.java

Et c'est parti pour du code métier

Exemple 1 - Afficher "Hello World"

Le 1er exemple est basique: on souhaite afficher la donnée "Hello World" que nous avons enregistré dans mon précédent billet. Pour cela, on va récupérer cette donnée à l'aide de son identifiant que l'on connait:

final Person p = repo.findOne("person::helloworld"); 
System.out.println(p);

Le repo a bien entendu été injecté 😉

Exemple 2 - Enregistrer une nouvelle personne

Ce second exemple montre la facilité avec laquelle on peut enregistrer un nouveau document grâce à l'API spring data au sein de Couchbase.

final Person p = new Person();
p.setFname("MyFirstName");
p.setLname("MyLastName");
p.setUsername("myusername");
p.setId("person::myusername");
repo.save(p);
Exemple 3 - Supprimer une personne
final Person p = repo.findOne("person::myusername");
repo.delete(p);

Conclusion

On a vu que Couchbase est totalement intégré à l'écosystème Spring à l'aide du module spring data couchbase. L'abstraction de ce module nous permet d'interagir très facilement avec cette base de données.

En revanche, dès qu'on commence à vouloir réaliser des trucs un petit peu plus sophistiqués (association d'objets, relation 1-N/N-N), on arrive un peu à la limite actuelle de ce module car spring data couchbase ne gère que les documents imbriquées et non liées.

 Néanmoins, les relations entre objets sont largement gérables dans le code.

Cela reste donc un axe d'amélioration de ce module qui n'enlève en rien son intérêt au vue de sa simplicité de mise en œuvre.

Retrouvez l'intégralité du projet sur mon github.

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.