mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类似),所以我这里加入了一个利用反射快速操作的类,来支持bean操作。另因为java不支持扩展方法,所以只能用abstract class的类来替代,c#的话可以直接扩展官方driver,会更方便。
 
关于速度,反射(reflection)一般情况下要比直接(native)的方法要慢。先使用的是反射method赋值,平均要比native慢10%左右,所以第二次改用java 的field.set (如果是private,需先设置 field.setAccessible 为true)来进行操作,速度跟native不相上下,在模拟10万,100万数据操作的时候,有时候甚至比native还快。不过这样就舍去了一个功能是可能会在set方法中加入操作,如果需要改为的method的话(hibernate默认做法),只需要修改为method反射即可。
 
 
 
代码很简单,写出来小记一下。 
 
package gsralex;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.net.UnknownHostException; import org.bson.types.ObjectId; import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.Mongo; public abstract class Dao {
private static final ThreadLocal<Mongo> threadLocal = new ThreadLocal<Mongo>(); private static final String connectAddress = "127.0.0.1";
private static final int connectPort = 27017; public static Mongo getMongo()
{
Mongo mongo = threadLocal.get();
if ( mongo == null )
{
try {
mongo = new Mongo( connectAddress, connectPort );
} catch ( UnknownHostException e ) {
/* TODO Auto-generated catch block */
e.printStackTrace();
}
threadLocal.set( mongo );
}
return(mongo);
} public static void close()
{
Mongo mongo = threadLocal.get(); if ( mongo != null )
{
mongo.close();
threadLocal.set( null );
}
} public static DB getDefaultDb()
{
return(getDb( "gsralex" ) );
} public static DB getDb( String dbName )
{
Mongo mongo = getMongo(); if ( mongo != null )
{
return(mongo.getDB( dbName ) );
} return(null);
} public static int insert( Object bean )
{
Class clazz = bean.getClass(); Field[] fields = clazz.getDeclaredFields(); MongoColumn column;
DBObject dbObject = new BasicDBObject(); try {
for ( Field field : fields )
{
column = field.getAnnotation( MongoColumn.class );
if ( column == null )
{
continue;
} Object filedValue = field.get( bean );
dbObject.put( column.name(), filedValue );
}
} catch ( Exception e ) {
/* TODO Auto-generated catch block */
e.printStackTrace();
} MongoCollection collection = (MongoCollection) clazz
.getAnnotation( MongoCollection.class );
return(getDefaultDb().getCollection( collection.name() ).insert( dbObject )
.getN() > 0 ? 0 : -1);
} public static int update( Object obj, String collectionName )
{
Class clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); MongoColumn column;
DBObject dbObject = new BasicDBObject(); try {
for ( Field field : fields )
{
column = field.getAnnotation( MongoColumn.class );
if ( column == null )
{
continue;
} Object filedValue = field.get( obj );
dbObject.put( column.name(), filedValue );
}
} catch ( Exception e ) {
/* TODO Auto-generated catch block */
e.printStackTrace();
} ObjectId _id = getObjectId( obj, clazz );
return(getDefaultDb().getCollection( collectionName ).update(
new BasicDBObject( "_id", _id ), dbObject ).getN() > 0 ? 0 : -1);
} private static ObjectId getObjectId( Object obj, Class clazz )
{
ObjectId _id = null;
try {
_id = (ObjectId) clazz.getField( "_id" ).get( obj );
} catch ( Exception e ) {
/* TODO Auto-generated catch block */
e.printStackTrace();
} return(_id);
} public static Object getBean( DBObject dbObject, Class clazz )
{
if ( dbObject == null )
{
return(null);
} Object obj = null;
try {
obj = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields(); MongoColumn column;
for ( Field field : fields )
{
column = field.getAnnotation( MongoColumn.class ); if ( column == null )
continue; field.setAccessible( true );
Object filedValue = dbObject.get( column.name() );
field.set( obj, filedValue );
}
} catch ( Exception e ) {
e.printStackTrace();
} return(obj);
}
}
 
