mongodb在Java开发中的应用

Java连接mongoDB

Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本.

package org.dennisit.mongodb.study;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;

/**
 *
 *    MongoDBUtil.java
 *
 *     功   能: Java连接MongoDB小Demo(连接并插入一条数据)
 *     类   名: MongoDBUtil
 *
 *  ver      変更日        角色           担当者     変更内容
 *     ──────────────────────────────────────────────
 *  V1.00   2013-1-16   Demo模块    苏若年     初版
 *
 *     Copyright (c) 2013 dennisit corporation All Rights Reserved.
 *
 *  Email:<a href="mailto:[email protected]">发送邮件</a>
 *
 */
public class MongoDBUtil {

    public static void main(String[] args) {
        Mongo mongo = null;
        try {
            //通过连接字符串得到一个数据库实例的连接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //获得一个数据库对象,mydb为数据库民称
        DB db = mongo.getDB("mydb");
        //指定安全授权信息[mydb数据库的用户名为mydbusr,密码为123]
        db.authenticate("mydbusr", "123".toCharArray());

        //声明一个collection对象
        DBCollection collection = db.getCollection("user");
        //声明一个document文档对象,用户存储数据
        BasicDBObject doc = new BasicDBObject();
        doc.put("name", "suruonian");
        doc.put("email", "[email protected]");
        BasicDBObject experience = new BasicDBObject();
        experience.put("year of 2012", "i work in hangzhou");
        experience.put("year of 2013", "i work in shenzhen");
        doc.put("work experience", experience);
        //调用collection的insert方法,将数据持久化到磁盘上.
        collection.insert(doc);
        System.out.println("test data insert finish ");
    }
}

这时登录到mydb.查看
> db.user.find({},{_id:0});
{ "name" : "suruonian", "email" : "[email protected]", "work experience" : { "year of 2012" : "i work in hangzhou", "year of 2013" : "i work in shenzhen" } }
>

mongoDB查询数据

通过findOne()查询一条数据

         //连接到mongodb

        //获得一个数据库对象,mydb为数据库民称
        DB db = mongo.getDB("mydb");
        //指定安全授权信息[mydb数据库的用户名为mydbusr,密码为123]
        db.authenticate("mydbusr", "123".toCharArray());

        //声明一个collection对象
        DBCollection collection = db.getCollection("user");
        DBObject userdoc= collection.findOne();
        System.out.println("查询到的一条记录为:" + userdoc);
    

mongoDB更新数据

将user集合中name为suruonian的name值改成dennisit.

         //连接到mongodb

        //声明collection对象
        DBCollection collection = db.getCollection("user");

        //定义一个查询对象,
        DBObject updateAim = new BasicDBObject();
        updateAim.put("name", "suruonian");

        System.out.println("通过用户名查找到的对象为:" + collection.findOne(updateAim));

        //定义一个更新对象,类似于set语句
        DBObject updatedValue = new BasicDBObject();
        updatedValue.put("name", "dennisit");

        //db.user.update({name:"suruonian"},{$set:{name:dennisit}});
        DBObject updateSetValue = new BasicDBObject("$set",updatedValue);

        //将查询对象和更新对象作为参数传给update来完成更新.
        collection.update(updateAim, updateSetValue);

        System.out.println("更新后查询到的一条记录为:" + collection.findOne());
    

mongoDB删除数据

删除操作user集合中name为dennisit的用户

         //连接到mongodb

         //声明collection对象
        DBCollection collection = db.getCollection("user");

        //定义一个查询对象,
        DBObject aimObj = new BasicDBObject();
        aimObj.put("name", "dennisit");

        System.out.println("通过用户名查找到的对象为:" + collection.findOne(aimObj));

        collection.remove(aimObj);
        System.out.println("删除后查询到的一条记录为:" + collection.findOne());

MonggoDB保证事物的一致性

MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个mongo实例即可.mongo有个内置的连接池(连接池默认可容纳10个数据库连接),在有大量写和读的环境中,为了确保在一个session中使用同一个DB时,可以通过DB类的requestStart()方法打开失去控制,待所有业务代码编写完毕后,再通过DB类的requestDone()方法结束事物控制.这样就保证了事物的原子性.

        //声明collection对象
        DBCollection collection = db.getCollection("user");

        //开始事务控制
        db.requestStart();

        //事务相关操作

