MongoDB y Java usando Morphia

Como todos los que leen saben, soy un fiel y entusiasta usuario de MongoDB.

Actualmente estoy desarrollando un sistema Web para la universidad de la que fui alumno (soy egresado ya😀 ), usando Java y MongoDB.

Si ya han buscado información, seguramente saben que para insertar documentos se tiene que usar el “coleccion.put(“Nombre”, nom)”. Y si bien funciona… no es muy bonito que digamos.

En VB .NET (también hago aplicaciones con Mongo en .NET) para guardar documentos simplemente enviaba una clase directamente y el driver se encarga solito de serializar la clase.

Pero en Java no encontraba por ninguna parte como hacer esto… Así que buscando y buscando, llegué a la solución usando una librería llamada Morphia 

Entonces, supongamos que tenemos una clase llamada Alumno con lo típico (Id, Rut, Nombre, Fecha_Registro), y la creamos de la siguiente manera:

import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
import java.util.Date;
import org.bson.types.ObjectId;

@Entity
public class Alumno {
    @Id private ObjectId id;
    private String Nombre,
            Rut_L,
            Pass;
    private Date Registro;
    private Integer Rut;

//Setters y Getters
}

Con esto tenemos lo necesario. Morphia se encarga de mapearlo al anotar el “@Entity” sobre la clase.

Ahora creamos un nuevo alumno y le metemos los datos. Algo así:

