java实现mongodb的dbutils

mongodb用起来了,但是操作返回数据调用find方法 返回 需要处理,很是不爽,借鉴了下commons-dbutils对java数据库的操作,自己也对mongodb的返回数据实现封装。里面用到java 内省和反射.

接下来贴源码 和简单的注释

Person.java

package com.zk.bean;

/**

* 用户实体

* @author zk

* @time 2015-4-24 下午1:49:45

* @version 1.0

* @todo

*/

public class Person {

private String id;

private String name;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    return "Person [id=" + id + ", name=" + name + "]";
}

}

ResultSetHandler.java

package com.zk.db.ResultHandler;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Set;

import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/**
 * 通过接口 实现数据回调
 * @author  zk
 * @time    2015-4-24 下午1:27:25
 * @version 1.0
 * @todo
 */
public interface ResultSetHandler<T> {

    /**
     * 用户自己封装数据处理
     * @param cursor
     * @return
     * @throws Exception
     */
    public T handler(DBCursor cursor) throws Exception;
}

BaseHandler.java

package com.zk.db.ResultHandler;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Set;
import com.mongodb.DBObject;
/**
 * 返回数据处理 基类 实现 内省封装
 * @author  zk
 * @time    2015-4-24 下午4:07:52
 * @version 1.0
 * @todo
 */
public class BaseHandler<T> {
    private Class clazz;
    public BaseHandler(Class clazz) {
        this.clazz=clazz;
        // TODO Auto-generated constructor stub
    }
    public void populate(T t, Set<String> set, DBObject object) throws Exception {
        // 完成该数据的封装
        BeanInfo info = Introspector.getBeanInfo(clazz);
        PropertyDescriptor [] pds = info.getPropertyDescriptors();
        for (PropertyDescriptor pd : pds) {
            // 先获取到属性的名称    proName
            String proName = pd.getName();
            if(set.contains(proName)){
                // 获取到该属性的写方法
                Method m = pd.getWriteMethod();
                // 执行之
                m.invoke(t, object.get(proName));
            }
            if(set.contains("_"+proName)){
                // 获取到该属性的写方法
                Method m = pd.getWriteMethod();
                // 执行之
                m.invoke(t,object.get("_"+proName));
            }
        }
    }
}

BeanHandler.java

package com.zk.db.ResultHandler;

import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Method;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

import java.util.ArrayList;

import java.util.List;

import java.util.Set;

import com.mongodb.DBCursor;

import com.mongodb.DBObject;

/**
 * 返回单一记录实体的处理
 *
 * @author zk
 * @time 2015-4-24 下午3:51:32
 * @version 1.0
 * @todo
 */