需要增加两个注解:
 
package gsralex;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target; @Target( { ElementType.TYPE } )
public @interface MongoCollection {
public String name() default "";
} package gsralex; import java.lang.annotation.ElementType;
import java.lang.annotation.Target; @Target( { ElementType.FIELD, ElementType.METHOD } )
public @interface MongoColumn {
public String name() default "";
}
 

郑州 6月23日 晴

给java mongodb 官方driver 增加bean 操作的更多相关文章

  1. MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))

    目录 一.前言 1. 运行环境 二.前期准备工作 1. 创建 MongoDBContext MongoDb操作上下文类 2.创建测试类 3.创建测试代码 三.内嵌数组增加元素操作 1.Update.S ...

  2. 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)

    近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...

  3. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  4. MongoDB C Driver使用教程

    MongoDB C Driver使用教程 转载请注明出处http://www.cnblogs.com/oloroso/ 本指南提供简介 MongoDB C 驱动程序. 在 C API 的详细信息,请参 ...

  5. Scala对MongoDB的增删改查操作

    =========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! ==================== ...

  6. [原创]MongoDB C++ 驱动部分问题解决方案(MongoDB C++ Driver)

    本文为我长时间开发以及修改MongoDB C++ Driver时的一些问题和解决方案.目前本文所介绍的相关引擎也已经发布闭源版本,请自行下载 库版本以及相关位置:http://code.google. ...

  7. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  8. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  9. Mongodb学习笔记五(C#操作mongodb)

    mongodb c# driver(驱动)介绍 目前基于C#的mongodb驱动有两种,分别是官方驱动(下载地址)和samus驱动(下载地址). 本次我们只演示官方驱动的使用方法. 官方驱动文档查看 ...

随机推荐

  1. thinkphp 模型定义

    模型定义 模型类并非必须定义,只有当存在独立的业务逻辑或者属性的时候才需要定义. 模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义 ...

  2. springboot跨域问题解决

    package com.qif.xdqdm.config; import org.springframework.context.annotation.Bean; import org.springf ...

  3. JavaScript中纯JS写21点游戏

    // 21点游戏 分为人机对战和人人对战 // 玩家每次抽一张牌 牌的点数为1-10点随机数 谁更接近21点谁就获胜 let readline = require("readline-syn ...

  4. 如何将指定文件或文件夹直接提交到svn指定目录?

    如何将指定文件或文件夹直接提交到svn指定目录? 一般我们都是按以下步骤操作的: 1.先将那个目录checkout下来 2.将要添加的文件或者文件夹放到这个目录中 3.右击文件执行svn菜单中的add ...

  5. 微信小程序 tabBar模板

    tabBar导航栏 小程序tabBar,我们可以通过app.json进行配置,可以放置于顶部或者底部,用于不同功能页面的切换,挺好的... 但,,,貌似不能让动态修改tabBar(需求:通过switc ...

  6. java_缓冲流(文件内容排序)

    /** 案例:诸葛亮出师表文本排序 * 1.使用HashMap集合,k存储每行文本序,v存储文本 * 2.创建字符缓冲输入流,构造方法中绑定字符输入流 * 3.使用字符串缓冲输入流中的方法readLi ...

  7. SpringBoot集成JPA根据实体类自动生成表

    数据库是mysql,在application.properties中的写法如下: 原来配置这样的时候确实可以生产表的 #spring.jpa.hibernate.ddl-auto=update 多方查 ...

  8. grep 强大的文本搜索工具

    1.grep -r "History folder does't exist:" * :中间是要搜索的文本,* 表示全部显示出来

  9. 使用vue-cli3快速适配H5项目

    跟我老大学到了一招使用vue-cli3快速适配H5项目的方法. 我之前也有进行一个版本的适配,直接使用cnpm install -g vue-cli,然后安装各种插件进行适配,见我之前的博客. 后来老 ...

  10. nginx压力测试webbench

    下载压力测试工具webbench wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz 安装依赖包 yum -y in ...