private Boolean NuevoUsuario(Integer _id, String nom, String app, String apm,
            String rut, String pass){
            Alumno a = new Alumno();
            a.setNombre(nom + " " + app + " " + apm);
            a.setPass(pass);
            a.setRut(_id);
            a.setRut_L(rut);
//...

Tenemos listo nuevo alumno, y seguimos con Morphia para que se encargue de guardar el objeto en la BD

            Morphia morphia = new Morphia();
            morphia.map(Alumno.class);
            Datastore ds = morphia.createDatastore(MongoConnection.getInstance().getConnection(),
                    MongoConnection.getInstance().getDatabase().getName());
            ds.save(a);

Como se ve, lo primero es mapear la instancia con la clase que queremos ingresar. Luego usamos un Datastore (interfaces para leer, actualizar o guardar la info) con la conexión a Mongo y el nombre de la BD que queremos usar (OJO que estoy usando una singleton). Por último, guardamos al alumno.

Con esto el código queda más elegante😀 y la podemos ver en la shell con esta estructura.

Para leer, es igual de simple

            Morphia morphia = new Morphia();
            Datastore ds = morphia.createDatastore(MongoConnection.getInstance().getConnection(),
                    MongoConnection.getInstance().getDatabase().getName());
            Alumno a = ds.find(Alumno.class, "Rut", u).get();

Si se fijan, es lo mismo. En la 3º línea definimos el cómo se comportará el Datastore y por cuál parámetro vamos a buscar.

Eso si, el Datastore.find() devuelve un List, a menos que usemos el .get() que devuelve el primer resultado que encuentre (por lo que los controles de si se repite o no un documento corre por cuenta nuestra). Si el find() no encuentra nada, devuelve un null.

Eso es todo😀

Dejo todos los archivos que ocupé en una carpeta en SkyDrive😉

Links

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Java, MongoDB, Tutoriales y etiquetada , , . Guarda el enlace permanente.

8 respuestas a MongoDB y Java usando Morphia

  1. Anónimo dijo:

    🙂 Muy útil.

  2. William LOrd Molina Trejo dijo:

    Hola muy buen tutorial me gusto muchisimo, pero me gustaria que saber como mostrar los datos insertados de mongodb y mostrarlos en una tabla en java(netbeans), investigando mucho por la red encontre la manera de como insertar datos mediante netbeans a mongo me costo mucho pero al final me salio, podrias hacer un tutorial de como eliminar, modiifcar, consultar y traer la informacion de mongo a java.
    Espero me puedas ayudar y guiar buen aporte sigue asi.

  3. William LOrd Molina Trejo dijo:

    Porfavor ayudame🙂 mira te mando lo que trate de hacer, haber si me puedes orientar lo estoy programando en 3 capas, vistas, enlace y datos. En vistas esta el formulario que toma el array list lee los textfield y captura la informacion que luego se pasara a mongo, pero lo que quiero hacer es modificar, consultar, eliminar y traer la informacion.
    Nota: Lo hize sin aplicar Morphia.

    package Datos;

    import com.mongodb.*;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Pattern;
    import java.util.logging.*;
    import com.mongodb.Mongo;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DBObject;
    import com.mongodb.DBCursor;

    public class Conexion {
    Mongo m;
    DB base;
    DBCollection tabla;
    public Conexion() {
    try {
    m=new Mongo(“localhost”, 27017);
    System.out.println(“DBMS Mongo Conectado”);
    base=m.getDB(“ventas”);
    tabla=base.getCollection(“venta”);
    System.out.println(“Base de Datos Mongo Conectada”);

    } catch (UnknownHostException ex) {
    Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
    } catch (MongoException ex) {
    Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    public boolean ins_productos(ArrayList lista) {
    boolean hecho=false;
    try {
    for (productos nproductos : lista) {
    BasicDBObject fila= new BasicDBObject();

    fila.put(“codigo”, nproductos.getCodigo());
    fila.put(“presentacion”, nproductos.getPresentacion());
    fila.put(“nombre”, nproductos.getNombre());
    fila.put(“linea”, nproductos.getLinea());
    fila.put(“marca”, nproductos.getMarca());
    fila.put(“precio”, nproductos.getPrecio());
    fila.put(“stock”, nproductos.getStock());
    fila.put(“descripcion”, nproductos.getDescripcion());
    tabla.insert(fila);

    DBCursor cur = tabla.find();

    while(cur.hasNext()) {
    System.out.println(cur.next());
    }
    }
    hecho=true;

    } catch (Exception e) {
    }

    return hecho;
    }

    public boolean ins_Cliente(ArrayList lista){
    boolean hecho=false;
    try{
    for(Cliente nCliente : lista){
    BasicDBObject fila= new BasicDBObject();

    fila.put(“Codigo”, nCliente.getCodigo());
    fila.put(“RUC”, nCliente.getRUC());
    fila.put(“DNI”, nCliente.getDNI());
    fila.put(“Nombre”, nCliente.getNombre());
    fila.put(“Direccion”, nCliente.getDireccion());
    fila.put(“Razon”, nCliente.getRazon());
    fila.put(“Telefono”, nCliente.getTelefono());
    fila.put(“Nextel”, nCliente.getNextel());
    fila.put(“E-mail”, nCliente.getEmail());
    tabla.insert(fila);
    DBCursor cur = tabla.find();

    while(cur.hasNext()) {
    System.out.println(cur.next());
    }
    }
    hecho=true;

    }catch(Exception e){

    }

    return hecho;
    }

    }

    package Enlace;

    import Datos.Cliente;
    import Datos.Conexion;
    import Datos.productos;
    import java.util.ArrayList;

    public class Controlar {
    Conexion xcon;
    public Controlar() {
    xcon=new Conexion();
    }

    public boolean guardar_registro(ArrayList lista) {
    return xcon.ins_productos(lista);
    }
    public boolean guardar_registro1(ArrayList lista){
    return xcon.ins_Cliente(lista);
    }

    }

  4. Anónimo dijo:

    la libreria Morphia toca descargar la por aparte e instalar, es que me salen errores cuando coloco
    import com.google.code.morphia.annotations.Entity;
    import com.google.code.morphia.annotations.Id;
    y no se que será…

    por fis ayuda

  5. Nerethor dijo:

    Hola, ojala me puedas ayudar. Intento hacer un api rest con Java y mongo. Lo que no entiendo es como pasar lo que obtengo de morphia por un response de un servle; es decir, que al poner “/alumno”, me tire el json en dicha ruta. trato de hacerlo con lo que me bota del query, pero no me sale. Si sabes de algún ejemplo o tienes alguno ojala lo puedas compartir.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s