Java and Mongodb 保存/读取java对象到/从mongodb

Mongodb官方提供的Java驱动,保存与读取,需要的者是DBObject对象,这是一个接口,实现put,get等方法,跟map类似,如果我们要直接把普通的java对象保存到mongodb,就需要先转换成DBObject对象,或者直接实现DBObject接口,操作起来相当复杂。还好,monodb驱动带了把json转换成DBObject对象的功能,加上Google的Gson,就可以实现把普通的对象保存到mongodb中。如果要从mogodb中读出对象,反过来操作即可,但有一点需要注意的是,mongodb的文档没有固定的字段,所以用Gson转换,可能因为各个文档属性不同,转出的对象属性都是空的,要确保在插入时都是插入同一个类的对象。 下面的例子是把User对象插入到Mongodb中,并读出来 User.java:

package com.mongo;

public class User {
    String name;
    int age;
    Oid _id;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    /**
     * Mongodb会自动生成ObjectId
     * @author fhp
     *
     */
    public class Oid{
        String $oid;
        public String get$oid() {
            return $oid;
        }

        public void set$oid(String $oid) {
            this.$oid = $oid;
        }

    }
}

Main.java:

package com.mongo;

import java.net.UnknownHostException;

import com.google.gson.Gson;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.util.JSON;

public class Main {

    /**
     * @param args
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException {
        // TODO Auto-generated method stub
        MongoClient mongoClient = new MongoClient();

        DB psdoc = mongoClient.getDB("psdoc");
        DBCollection user=psdoc.getCollection("user");

        User u1=new User();
        u1.setAge(20);
        u1.setName("ssss");
        Gson gson=new Gson();
        //转换成json字符串,再转换成DBObject对象
        DBObject dbObject = (DBObject) JSON.parse(gson.toJson(u1));
        //插入数据库
        user.insert(dbObject);

        DBCursor cursor=user.find();
        while(cursor.hasNext())
        {
            DBObject obj=cursor.next();
            //反转
            User u=gson.fromJson(obj.toString(), User.class);
            System.out.println(u.name);
        }
    }

}

为了方便,可以直接把Gson整合进驱动里,直接修改驱动的源代码 com.mongodb.DBCollection.java: 新增方法:

/**
 * 把普通的对象写入数据库
 * 
 * @param obj
 * @return
 */
public WriteResult insert(Object obj) {
    Gson gson = new Gson();
    DBObject dbObject = (DBObject) JSON.parse(gson.toJson(obj));
    gson=null;
    return insert(dbObject);
}

com.mongodb.DBCursor.java: 新增方法

    /**
     * 从数据库读出对象
     * @param obj
     * @param clazz
     * @return
     */
    public  T nextObj(Class clazz) {
        _checkType( CursorType.ITERATOR );
        Gson gson=new Gson();
        T u=gson.fromJson(_next().toString(), clazz);
gson=null;
        return u;
    }

修改后的调用方法: Main.java:

package com.mongo;

import java.net.UnknownHostException;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

public class Main {

    /**
     * @param args
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException {
        // TODO Auto-generated method stub
        MongoClient mongoClient = new MongoClient();

        DB psdoc = mongoClient.getDB("psdoc");
        DBCollection user=psdoc.getCollection("user");

        User u1=new User();
        u1.setAge(20);
        u1.setName("ssss");
        //直接插入对象
        user.insert(u1);
        DBCursor cursor=user.find();
        while(cursor.hasNext())
        {
            //传入类参数,反回该类对象
            User u=cursor.nextObj(User.class);
            System.out.println(u.name);
        }
    }

}