Ejemplo de MongoClient con Spring Boot
Spring Boot nos ofrece tres formas de operar con una base de datos MongoDB:
- MongoRepository es la de más alto nivel. Puedes ver cómo utilizarlo en Ejemplo de MongoRepository con Spring Boot
- MongoTemplate es la de nivel intermedio. Puedes ver cómo utilizarlo en Ejemplo de MongoTemplate con Spring Boot
- MongoClient es la de nivel más bajo. De hecho, es la misma clase que usaríamos en un proyecto Java normal, sin Spring Boot. Es lo que veremos en este tutorial.
En este tutorial nos vamos a centrar sobre todo en como obtener la instancia de MongoClient en nuestras clases de Spring Boot. Realizaremos sólo algunas de las operaciones CRUD (Create Read Update Delete) a modo de ejemplo. En Conectar Java con MongoDB - Ejemplo CRUD tienes un tutorial más completo sobre todas las posibles operaciones que se pueden realizar con MongoClient.
El proyecto completo con Maven, Spring Boot y MongoDB para este ejemplo lo tienes en github spring-boot-mongodb y en concreto, la clase BeanWithMongoClient.java es la que utiliza MongoClient.
Para ejecutar el ejemplo necesitarás tener instalado MongoDB en localhost, con el puerto por defecto 27017 y sin autentificación de usuarios. Si tienes MongoDB instalado de otra manera, puedes tocar el fichero src/main/resources/application.properties del proyecto para poner tus parámetros de conexión.
Inyección de MongoClient en Spring Boot[editar]
Spring Boot crea una instancia de MongoClient con conexión al servidor MongoDB por defecto que hemos comentado, o si están definidas, de acuerdo a las propiedades del fichero application.properties. Nuestro primer paso es hacer que Spring Boot inyecte esta instancia de MongoClient en las clases Java que necesitemos. Es decir, necesitamos algo como lo del siguiente código
@Component
public class BeanWithMongoClient {
/** MongoClient lo inyecta Spring Boot */
@Autowired
MongoClient mongoClient;
/**
* Comenzamos a hacer alguna operación CRUD con MongoDB cuando el contexto esté inicializado
* Lo hacemos en un método @PostConstruct para que comience el ejemplo de forma automatica,
* sin necesidad de crear una interface de usuario o web services a los que haya que invocar para
* provocar la ejecución del ejemplo.
* No hacemos todas las operaciones CRUD. Si quieres más detalles puedes consultar
* https://chuidiang.org/index.php?title=Conectar_Java_con_MongoDB_-_Ejemplo_CRUD
*/
@PostConstruct
public void doSomeCRUDOperations(){
...
}
...
}
Hemos creado una clase BeanWithMongoClient para poner el código de nuestro ejemplo. La hemos anotado con @Component para que sea Spring Boot el encargado de instanciarla, se entere que existe y le inyecte las dependencias que necesite. En la clase hemos puesto un atributo MongoClient con la anotación @Autowired. Esto le indica a Spring Boot que queremos que nos inyecte ahí la instancia de MongoClient.
Adicionalmente, hemos añadido un método anotado con @PostConstruct. Esto hará que Spring Boot lo invoque después de que nuestra clase se haya instanciado y Spring Boot le haya inyectado las dependencias, MongoClient en nuestro caso. Es decir, el método se ejecuta automáticamente sin que tengamos que llamarlo explícitamente y lo hará con la garantía de que MongoClient ya está disponible para ser usado.
Ejemplos de operaciones CRUD de MongoClient en Spring Boot[editar]
Como hemos comentado, no vamos a dar aquí todos las operaciones CRUD detalladas, solo algunos ejemplos para ver que funciona correctamente.
En el enlace Conectar Java con MongoDB - Ejemplo CRUD tienes detalles de las operaciones CRUD Con MongoClient en MongoDB
Crear u obtener la base de datos con MongoClient y Spring Boot[editar]
Como hemos comentado, MongoClient está ya conectado a un servidor de MongoDB. El primer paso es obtener o crear una base de datos MongoDB dentro de este servidor. La llamada getDataBase() obtiene y, si no existe, crea la base de datos.
// Conexión con una base de datos de MongoDB
MongoDatabase database = mongoClient.getDatabase("chuidiang-test-mongo-client");
Hemos pasado como parámetro el nombre de la base de datos que queremos. Obtenemos una instancia de MongoDataBase
Crear u obtener una colección con MongoClient y Spring Boot[editar]
El siguiente paso es obtener una colección con la que trabajar. El método getCollection() de MongoDataBase nos permite hacerlo. Creará si no existe la colección o nos devolverá la existente en caso de que ya exista.
// Obtener una colección
final MongoCollection<Document> collection = database.getCollection("collection-test");
Hemos pasado como parámetro el nombre de la colección que queremos. Obtenemos una instancia de MongoCollection<Document> para manejar objetos org.bson.Document. Si quisieramos poder manejar objetos Java POJO (Plain Old Java Object), tendríamos que hacer una configuración especial. Puedes verla en Java POJOs con MongoDB
Operaciones CRUD con MongoClient y Spring Boot[editar]
Como hemos comentado, veamos aquí sólo algunas, como ejemplo básico
// Insertar un documento
Document document = new Document("name", "Pedro");
InsertOneResult insertOneResult = collection.insertOne(document);
System.out.println("Insertado : "+insertOneResult.getInsertedId());
// Consulta del documento insertado
FindIterable<Document> documents = collection.find();
documents.forEach(documentFound -> System.out.println(documentFound));
// Borrado de la base de datos MongoDB completa
database.drop();
En el primer bloque creamos una instancia de org.bson.Document. Esta clase es como un Map de Java al que podemos añadir parejas clave/valor. En el constructor hemos añadido la primera pareja clave ("name") / valor ("Pedro"). Podemos añadir más usando su método append(). Una vez creado el Document, lo insertamos con el método insertOne() de la clase MongoCollection. Nos devuelve una instanciad de InsertOneResult donde podemos obtener la clave primaria que MongoDB genera para este documento.
En el segundo bloque hacemos una consulta de documentos de la colección usando el método find(). Nos devuelve un FindIterable con todos los documentos de la colección. Hacemos el bucle para sacarlo por pantalla.
Y finalmente, como todo esto es solo un ejemplo, borramos la base de datos de prueba completa con todos sus datos de prueba usando el método drop().