zoukankan      html  css  js  c++  java
  • Mongodb总结2-Java版本的HelloWorld-CRUD例子

      2013年,写的CRUD太简单了,今天在原来的基础上,稍微完善了下,用了更多语法,比如排序sort、in语句等。

      参考了《Mongodb权威指南-第1版-高清》,等下上传到CSDN下载频道,免积分下载。


      代码写得够清晰了,不再过多解释。


     

    package mongodb;
    
    import java.net.UnknownHostException;
    import java.util.Date;
    
    import com.mongodb.BasicDBList;
    import com.mongodb.BasicDBObject;
    import com.mongodb.CommandResult;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.DBCursor;
    import com.mongodb.DBObject;
    import com.mongodb.Mongo;
    import com.mongodb.WriteResult;
    
    /**
     * MongoDB-CRUD Demo。
     * 
     * 
     */
    public class MongoDBDemo {
    	// /////////////数据库地址常量/////////////////////
    	/**
    	 * 数据库地址
    	 */
    	public static final String DEFAULT_HOST = "localhost";// localhost
    	/**
    	 * 端口号
    	 */
    	public static final int DEFAULT_PORT = 27017;
    	// //////////////数据库名称和集合常量/////////////////
    	/**
    	 * 数据库名称
    	 */
    	public static final String DB_BLOG = "blog";
    	/**
    	 * 集合名称
    	 */
    	public static final String DB_BLOG_COLLECTION = "article";
    
    	// /////////////文章Article的属性名称常量/////////////////////
    	/**
    	 * 标题
    	 */
    	public static final String TITLE = "title";
    	/**
    	 * 内容
    	 */
    	public static final String CONTENT = "content";
    	/**
    	 * 作者
    	 */
    	public static final String AUTHOR = "author";
    	/**
    	 * 日期
    	 */
    	public static final String DATE = "date";
    	public static final String ID = "id";
    
    	public static void main(String[] args) throws UnknownHostException {
    
    		Mongo mogo = new Mongo(DEFAULT_HOST, DEFAULT_PORT);
    		// 获得数据库
    		DB blogDb = mogo.getDB(DB_BLOG);
    		DBCollection articleCollection = blogDb
    				.getCollection(DB_BLOG_COLLECTION);
    
    		buildThreeArticles(articleCollection);
    
    		// 查找并打印作者为"FansUnion"的文章
    		BasicDBObject searchArticleByAuthor = new BasicDBObject();
    		searchArticleByAuthor.append(AUTHOR, "FansUnion");
    
    		demoFindByField(articleCollection, searchArticleByAuthor);
    		demoFindAndSort(articleCollection, searchArticleByAuthor);
    
    		BasicDBObject searchArticleById = new BasicDBObject();
    		searchArticleById.append(ID, 3L);
    		demoFindById(articleCollection, searchArticleById);
    
    		demoFindSpecialField(articleCollection, searchArticleById);
    
    		demoFindWithIn(articleCollection);
    
    		demoUpdateWithTwoWay(articleCollection, searchArticleByAuthor);
    
    		demoRemove(articleCollection);
    		// 集合中的文档数量
    		long count = articleCollection.count();
    		println("删除了刚刚新建的3条记录,剩余count=" + count);
    
    		// 关闭连接
    		mogo.close();
    	}
    
    	//删除数据
    	private static void demoRemove(DBCollection articleCollection) {
    		// 删除
    		BasicDBObject removeCondition = new BasicDBObject();
    		removeCondition.append(AUTHOR, "FansUnion");
    		articleCollection.remove(removeCondition);
    
    		BasicDBObject removeCondition2 = new BasicDBObject();
    		removeCondition.append(TITLE, "HelloWorld");
    		// 删除,并查看是否有报错
    		WriteResult writeResult = articleCollection.remove(removeCondition2);
    		CommandResult commandResult = writeResult.getLastError();
    		println("查看error信息,发现err字段为空" + commandResult.toString());
    
    		BasicDBObject removeAll = new BasicDBObject();
    		articleCollection.remove(removeAll);
    	}
    
    	//2种方式更新对象
    	private static void demoUpdateWithTwoWay(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		// 把标题为"HelloWorld"的文章的作者,修改为“小雷”
    		println("把标题为HelloWorld的文章的作者,修改为小雷,只修改AUTHOR1个字段");
    		// 查询条件:标题为"HelloWorld"
    		BasicDBObject updateCondition = new BasicDBObject();
    		searchArticleByAuthor.append(TITLE, "HelloWorld");
    
    		BasicDBObject newHelloWorldArticle = new BasicDBObject();
    		newHelloWorldArticle.append(AUTHOR, "小雷");
    
    		// 第1种方式-修改,只修改指定的字段("$set","$inc"都是修改器)
    		// update Article set author="小雷" where title='HelloWorld'
    		DBObject updateSetValue = new BasicDBObject("$set",
    				newHelloWorldArticle);
    		articleCollection.update(updateCondition, updateSetValue);
    		// 打印第1次修改过的"HelloWorld"文章
    		DBObject helloWordlArticle2 = articleCollection
    				.findOne(updateCondition);
    		print(helloWordlArticle2);
    
    		// 第2种方式-修改
    		// update Article set author="小雷",title=null,content=null,date=null
    		// where title='HelloWorld'
    		println("把标题为HelloWorld的文章的作者,修改为小雷,修改了所有的字段");
    		articleCollection.update(updateCondition, newHelloWorldArticle);
    		DBObject helloWordlArticle = articleCollection.findOne(updateCondition);
    		// 打印第2次修改过的"HelloWorld"文章
    		print(helloWordlArticle);
    	}
    
    	//Mongodb中的in语句
    	private static void demoFindWithIn(DBCollection articleCollection) {
    		// IN查询
    		println("查找并打印ID为1和2的文章");
    		// List list = Arrays.asList(1,2);
    		// Long[] array= new Long[]{1L,2L};
    
    		BasicDBList values = new BasicDBList();
    		values.add(1);
    		values.add(2);
    
    		DBObject inQuery = new BasicDBObject("$in", values);
    
    		DBObject con = new BasicDBObject();
    		con.put(ID, inQuery);
    		DBCursor cursorIdArray = articleCollection.find(con);
    		println("个数:" + cursorIdArray.count());
    		while (cursorIdArray.hasNext()) {
    			print(cursorIdArray.next());
    		}
    	}
    
    	//查询特定的字段
    	private static void demoFindSpecialField(DBCollection articleCollection,
    			BasicDBObject searchArticleById) {
    		println("查找并打印ID为3的文章2,只查询TITLE字段");
    		BasicDBObject b = new BasicDBObject();
    		b.append(TITLE, 1);
    		DBCursor cursor3 = articleCollection.find(searchArticleById, b);
    		println("个数:" + cursor3.count());
    		while (cursor3.hasNext()) {
    			print(cursor3.next());
    		}
    		// cursor3.close();//在没有这行代码的情况下,同样的程序,出现了1次,个数为4,仔细看,发现他们的内置ID不一样
    		// 可能是上一次执行的删除,还没有完成?
    		//这个地方是一个疑问,但是复现不了
    	}
    
    	//根据ID查找对象
    	private static BasicDBObject demoFindById(DBCollection articleCollection,
    			BasicDBObject searchArticleById) {
    		// 查找并打印ID为3的文章
    		println("查找并打印ID为3的文章");
    
    		DBCursor cursor2 = articleCollection.find(searchArticleById);
    		println("个数:" + cursor2.count());
    		while (cursor2.hasNext()) {
    			print(cursor2.next());
    		}
    		cursor2.close();
    		return searchArticleById;
    	}
    
    	//查找对象,并排序
    	private static void demoFindAndSort(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		// 查找并打印作者为"FansUnion"的文章,按照ID降序排列
    		println("查找并打印作者为FansUnion的文章,降序排列,查询出来的ID一次为3,2,1");
    		BasicDBObject orderByIdDesc = new BasicDBObject();
    		orderByIdDesc.append(ID, -1);
    		DBCursor cursorIdDesc = articleCollection.find(searchArticleByAuthor)
    				.sort(orderByIdDesc);
    		while (cursorIdDesc.hasNext()) {
    			print(cursorIdDesc.next());
    		}
    	}
    
    	//根据字段查找对象
    	private static void demoFindByField(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		println("查找并打印作者为FansUnion的文章,查询出来的ID一次为1,2,3");
    		DBCursor cursor = articleCollection.find(searchArticleByAuthor);
    		while (cursor.hasNext()) {
    			print(cursor.next());
    		}
    		cursor.close();// 网上和书中的的例子,没有关闭游标,官方JDK文档“kills the current cursor on
    						// the server.”
    	}
    
    	// 构造3个文章,插入的ID顺序是1,2,3
    	private static void buildThreeArticles(DBCollection articleCollection) {
    
    		BasicDBObject article = buildArticle("做好社会主义的接班人", "好好学习,天天向上",
    				"FansUnion", new Date(), 1L);
    		BasicDBObject article2 = buildArticle("做好资本主义的掘墓人", "拼命干活,时时向上",
    				"FansUnion", new Date(), 2L);
    		BasicDBObject article3 = buildArticle("HelloWorld",
    				"I am a MongoDb demo.", "FansUnion", new Date(), 3L);
    		// 增加若干文章
    		articleCollection.insert(article);
    		articleCollection.insert(article2);
    		articleCollection.insert(article3);
    
    		println("插入文章的个数:" + articleCollection.count());
    	}
    
    	// 打印对象
    	private static void print(DBObject article) {
    		// println("-----------------------");
    		println("内置ID:" + article.get("_id"));
    		println("标题:" + article.get(TITLE));
    		println("内容:" + article.get(CONTENT));
    		println("作者:" + article.get(AUTHOR));
    		println("日期:" + article.get(DATE));
    		println("ID:" + article.get(ID));
    		println("-----------------------");
    	}
    
    	private static void println(Object object) {
    		System.out.println(object);
    	}
    
    	/**
    	 * 构造1个文章对象
    	 * 
    	 * @param title
    	 *            标题
    	 * @param content
    	 *            内容
    	 * @param author
    	 *            作者
    	 * @param date
    	 *            日期
    	 * @return 文章对象
    	 */
    	private static BasicDBObject buildArticle(String title, String content,
    			String author, Date date, Long id) {
    		BasicDBObject article = new BasicDBObject();
    		article.append(TITLE, title);
    		article.append(CONTENT, content);
    		article.append(AUTHOR, author);
    		article.append(DATE, date);
    		article.append(ID, id);
    		return article;
    	}
    }

    代码执行结果

    插入文章的个数:3
    查找并打印作者为FansUnion的文章,查询出来的ID一次为1,2,3
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    查找并打印作者为FansUnion的文章,降序排列,查询出来的ID一次为3,2,1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    查找并打印ID为3的文章
    个数:1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    查找并打印ID为3的文章2,只查询TITLE字段
    个数:1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:null
    作者:null
    日期:null
    ID:null
    -----------------------
    查找并打印ID为1和2的文章
    个数:2
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    把标题为HelloWorld的文章的作者,修改为小雷,只修改AUTHOR1个字段
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:小雷
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    把标题为HelloWorld的文章的作者,修改为小雷,修改了所有的字段
    内置ID:561baace3aea5b925fddc83c
    标题:null
    内容:null
    作者:小雷
    日期:null
    ID:null
    -----------------------
    查看error信息,发现err字段为空{ "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 1 , "connectionId" : 1 , "err" :  null  , "ok" : 1.0}
    删除了刚刚新建的3条记录,剩余count=0

  • 相关阅读:
    try-catch 回滚事务,避免回滚失效的操作
    Java 7中的Try-with-resources
    Linux开发环境之配置静态IP地址
    Windows和Linux系统如何退出python命令行
    Python基础(一)
    Linux开发环境之nginx
    Linux开发环境之安装自带jdk
    Linux删除命令的几种方式
    MySQL之新建索引原则
    webapp环境搭建(一)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462699.html
Copyright © 2011-2022 走看看