        //结束事物控制
        db.requestDone();
        

MongoDB库级别操作

获取连接的IP地址

mongo.getAddress();

列出所有数据库[此操作只针对超级用户]

mongo.getDatabaseNames();

删除指定数据库[此操作只针对超级用户]

mongo.dropDatabase("testdb");

代码演示

    public static void main(String[] args) {

        Mongo mongo = null;
        try {
            //通过连接字符串得到一个数据库实例的连接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //连接超级用户
        DB db = mongo.getDB("admin");
        //指定安全授权信息[超级用户的用户名为root,密码为root123]
        db.authenticate("root", "root123".toCharArray());

        //getAddress方法获取IP和端口
        System.out.println("当前连接的IP和端口为:" + mongo.getAddress());

        //列出所有数据库,此操作只针对超级用户
        System.out.println("系统中的所有数据库为:" + mongo.getDatabaseNames());

        //删除数据库,此操作只针对超级用户
        mongo.dropDatabase("testdb");
        System.out.println("系统中的所有数据库为:" + mongo.getDatabaseNames());

    }
控制台输出信息
当前连接的IP和端口为:127.0.0.1:27017
系统中的所有数据库为:[admin, mydb, testdb, local, test]
系统中的所有数据库为:[admin, mydb, local, test]

MongoDB对用户的操作

为连接的数据库添加用户

        DB db = mongo.getDB("mydb");
        db.addUser("username", "password".toCharArray(),true);

参数说明

第一个参数为要条件的用户名

第二个参数为要添加的用户对应的访问口令

第三个参数为readOnly,代表用户的权限,为true表示值读权限,为false表示为读/写权限.默认为false.不传参代表默认.

删除某个用户

        DB db = mongo.getDB("mydb");
        db.removeUser("username");

参数说明

传入的参数为要删除的用户名.要删除的用户必须应是已存在的.

MongoDB对集合collection的操作

Collection是MongoDB中存储数据的最小单元.

列出连接数据库下的所有集合

         DB db = mongo.getDB("mydb");
        //指定安全授权信息[超级用户的用户名为root,密码为root123]
        db.authenticate("mydbusr", "123".toCharArray());

        //列出mydb数据库中的所有collection
        Set<String> collets = db.getCollectionNames();
        for(String str : collets){
            System.out.println(str);
        }

判断某个collection是否存在

        //判断user集合是否存在,返回值为boolean类型
        System.out.println(db.collectionExists("user"));

新建collection

Java可以通过DB类的createCollection(String name, DBObject option)方法新建集合

参数说明

第一个参数表示创建的collection的名字

第二个参数决定了是否创建的是Capped Collection.

        //创建非CappedCollection对象,false表示不是一个CappedCollection
        DBObject optial = new BasicDBObject().append("capped", false);
        //显示创建非CappedCollection
        db.createCollection("nocapped", optial);
        System.out.println(db.getCollection("nocapped").getStats().toString());

        //创建CappedCollection对象,true表示是一个CappedCollection
        DBObject opt = new BasicDBObject().append("capped", true).append("max", 5);
        db.createCollection("iscapped", opt);

        System.out.println(db.getCollection("iscapped").getStats().toString());

        //使用isCapped()判断是否为CappedCollection
        System.out.println(db.getCollection("nocapped").isCapped()); //false
        System.out.println(db.getCollection("iscapped").isCapped()); //true

删除collection

通过DBCollection的drop()方法删除集合.

         DBCollection collect = db.getCollection("iscapped");
        collect.drop();    //删除iscapped集合

计算document数量

        //控制台插入测试数据for (i=1; i<=5;i++){ db.user.insert( {name:"user"+i , age: i+4*5 } ); }
        DBCollection collectuser = db.getCollection("user");
        System.out.println("集合" + collectuser + "下共有" + collectuser.getCount() + "条记录");

        BasicDBObject  obj = new BasicDBObject();
        BasicDBObject gtTag = new BasicDBObject();
        gtTag.put("$gt", 23);
        //db.user.find({age:{$gt:23}});
        obj.put("age", gtTag);
        System.out.println("集合" + collectuser + "下年龄大于25的共有" + collectuser.getCount(obj) + "条记录");

控制台输出
集合user下共有5条记录
集合user下年龄大于25的共有2条记录

通过游标获取所有document

Java可以通过游标DBCursor的方式来获取每一条document.

        DBCollection collection = db.getCollection("user");
        //用游标获取所有数据
        DBCursor cur = collection.find();
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
也可以查询部分,如部分显示:DBCursor cur = collection.find().limit(3);    

对索引的操做

创建索引

Java可以通过DBCollection类的createIndex(DBObject keys)方法创建索引,它接收一个DBObject类型的参数“keys”用于表明在哪些列上创建索引.

        DBCollection collection = db.getCollection("user");
        //在user集合的name列上创建索引
        collection.createIndex(new BasicDBObject("name",1));
可以通过db.user.getIndexes();查看索引信息

获取索引

DBCollection类的getIndexInfo();

        DBCollection collection = db.getCollection("user");
        //获取集合中的所有索引信息
        List<DBObject> list = collection.getIndexInfo();
        for(DBObject var : list){
            System.out.println(var);
        }
类似于 db.user.getIndexes();

删除索引

DBCollection的dropIndexes()删除当前集合中的所有索引.

        DBCollection collection = db.getCollection("user");

        //删除集合中的指定索引信息,删除name索引,1表示删除为真
        collection.dropIndex(new BasicDBObject("name",1));

        //删除该集合中所有索引[_id索引不支持删除]
        collection.dropIndexes();
可以通过db.user.getIndexKeys();查看user集合中的索引

Java对MongoDB的高级查询

使用QueryBuilder查询构造器对MongoDB进行高级查询

SQL语句:
         select * from user where username = ‘user3’;
MongoDB:
         db.user.find( { name:"user3"} );
Java代码:
        DBCollection collection = db.getCollection("user");
        //查询用户名为user3的用户
        DBObject query = new QueryBuilder().put("name").is("user3").get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
输出结果:
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee7"} , "name" : "user3" , "age" : 23.0}

notEquals不等于

查询user集合中用户名name值不等于user3的用户

SQL语句:
         select * from user where username != ‘user3’;
MongoDB:
         db.user.find( { name:{$ne:"user3"} } );
Java代码:
        DBCollection collection = db.getCollection("user");
        //查询用户名不为user3的用户
        DBObject query = new QueryBuilder().put("name").notEquals("user3").get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }
输出结果:
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee5"} , "name" : "user1" , "age" : 21.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee6"} , "name" : "user2" , "age" : 22.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee8"} , "name" : "user4" , "age" : 24.0}
          { "_id" : { "$oid" : "50f6d250778eafb6ef5bcee9"} , "name" : "user5" , "age" : 25.0}