public class BeanHandler<T> extends BaseHandler<T> implements
        ResultSetHandler<T> {
    private Class clazz;

    public BeanHandler(Class clazz) {
        super(clazz);
        this.clazz = clazz;
    }
   /**
    * 回调处理 核心方法
    */
    public T handler(DBCursor cursor) throws Exception {
        try {
            if (cursor.hasNext()) {
                //反射机制
                T t = (T) this.clazz.newInstance();
                DBObject object = cursor.next();
                Set<String> set = object.keySet();
                populate(t, set, object);
                return t;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
**BeanListHandler.java**
package com.zk.db.ResultHandler;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

/**
 * 返回list 泛型集合的处理
 *
 * @author zk
 * @time 2015-4-24 下午3:50:19
 * @version 1.0
 * @todo
 */
public class BeanListHandler<T> extends BaseHandler<T> implements ResultSetHandler<List<T>> {
    private Class clazz;

    public BeanListHandler(Class clazz) {
        super(clazz);
        this.clazz = clazz;
    }
    /**
     * 回调数据处理 核心方法
     */
    public List<T> handler(DBCursor cursor) throws Exception {
        try {

            List<T> list = new ArrayList<T>();
            while (cursor.hasNext()) {
                //反射
                T t = (T) this.clazz.newInstance();
                DBObject object = cursor.next();
                Set<String> set = object.keySet();
                populate(t, set, object);
                list.add(t);
            }
            return list;

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

MongoDb.java 以后就可以直接调用这个方法 就好了,需要优化处理

package com.zk.db;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.List;
import java.util.Set;
import org.bson.types.ObjectId;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.zk.bean.Person;
import com.zk.db.ResultHandler.BeanListHandler;
import com.zk.db.ResultHandler.ResultSetHandler;

public class MongoDb {
// 1.建立一个Mongo的数据库连接对象
static Mongo connection = null;
// 2.创建相关数据库的连接
static DB db = null;
public MongoDb(String dbName) throws UnknownHostException, MongoException {
    connection = new Mongo("127.0.0.1:27017");
    db = connection.getDB(dbName);
}
public static void main(String[] args) throws UnknownHostException,
        MongoException {
    MongoDb mongoDb = new MongoDb("one");
    DBObject query = new BasicDBObject();
    //看看这个地方 是不是很像 dbutils调用的方法哟。。。。。
    List<Person> plist = mongoDb.find(query, new BeanListHandler<Person>(
            Person.class), "person");
    for (Person person : plist) {
        System.out.println(person);
    }
}
   /**
    * 分页查询 返回 封装集合
    * @param query
    * @param rsh
    * @param collName
    * @return
    */
public <T> T find(DBObject query, ResultSetHandler<T> rsh, String collName) {
    try {
        MongoDb mongoDb = new MongoDb("one");
        // mongoDb.f
        DBCursor cursor = mongoDb.find(null, null, 0, 6, collName);
        // 关键,用户决定怎么来封装rs的对象 List Map Account ...
        T t = rsh.handler(cursor);
        return t;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new RuntimeException(e);
    } // 调用封装结果的方法,返回的封装的结果。
}

/**
 * 查询器(分页)
 *
 * @param ref
 * @param keys
 * @param start
 * @param limit
 * @return
 */
public DBCursor find(DBObject ref, DBObject keys, int start, int limit,
        String collName) {
    DBCursor cur = find(ref, keys, collName);
    return cur.limit(limit).skip(start);
}

/**
 * 查询器(不分页)
 *
 * @param ref
 * @param keys
 * @param start
 * @param limit
 * @param collName
 * @return
 */
public DBCursor find(DBObject ref, DBObject keys, String collName) {
    // 1.得到集合
    DBCollection coll = db.getCollection(collName);
    DBCursor cur = coll.find(ref, keys);
    return cur;
}
}

注意:

BaseHandler 类 返回数据处理 基类 实现 内省封装

ResultSetHandler接口 通过接口 实现数据回调

BeanHandler类 返回单一记录实体的处理

BeanListHandler返回list 泛型集合的处理

MongoDb类 核心处理 public T find(DBObject query, ResultSetHandler rsh, String collName)把这几个类接口连接起来,当调用该方法时,需要传入一个实现了ResultSetHandler接口的类,该类可以是BaseHandler[返回单一实体],BeanListHandler[返回list集合],在方法内部可以调用具体实现类的handler 方法,实现具体的解析, 返回。BaseHandler 可以帮助BeanListHandler,BeanHandler这2个实现类 利用反射 封装数据的作用。

该实现借鉴了开源工具类 dbutils的实现。面向接口编程,接口注入,反射 内省的运用在这里面都可也体现。

另外网上也有一些开源的操作mongodb的 dbtuils 和orm框架,可以去查找借鉴下。

时间: 2025-01-04 04:03:49

java实现mongodb的dbutils的相关文章

java 对mongodb的操作

java 对mongodb的操作 1.1连单台mongodb Mongo mg = newMongo();//默认连本机127.0.0.1  端口为27017 Mongo mg = newMongo(ip);//可以指定ip 端口默认为27017 Mongo mg = newMongo(ip,port);//也可以指定ip及端口号 1.2连双台mongodb //ip为主机ip地址,port为端口号,dataBaseName相当于数据库名 DBAddress left = new DBAddre

java操作mongoDB实现CURD

java操作mongoDB mongoDB作为一个牛气哄哄的nosql内存数据库,的确有很多优点,对于大数据量.高并发.弱事务的互联网应用,MongoDB可以应对自如.接触到mongoDB 参考了下api实现了增删改查.mongoDB 是面向对象设计,不用写sql语句 直接操作api 方法 就可以实现,这会儿数据库语句写不好的娃娃们有福了.直接贴码: DataTest.java package com.zk.db; import java.net.UnknownHostException; im

使用Java操作MongoDB

该篇比较简单,仅介绍Java操作MongoDB的简单CRUD案例,开搞前需要引入mongo-java-driver-3.2.2.jar,Java操作MongoDB的API众多,高级功能还需查询官方文档. public void insert() { // 建立数据库连接 Mongo mongo = new Mongo("localhost", 27017); // 获取指定的数据库 DB db = mongo.getDB("kaiye"); // 获取指定的集合 D

Java操作MongoDB

先引入mongo-java-dirver驱动 <!-- mongo-java-dirver --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.4.2</version> </dependency> 代码操作演示: package com.simpl

java连接mongodb源码解读

用mongdb也大半年了,一直是业务上的逻辑实现了就ok.然而这样并不能进步--因此今天查了查java连接mongodb驱动的源码,搜到的各种信息整合一下,方便以后深入的使用. 先贴连接数据库代码  List<ServerAddress> replicaSet = new          ArrayList<ServerAddress>();          replicaSet.add(new ServerAddress("127.0.0.1", 2701

深入浅出MongoDB(六)java操作mongodb增删改查

java操作mysql数据库的代码我们已经了如指掌了,增删改查,java对mongodb数据库也是类似的操作,先是数据库连接,再是进行操作. 首先我们进入进入admin数据库,然后建立自己的数据库testMongoDb,进入admin数据库后,就可以直接进入testMongoDb,因为用户可以进入系统的数据库,就是超级管理员,use testMongoDb后,为该数据库设置用户名和密码,db.addUser('root','root'),这样我们在程序中连该数据库,并实现增删改查,代码如下所示.

【MongoDB for Java】Java操作MongoDB

开发环境: System:Windows IDE:eclipse.MyEclipse 8 Database:mongoDB 开发依赖库: JavaEE5.mongo-2.5.3.jar.junit-4.8.2.jar 一.准备工作 1. 首先,下载mongoDB对Java支持的驱动包 驱动包下载地址:https://github.com/mongodb/mongo-java-driver/downloads mongoDB对Java的相关支持.技术:http://www.mongodb.org/

java连接MongoDB数据库

这段时间尝试了一下MongoDB,感觉十分易用,方便,相比关系型的数据库来说优势也很大,于是尝试了下使用java连接MongoDB,并进行了 基本的增删改查操作. 首先先在控制台中连接数据库,查看数据库有几个表. 现在,新建一个maven工程,pom.xml中的依赖如下: <!-- WICKET DEPENDENCIES --> <dependency> <groupId>org.apache.wicket</groupId> <artifactId&

Java and MongoDB link for project

鉴于开源项目的发展,大力拥抱开源社区.发现Java和MongoDB不失为一个较好的选择. 与其他数据库一样,同样需要mongo-java-driver,构建了Java与MongoDB的交互. 1. 连接MongoDB 1.1 普通数据库的连接 MongoClient mongoClient = new MongoClient(); MongoClient mongoClient = new MongoClient( "localhost" ); MongoClient mongoCli