`
san_yun
  • 浏览: 2663053 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mongoDB java简单记录

 
阅读更多

1. 数据格式传递 上个自己画的图 Mongodb-Java驱动基本流程

驱动里面操作的,是DBObject(用户提供的和已经转为Command格式的DBObject),OutMessage(可以转为byte[]写入Socket),Response,WriteResult(用户真正拿到的返回值)

层层封装,绕得我头都晕

2. 日志与Debug信息 日志采用JDK Logging,有1个比较关键的环境变量配置DB.TRACE,设置为true时,log的日志level会改变 … 我汗啊…. 原本以为另外一个配置DEBUG.DB也控制了什么东西,后来才发现,这配置完全没人调用,应该是历史遗留下来的

还有一些比较诡异的环境变量设置 MONGO-TRACKLEAKS — SimplePool里面的设置,同样作用于连接池 DEBUG.MONGO DEBUG.DBPOINTER — 已经废弃的类,直接无视吧 com.mongodb.cleanerIntervalMS — 定期轮询DB实例,执行 db.cleanCursors(true);

3. 切勿使用的类 com.mongodb.util.TestCase和com.mongodb.util.TestNGListener属于坑爹类,依赖TestNG,却不放在test文件夹中,MyAsserts也好不到哪里去 com.mongodb.util和com.mongodb.io包里面的类也不要用,很多类连驱动本身也没有使用!!

4. 对象序列化/反序列化的规则 比较有趣的是内置的Json序列化/反序列化类,里面解释了一些类型映射方面的规则(序列化的代码在JSon类,反序列的代码在JSONCallback): ObjectId — {$oid : “具体的值”} java.util.Date — {$date : “yyyy-MM-dd’T’HH:mm:ss.SSS’Z’”} 而且是UTC的,即不保存时区数据!! DBRefBase — {$ref : “集合名”, $id : 具体id的值} Pattern — {$regex:“正则表达式原型”, $options : “表达式的flag”} BSONTimestamp — {$ts: 具体时间, $inc:具体毫秒数} UUID — {$uuid : “uuid标准的toString()”} CodeWScope — {$code: 具体的值, $scope : 具体的值} Code — {$code: 具体的值} MinKey — {$minKey : 1} 没错,是固定为1 MaxKey — {$maxKey : 1} 同样是1 基本数据类型,封装类型,String,数组,List,Map当然都是支持的了,其他全部都是不可序列化的

而,真正进行DBObject转换为byte[]的类,是org.bson.BasicBSONEncoder,摘录一段关键代码:

  if ( name.equals( "_transientFields" ) )    //不会被序列化的东西,终于有藏身之所
            return;

        if ( DEBUG ) System.out.println( "\t put thing : " + name ); //竟然是syso,我晕

        if ( name.equals( "$where") && val instanceof String ){   //特别吧? 呵呵
            _put( CODE , name );
            _putValueString( val.toString() );
            return;
        }

        val = BSON.applyEncodingHooks( val );

        if ( val == null )
            putNull(name);
        else if ( val instanceof Date )
            putDate( name , (Date)val );
        else if ( val instanceof Number )
            putNumber(name, (Number)val );
        else if ( val instanceof Character )
            putString(name, val.toString() );
        else if ( val instanceof String )
            putString(name, val.toString() );
        else if ( val instanceof ObjectId )
            putObjectId(name, (ObjectId)val );
        else if ( val instanceof BSONObject )
            putObject(name, (BSONObject)val );
        else if ( val instanceof Boolean )
            putBoolean(name, (Boolean)val );
        else if ( val instanceof Pattern )
            putPattern(name, (Pattern)val );
        else if ( val instanceof Map )
            putMap( name , (Map)val );
        else if ( val instanceof Iterable)
            putIterable( name , (Iterable)val );
        else if ( val instanceof byte[] )
            putBinary( name , (byte[])val );
        else if ( val instanceof Binary )
            putBinary( name , (Binary)val );
        else if ( val instanceof UUID )
            putUUID( name , (UUID)val );
        else if ( val.getClass().isArray() )
            putArray( name , val );

        else if (val instanceof Symbol) {   //这个比较特别,在Json序列化中是不存在的,实际上就是对String简单封装一层
            putSymbol(name, (Symbol) val);
        }
        else if (val instanceof BSONTimestamp) {
            putTimestamp( name , (BSONTimestamp)val );
        }
        else if (val instanceof CodeWScope) {
            putCodeWScope( name , (CodeWScope)val );
        }
        else if (val instanceof Code) {
            putCode( name , (Code)val );
        }
        else if (val instanceof DBRefBase) {
            BSONObject temp = new BasicBSONObject();
            temp.put("$ref", ((DBRefBase)val).getRef());
            temp.put("$id", ((DBRefBase)val).getId());
            putObject( name, temp );
        }
        else if ( val instanceof MinKey )
            putMinKey( name );
        else if ( val instanceof MaxKey )
            putMaxKey( name );
        else if ( putSpecial( name , val ) ){
            // no-op
        }
        else {
            // 全都不是? 那就只能抛错了哦
            throw new IllegalArgumentException( "can't serialize " + val.getClass() ); 
        }
 

没有特别针对Timestamp进行优化,只会按其父类java.util.Date进行处理咯,且BSONTimestamp是仅限内部使用的

5. 连接池的实现 SimplePool,一个对象池, 同时也是DBPortPool的基础 — 即Mongodb的内建数据库连接池,使用synchronized进行实现

6. 内置的Java对象 — DBObject映射支持 没看驱动源码之前,一直以为没这方面的支持,实际上还是有一个的,那就是ReflectionDBObject, 用法简介:

 

public class TestReflectionDBObject {

    public static void main(String[] args) throws Throwable {
        Mongo mongo = new Mongo();
        DB db = mongo.getDB("wendal_test");
        Person p = new Person();
        p.setId(UUID.randomUUID());
        p.setName("wendal");
        DBCollection ps = db.getCollection("person");
        ps.insert(p);

        ps.setObjectClass(Person.class); //接受DBObject的子类
        Person p_db = (Person) ps.findOne();
        Assert.assertEquals("wendal", p_db.getName());
        System.out.println(Json.toJson(p_db));

        mongo.close();
    }

    public static class Person extends ReflectionDBObject { //必须继承,呵呵
        private UUID id; 
        private String name; //省略getter/setter
    }
}
 
分享到:
评论

相关推荐

    MongoDB Java Driver 简单操作

    ### MongoDB Java Driver 简单操作详解 #### 一、简介 MongoDB 是一款非常流行的文档型数据库系统,因其灵活性和高性能而被广泛应用于多种场景之中。为了方便开发者使用 Java 进行开发,MongoDB 提供了官方的 Java ...

    MongoDB Java API 中文

    ### MongoDB Java API 使用详解 #### 一、Java 驱动简介与一致性 MongoDB 的 Java 驱动是线程安全的,适用于大多数应用程序场景。通常情况下,只需要创建一个 `Mongo` 实例即可,因为它内部包含了一个连接池(默认...

    java连接mongodb的jar包

    MongoDB Java驱动提供了丰富的API来进行数据操作,如插入文档、查询数据、更新记录和删除记录等。例如,插入文档可以使用如下代码: ```java MongoCollection<Document> collection = database.getCollection(...

    MongoDB入门教程 + 架构简析 + java使用MongoDB的简单程序

    在"Java使用MongoDB的简单程序"中,我们将学习如何使用Java驱动程序连接到MongoDB数据库。Java驱动程序提供了一套API,使得开发者可以轻松地进行数据操作。基本步骤包括:创建MongoClient实例以连接到MongoDB服务器...

    mongodb java 简单操作 win32 安装步骤

    一个简单的“MongoDB Hello World”程序可能如下所示: ```java import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import org.bson....

    MongoDB Java Demo

    MongoDB Java Demo是一个示例项目,它展示了如何在Java应用程序中使用MongoDB数据库。MongoDB是一种流行的NoSQL数据库,以其灵活性、高性能和易用性而闻名。与传统的SQL数据库不同,MongoDB使用文档型数据模型,支持...

    MongoDB Java创建集合.pdf

    在Java中,我们可以使用官方提供的 MongoDB Java 驱动程序来与 MongoDB 交互,包括创建集合。本篇将详细讲解如何使用Java来创建MongoDB集合。 1. 引入依赖 在使用MongoDB Java驱动程序之前,首先需要在项目中引入...

    mongodb的java驱动实现简单示例

    MongoDB的Java驱动是连接Java应用程序与MongoDB数据库的关键组件,它提供了丰富的API来执行各种数据库操作。在本示例中,我们将深入探讨如何使用Java驱动实现与MongoDB的交互。 首先,确保已经在项目中引入了...

    java基于jsoup+mongodb的简单爬虫入门程序

    **Java基于Jsoup+MongoDB的简单爬虫入门程序** 在现代互联网环境中,数据的获取与分析变得至关重要,而爬虫技术就是实现这一目标的重要工具。本教程将介绍如何使用Java编程语言,结合Jsoup库进行网页抓取,并利用...

    Mybatis拦截器记录数据更新历史记录到MongoDB

    Mybatis,作为Java领域的持久层框架,它提供了灵活的SQL映射机制,使得数据库操作变得简单高效。本文将深入探讨如何使用Mybatis拦截器来记录数据更新历史记录,并将其存储到MongoDB中。 首先,我们来理解Mybatis...

    Java程序访问MongoDB

    - 下面是一个简单的示例程序,用于连接MongoDB并执行基本的操作: ```java import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; ...

    mongodb的java 实现

    MongoDB支持多种查询方式,如简单查询、复合查询等。 ```java public void searchData() { // 显示集合 Set<String> colls = db.getCollectionNames(); showData(colls); // 查询集合中的所有记录 DBCursor ...

    MongoDB Driver -JAVA 2.5.3 API

    MongoDB Driver for JAVA 2.5.3 API是Java开发者用来与MongoDB数据库进行交互的官方驱动程序。这个API提供了丰富的功能,使开发人员能够轻松地执行查询、更新、插入和删除操作,以及处理复杂的聚合框架。以下是关于...

    java+mongodb+分页

    `Result.java`可能是用于封装查询结果的类,它可能包含如数据列表、总记录数、当前页码等信息。这个类可以帮助我们在Java后端和前端之间传递分页数据。例如: ```java public class Result<T> { private List<T> ...

    MongoDB集群以及日志、异常规范Java代码实例.zip

    3. 不忽视异常:不要简单地吞掉异常,而应记录日志或给出用户反馈。 4. 使用 throws 关键字:如果无法在当前方法内处理异常,可以声明方法抛出异常,由调用者处理。 5. 创建自定义异常:当需要特殊处理的异常时,...

    MongoDB简单应用

    对于开发者来说,MongoDB还提供了丰富的编程语言驱动,如Python的PyMongo、Java的MongoDB Java Driver等,方便在各种应用中集成数据库操作。 在"工具"这个标签下,我们可能讨论到MongoDB的管理工具,如MongoDB ...

    springboot整合mongodb changestream代码

    在你的`mongo-test`目录下,你可以创建一个简单的测试应用,模拟数据的增删改操作,以验证Change Stream的监听效果。 总结:通过上述步骤,我们已经成功地在Spring Boot应用中整合了MongoDB的Change Stream功能。这...

    mongodb例子

    在这个“mongodb例子”中,我们很可能会找到一个简单的MongoDB数据库操作示例,这对于初学者来说是极好的学习资源。 MongoDB使用JSON格式的文档来存储数据,这种格式灵活且易于理解。数据库、集合和文档是MongoDB中...

Global site tag (gtag.js) - Google Analytics