文档章节

[MongoDB学习日志]Java对MongoDB的CRUD操作

secondriver
 secondriver
发布于 2015/09/17 09:25
字数 1720
阅读 66
收藏 1

  说起Java操作数据库自然会想到Sun的知名品牌JDBC,对于MongoDB这样的NoSQL数据库,暂时没有像JDBC这样的标准。

  这篇文章中对目前的形势做了分析和憧憬http://www.csdn.net/article/2012-06-21/2806842


  回到正题记录下熟悉MongoDB为Java语言提供的操作接口mongo-java-driver.jar


  1.基本的根基不变,连接数据库

  2.基本的数据库操作不变,CRUD

  3.变化的是提供的接口,实现类名,操作对象大不相同

  4.变化的是没有标准的Java操作MongoDB的标准API


  MongoDB提供的Java操作API可以说是对Mongo数据库命令的Java翻译,熟悉Mongo命令,熟悉Java操作数据库的基本思路,很容易掌握基本操作。


  •   数据库连接

    package com.im;
    public final class SystemConstant {
        public static final class Configure {
            public static final String HOST = "127.0.0.1";
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
            public static final int PORT = 27017;
            public static final String USERNAME = "";
            public static final String PASSWORD = "";
            public static final String DATABASE = "im";
        }
    }
    package com.im;
    import java.net.UnknownHostException;
    import com.mongodb.Mongo;
    import com.mongodb.MongoException;
    public class MongoFactory {
        private static MongoFactory mongoFactory;
        private MongoFactory() {
        }
        public static MongoFactory getInstance() {
            if (mongoFactory == null) {
                mongoFactory = new MongoFactory();
            }
            return mongoFactory;
        }
        public Mongo getMongo() {
            Mongo mongo = null;
            try {
                mongo = new Mongo(SystemConstant.Configure.HOST,
                        SystemConstant.Configure.PORT);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (MongoException e) {
                e.printStackTrace();
            }
            return mongo;
        }
    }


      数据库链接少不了的主机名,端口号,数据库名称。上面代码中的Mongo对象就相当与Connection对象。


  • 数据库的操作

    下面的每个方法代表一个方面的测试

    测试类初始化方法:

    private static BaseDao dao;
        @BeforeClass
        public static void start() {
            dao = new BaseDao("users","uf");
        }

    关于BaseDao是对Mongo操作数据库的基本常用的方法做了封装的一个DAO对象,代码会在本文末尾附上。



j_0001.gif     插入:


// 添加一条记录
    public void test1() {
        BasicDBObject jo = new BasicDBObject();
        jo.put("_id", "00001");
        jo.put("name", "Tomcat");
        jo.put("age", 22);
        jo.put("interest", new String[] { "swimming", "Taiji", "football" });
        int actual = dao.insert(jo);
        System.out.println(actual);
        Assert.assertEquals(1, actual);
    }


// 添加多条记录
    public void test2() {
        int actual = 0;
        int size = 0;
        for (int i = 2; i < 11; i++) {
            BasicDBObject jo = new BasicDBObject();
            jo.put("_id", "0000" + i);
            jo.put("name", "Tomcat_" + i);
            jo.put("age", i * 2);
            jo.put("interest", new String[] { "swimming", "Taiji" });
            actual += dao.insert(jo);
            size++;
        }
        Assert.assertEquals(size, actual);
    }



   BasicDBObject对象是Mongo的BSONObject的基本实现类,而BSONObject对象正是Key-Value的形式的Map保存到数据库中。


j_0001.gif    基本的查询(主键查询,查询集合,条件查询)

// 查询指定编号的记录
    public void test3() {
        BasicDBObject query = new BasicDBObject();
        query.put("_id", "00001");
        List<DBObject> dboList = dao.query(query);
        System.out.println(dboList.get(0).toString());
        Assert.assertEquals(1, dboList.size());
    }
    // 模糊查询,统计记录结果数量
    public void test4() {
        BasicDBObject query = new BasicDBObject();
        query.put("interest", new String[] { "swimming", "Taiji" });
        long count = dao.getCount(query);
        Assert.assertEquals(9, count);
    }
    // 模块查询,查询结果集合
    public void test5() {
        BasicDBObject query = new BasicDBObject();
        query.put("interest", new String[] { "swimming", "Taiji" });
        List<DBObject> dboList = dao.query(query);
        for (DBObject jo : dboList) {
            System.out.println(jo.toString());
        }
        Assert.assertEquals(9, dboList.size());
    }

  下面是插入数据后的数据库的数据情况,图中数据是各种测试后的数据,不完全对于每个方法的操作后数据库情况。

213445907.png



j_0001.gif更新操作

     Mongo更新操作要准备两个BasicDBObject对象,一个是要更新的对象,另一个是更新后的对象。

// 更新指定记录的信息
    public void test6() {
        BasicDBObject query = new BasicDBObject();
        query.put("_id", "00001");
        BasicDBObject jo = new BasicDBObject();
        jo.put("_id", "00001");
        jo.put("name", "Jackson");
        jo.put("interest", new String[] { "Song", "Taiji", "Running" });
        jo.put("firends",
                new BasicDBObject[] {
                        (BasicDBObject) dao.query(
                                new BasicDBObject("_id", "00002")).get(0),
                        (BasicDBObject) dao.query(
                                new BasicDBObject("_id", "00002")).get(0) });
        int actual = dao.update(query, jo);
        Assert.assertEquals(1, actual);
    }

j_0001.gif删除操作

// 删除指定记录
    public void test7() {
        BasicDBObject query = new BasicDBObject();
        query.put("_id", "000010");
        dao.delete(query);
        List<DBObject> dboList = dao.query(query);
        Assert.assertEquals(0, dboList.size());
    }


  Mongo删除比较容易,指定一个BasicDBObject作为匹配条件,将删除匹配的所有记录(文档对象)。


j_0001.gif多条件查询

   在数据库的CRUD操作中查询操作更加多样化和频繁,Mongo的Java驱动程序中对Mongo数据自身的各种条件查询做了封装,提供一个QueryBuilder的类,将Mongo中的查询操作对象化,用此类来创建出要查询的条件,然后在进行基本查询。


// 指定多条件的查询
    public void test8() {
        BasicDBObject query = new BasicDBObject();
        BasicDBObject condition = new BasicDBObject();
        condition.put(QueryOperators.GTE, 10);
        query.put("age", condition);
        List<DBObject> dboList = dao.query(query);
        for (DBObject jo : dboList) {
            System.out.println(jo.toString());
        }
        Assert.assertEquals(5, dboList.size());
    }
    public void test9() {
        BasicDBObject query = new BasicDBObject();
        BasicDBObject condition = new BasicDBObject();
        condition.put(QueryOperators.GTE, 10);
        condition.put(QueryOperators.LTE, 16);
        query.put("age", condition);
        List<DBObject> dboList = dao.query(query);
        for (DBObject jo : dboList) {
            System.out.println(jo.toString());
        }
        Assert.assertEquals(4, dboList.size());
    }
    public void test10() {
        QueryBuilder qb = new QueryBuilder();
        BasicDBObject query = (BasicDBObject) qb.and("age")
                .greaterThanEquals(10).lessThanEquals(14).and("interest")
                .in(new String[] { "swimming", "Taiji","football" }).get();
        List<DBObject> dboList = dao.query(query);
        for (DBObject jo : dboList) {
            System.out.println(jo.toString());
        }
    }

  在test8方法中的查询条件是通过创建BasicDBObject来实现,如果条件更多这样操作会写很多代码而且不易将各个条件关联起来,后面的test9和test10方法则使用QueryBuilder来实现。





  上述对Mongo数据的操作侧重于准备查询条件,插入对象,删除条件,更新条件等,主要原因是Mongo数据库操作再不是我们以前SQL那样具有高度标准化的操作,相反更多的注意力集中到如何在程序语言中翻译Mongo命令操作,原因很简单没有统一的标准实现。


 至于数据库的基本操作Mongo的Java驱动自然要提供最基本的操作功能。


 附上BaseDao代码:


package com.im.dao;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import com.im.MongoFactory;
import com.im.SystemConstant;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteResult;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
public class BaseDao {
    /**
     * 数据库对象
     */
    private DB db;
    /**
     * 数据库文档对象(相当于RDBMS中的表)
     */
    private DBCollection dbCollection;
    /**
     * 数据库文件存在集合
     */
    private GridFS fs;
    public BaseDao(String docBucket, String fileBucket) {
        db = MongoFactory.getInstance().getMongo()
                .getDB(SystemConstant.Configure.DATABASE);
        this.dbCollection = db.getCollection(docBucket);
        if (fileBucket.endsWith("") || fileBucket == null) {
            fileBucket = "fs";
        }
        this.setFs(new GridFS(db, fileBucket));
    }
    /**
     * 插入文档
     *
     * @param jo
     * @return
     */
    public int insert(DBObject jo) {
        WriteResult wr = dbCollection.save(jo);
        return wr.getN();
    }
    /**
     * 删除文档
     *
     * @param jo
     *            删除的匹配文档
     */
    public void delete(DBObject jo) {
        dbCollection.remove(jo);
    }
    /**
     * 更新文档
     *
     * @param query
     *            指定更新的文档
     * @param jo
     *            更新后的文档
     * @return
     */
    public int update(DBObject query, DBObject jo) {
        WriteResult wr = dbCollection.update(query, jo);
        return wr.getN();
    }
    /**
     * 查询文档
     *
     * @param query
     *            查询的匹配文档
     * @return
     */
    public List<DBObject> query(DBObject query) {
        DBCursor dbc = dbCollection.find(query);
        List<DBObject> joList = new ArrayList<DBObject>();
        while (dbc.hasNext()) {
            DBObject jo = dbc.next();
            joList.add(jo);
        }
        return joList;
    }
    /**
     * 存储文件
     *
     * @param file
     */
    public void saveFile(File file) {
        try {
            GridFSInputFile gif = fs.createFile(file);
            gif.save();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 存储输入流,并指定的一些描述信息
     *
     * @param in
     * @param id
     * @param filename
     *            文件名
     * @param contentType
     *            文件内容类型
     */
    public void saveFile(InputStream in, Object id, String filename,
            Object contentType) {
        DBObject query = (DBObject) new BasicDBObject("_id", id);
        GridFSDBFile gff = fs.findOne(query);
        if (gff == null) {
            GridFSInputFile gif = fs.createFile(in);
            gif.setFilename(filename);
            gif.put("_id", id);
            gif.put("contentType", contentType);
            gif.save();
        }
    }
    /**
     * 查询指定ID的文件
     *
     * @param id
     * @return
     */
    public GridFSDBFile queryFile(Object id) {
        DBObject query = (DBObject) new BasicDBObject("_id", id);
        return fs.findOne(query);
    }
    /**
     * 查询指定文件名的文件
     *
     * @param filename
     * @return
     */
    public GridFSDBFile queryFile(String filename) {
        DBObject query = (DBObject) new BasicDBObject("filename", filename);
        return fs.findOne(query);
    }
    /**
     * 查询文件
     *
     * @param query
     *            查询的匹配文件
     * @return
     */
    public List<GridFSDBFile> queryFile(DBObject query) {
        return fs.find(query);
    }
    /**
     * 统计查询结果数
     *
     * @param query
     *            查询匹配的文档
     * @return
     */
    public long getCount(DBObject query) {
        return dbCollection.getCount(query);
    }
    public GridFS getFs() {
        return fs;
    }
    public void setFs(GridFS fs) {
        this.fs = fs;
    }
    public DBCollection getDbCollection() {
        return dbCollection;
    }
    public void setDbCollection(DBCollection dbCollection) {
        this.dbCollection = dbCollection;
    }
}


本文出自 “野马红尘” 博客,谢绝转载!

© 著作权归作者所有

secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
【MongoDB for Java】Java操作MongoDB

开发环境: System:Windows IDE:eclipse、MyEclipse 8 Database:mongoDB 开发依赖库: JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar Email:hoojo_@126.com Blog:http://blog.csdn.net/IB......

underA
2013/05/15
143
0
使用MongoDB和Spring Data创建一个简单的Java 的CRUD应用

MongoDB 是一个可扩展的、高性能的、开源的NoSQL数据库,跟传统的数据库不一样,MongoDB并不是将数据存储在表中,他将数据结构化为一个类似于JSON的文档中。这篇文章就是展示如何使用Java基于...

王振威
2012/07/21
8.5K
8
MongoDB 基本操作与MongoDB for JAVA

一、准备工作 1、 下载mongoDB 下载地址:http://www.mongodb.org/downloads 选择合适你的版本 相关文档:http://www.mongodb.org/display/DOCS/Tutorial 2、 安装mongoDB A、 不解压模式: ...

IT_小翼
2013/08/07
5.6K
1
Linux环境下将log4j的日志存储到mongoDB

单位有很多java项目,一般上生产的项目日志都是通过log4j打印在本地,平常开发同学要查看日志还要给他们开个专门的FTP,不利于集中维护管理,近日因工作需要,在网上看到相关技术资料,可把l...

基督山伯爵
2013/03/04
5.6K
3
BeginnersBook MongoDB 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
10/16
14
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 安装 mysql5.7 版本(全)

centos 安装 版本说明 :centos7,mysql5.7 ,不是 centos7 可能有些命令不兼容 安装 mysql-server # 下载并安装 mysql yum wget -i -c http://dev.mysql.com/get/mysql57-community-relea......

sanri1993
11分钟前
1
0
Spring3.x升级到Spring4.x-5.x时关于MappingJacksonHttpMessageConverter的报错问题

在Spring4.x或者以上的版本强使用(不然会报错): org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 如果是Spring4.0获者以下的版本可以使用MappingJacksonH...

code-ortaerc
13分钟前
1
0
OSG 渲染状态污染到其它节点怎么解决?

在根节点补上初始状态

洛克人杰洛
15分钟前
1
0
grid 布局 设置行列间距

本文转载于:专业的前端网站➪grid 布局 设置行列间距 <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="widt......

前端老手
27分钟前
2
0
spring-data-elasticsearch 和 Jackson 配合使用的bug

下面先简单描述项目。 项目依赖: dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-elasticsearch', version: '2.1.0.RELEASE'......

Landas
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部