java实现mongodb的dbutils
来源:互联网 发布:反网络尖兵 编辑:程序博客网 时间:2024/05/18 23:27
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框架,可以去查找借鉴下。
- java实现mongodb的dbutils
- 使用java的DBUtils
- Java DbUtils的使用
- Java的DBUtils工具演示
- java中的DBUtils的使用
- 常用代码备忘录(封装 Apache Commons 的 DbUtils 实现的数据库操作工具类)-DBUtil.java
- 用DBUtils实现对数据库的操作
- DbUtils之ResultSetHandler的实现类
- 基于DBUtils的数据库工具类实现
- DBUTILS的原理简单实现代码
- 【MongoDB】-Java实现对mongodb的And、Or、In操作
- JAVA dbutils resulthandler 的几个分类
- 基于java实现mongodb的数据库连接池
- java实现mongodb的连接池
- java中MongoDB的分页实现
- Java中实现MongoDB的Group功能
- java实现mongoDB的多条件查询
- Java实现mongoDB的数据导入TIDB
- 澳门--电话正则表达式
- VS2013不能新建C和C++项目的解决办法
- Unity for Absolute Beginners(一)
- 225 - Golygons Golygons 暴力
- 自动化测试的五大原则
- java实现mongodb的dbutils
- 香港--电话正则表达式
- hive的使用和优化笔记
- grub配置说明
- 嵌入式开发实战:新唐 M451 蜂鸣器播放音乐
- 渣渣电生理学进击史~
- POJ 1845 Sumdiv (因子和)
- Hdoj 1427 速算24点 【DFS】
- ms笔试存档