greaterThan大于

查询user集合中age大于22的用户

SQL语句:
         select * from user where age > 22;
MongoDB:
         db.user.find( { age:{$gt:22} } );
QueryBuilder构造:
        DBObject query = new QueryBuilder().put("age").greaterThan(22).get();

greaterThanEquals大于等于

查询user集合中age大于等于22的用户

SQL语句:
         select * from user where age >= 22;
MongoDB:
         db.user.find( { age:{$gte:22} } );
QueryBuilder构造:
        DBObject query = new QueryBuilder().put("age").greaterThanEquals(22).get();

lessThan小于

查询user集合中age小于22的用户

SQL语句:
         select * from user where age < 22;
MongoDB:
         db.user.find( { age:{$lt:22} } );
QueryBuilder构造:
        DBObject query = new QueryBuilder().put("age").lessThan(22).get();

lessThanEquals小于等于

查询user集合中age小于等于22的用户

SQL语句:
         select * from user where age <= 22;
MongoDB:
         db.user.find( { age:{$lte:22} } );
QueryBuilder构造:
        DBObject query = new QueryBuilder().put("age").lessThanEquals(22).get();

In范围内

查询user集合中age在23或24的记录

SQL语句:
         select * from user where age in (23,24);
MongoDB:
         db.user.find( { age:{$in:[23,24]} } );
Java代码:
        DBCollection collection = db.getCollection("user");
        //查询user集合中age为23或者24的用户
        int[] inList = {23,24};
        DBObject query = new QueryBuilder().put("age").in(inList).get();
        DBCursor cur = collection.find(query);
        while(cur.hasNext()){
            System.out.println(cur.next());
        }

notIn范围外

查询user集合中age不是23或24的记录

SQL语句:
         select * from user where age not in (23,24);
MongoDB:
         db.user.find( { age:{$nin:[23,24]} } );
Java代码:
        DBCollection collection = db.getCollection("user");
        //查询user集合中age为23或者24的用户
        int[] inList = {23,24};
        DBObject query = new QueryBuilder().put("age").notIn(inList).get();
        DBCursor cur = collection.find(query);
        

and逻辑与

查询user集合中age大于22并且性别为”man“的用户

SQL语句:
         select * from user where sex = ‘man’ and age > 20;
MongoDB:
         db.user.find({sex:"man",age:{$gt:20}});
Java代码:
        //查询user集合中age大于22并且性别为”man“的用户
        DBObject query = new QueryBuilder().put("sex").is("man").and("age").greaterThan(20).get();

正则表达式

查询name以user开头的记录

SQL语句:
         select * from user where name like ‘user%’;
MongoDB:
         db.user.find({name:/^user.*/});
Java代码:
        DBCollection collection = db.getCollection("user");
        Pattern pattern = Pattern.compile("^user");
        BasicDBObject query = new BasicDBObject("name",pattern);

分页查询

mongoDB中通过skip()和limit()结合实现分页

    public static void main(String[] args) {

        Mongo mongo = null;
        try {
            //通过连接字符串得到一个数据库实例的连接
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //连接超级用户
        DB db = mongo.getDB("mydb");
        //指定安全授权信息[超级用户的用户名为root,密码为root123]
        db.authenticate("mydbusr", "123".toCharArray());

        int  perNum = 10;        //每页显示的数目
        int  count = 0;            //数据库中总共记录数目
        int  pageNum = 0;        //分页后的页数

        DBCollection collection = db.getCollection("user");

        count = (int)collection.getCount();        //总共记录数
        pageNum = (count-1)/perNum + 1;            //计算总共页数

        System.out.println("数据库"+collection+"中共有"+count+"条记录,每页显示"+perNum+"条记录,可显示"+pageNum+"页");

        //循环分页打印
        for(int i=0; i<pageNum; i++){
            System.out.println("------------第" + (i+1) + "页数据------------");
            DBCursor cur = collection.find().skip(i*perNum).limit(perNum);
            while(cur.hasNext()){
                System.out.println(cur.next());
            }
        }
    }

Java操作GridFS

插入数据

使用GridFS类的createFile(File file)方法可以将大文件保存到MongoDB中,该方法接收一个参数,表示本地文件路径

public static void main(String[] args) {
        Mongo mongo = null;
        try {
            mongo = new Mongo("127.0.0.1",27017);
        } catch (Exception e) {
            // TODO: handle exception
        }
        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());

        File zipFile = new File("D:/freemarker源码.rar");    //创建文件对象
        //将文件存放到file数据库中
        GridFS gfs = new GridFS(db,"file");    

        //创建大文件对象输入流
        GridFSInputFile gfsFile = null;
        try {
            //将本地文件存储到mongo中
            gfsFile = gfs.createFile(zipFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //设置存储的文件名
        gfsFile.setFilename("demozip");
        gfsFile.save();
    }
在mydb数据库下查看存储的文件信息
> db
mydb
> show collections;
file.chunks
file.files
system.indexes
system.users
user
> db.file.files.findOne();
{
        "_id" : ObjectId("50f780a7de886482c92a56c9"),
        "chunkSize" : NumberLong(262144),
        "length" : NumberLong(83711),
        "md5" : "51f235ccf838511eb0f53633dbca22b3",
        "filename" : "demozip",
        "contentType" : null,
        "uploadDate" : ISODate("2013-01-17T04:40:07.240Z"),
        "aliases" : null
}

查询数据

因为上传了一个zip文档,为了方便观察,使用GridFS类的findOne(DBObject query)方法,按文件名查找数据库中的GridFS对象信息,该方法结束1个参数,代表查询条件.

        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());

        //将文件存放到file数据库中
        GridFS gfs = new GridFS(db,"file");    

        //查询GridFS数据,按照文件名查询 db.file.files.findOne({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        System.out.println(zipfile);

读取并保存数据

首先用find或者findOne方法找到GridFS对象,再用writeTo方法将数据写到本地.

        DB db = mongo.getDB("mydb");
        db.authenticate("mydbusr", "123".toCharArray());

        GridFS gfs = new GridFS(db,"file");    

        //查询GridFS数据,按照文件名查询 db.file.files.find({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        System.out.println("服务器端文件MD5值为:" + zipfile.getMD5());
        try {
            //将读取到的文件写到本地
            zipfile.writeTo("E:/downgidfs.zip");
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
控制台输出:服务器端文件MD5值为:51f235ccf838511eb0f53633dbca22b3
验证下载到的文件的MD5
E:\>md5sum downgidfs.zip
51f235ccf838511eb0f53633dbca22b3 *downgidfs.zip

删除数据

Java中使用remove(DBObject query)来实现移除数据

        GridFS gfs = new GridFS(db,"file");
        //查询GridFS数据,按照文件名查询 db.file.files.find({filename:"demozip"});
        GridFSDBFile zipfile = gfs.findOne("demozip");
        //删除查询到的GridFS数据
        gfs.remove(zipfile);

转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/01/29/2881006.html]

时间: 2024-08-08 23:42:29

mongodb在Java开发中的应用的相关文章

java开发中的那些事(5)--------一点经历,败给2分钟的2个小时

特意记下这个经历,这个让我感慨万千又斗志昂扬的一次经历,这是经验,也是生活. 故事的始末是这样的,先给大家上几句代码,现在身在家中,只能凭记忆敲打几行,大致意思倒不会错: {field:'code',align:'center'} {field:'btfid',align:'center',hidden:'true', formatter:function(value,row,rowIndex){ return "<a href="javascript:void(0)"

java开发中使用的工厂设计模式

package gongchangdemo; /* * 在java开发中使用较多的一种设计模式:工厂模式:就是一个过渡端 * 通过过度端来取得接口的实例化对象,这个过渡端就称为工厂factory * 这个模式主要是为了解决修改子类,必须要修改main方法,而main方法主要是客户端,客户端 * 经常变来变去不太好,就引进:工厂模式 */ public class gongchangdemo { public static void main(String args[]) { //getinsta

完整java开发中JDBC连接数据库代码和步骤

完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(Class

java开发中截取上传文件的文件名和后缀名

java开发中截取上传文件的文件名和后缀名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String f

java开发中的那些事(3)-------最常用到的几个快捷键

今天去看了韩寒的<后会无期>,感慨颇多. 这里记录下现在常会用到的几个快捷键,不多,却是当前最常用到: 1.ctrl+f  ----------------"搜索", 这个应该在大多数人来说都太简单了,可惜我也是知道不长时间: 2.ctrl+shift+r  --------"工程内搜索",这个也是搜索,不过是搜索整个工程的,这个知道后美滋滋了好久: 3.ctrl+/  ----------------"简单注释","//&

Java 开发中的对象拷贝

前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提供的属性拷贝 在 Spring 中直接调用 BeanUtils.copyProperties();即可. 它的核心通过循环 target 的所有方法名,然后在 source 中找到对应的方法名,最后通过反射从 source 中获取并写入 target 中. Spring 没有通过 java.lang

JAVA开发中相对路径,绝对路径全面总结

JAVA开发中相对路径,绝对路径全面总结 博客分类: Java综合 JavaJSP应用服务器Servlet网络应用 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://www.sun.com/index.htm也代表了一个 URL绝对路径. 相对路径:相对与某个基准目录的路径.包含Web的相对路径(HTML中的相对目录),例如:在 Servlet中,"/

记录:Protocol&#160;Buffers(protobuf)在Java开发中使用

数据交换的方式很多比如:XML,JSON,Protobuf.虽然protobuf很流行,并且系出名门,可是没怎么用过.通过阅读google developers里关于protocal-buffers的内容基本可以使用它了.如果你访问该链接https://developers.google.com/protocol-buffers/ 失败的话,肯能需要VPN服务. 语言手册:https://developers.google.com/protocol-buffers/docs/proto Prot

java开发中的那些事(6)------一次ajax调用中的问题

这个周末就要到这次开发任务的结尾了,不过也到这时候了,才发现用起来比较顺手了,前几次项目中也有过啊,说起来实实在在用过的才3个项目,就分别用了不同的,着实有些痛苦啊,初学阶段的jsp+servlet还算是初学,可这后面的loushang和ssh2是让我欢喜让我忧啊,高兴的是框架的魅力让我情不自禁,可这样的框架我啥时候才能自己组的那么完善,甚至现在用起来还磕磕绊绊的.总结下这次的大收获的话,一方面是这个框架,另一方面的话就是ajax和json了,这个在我来说是比较陌生的地方,虽然现在我可以用,但原