文档章节

Mongodb总结3-稍微封装一下

FansUnion
 FansUnion
发布于 2015/10/22 10:29
字数 1113
阅读 13
收藏 0
点赞 0
评论 0

  上次发表的2,纯粹是Demo,演示API的用法。

  今天,稍微封装了下,看得更清楚。

 考虑到不容易做得很有通用性,所以封装的一般,换种场景需要直接修改代码,但是有一部分是可以复用的。


最近项目,很可能只需要4个接口,增加、修改、单个查询、批量查询,所以只封装了4个接口的用法。


package mongodb;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;

public class MongoDBDemoAdvance {

	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";

	//构造1个文章、修改之后再存、2个查询
	public static void main(String[] args) {

		Mongo mongo = MongoUtil.mongo();
		DB db = mongo.getDB("blog");

		Article article = buildArticle();
		DBCollection articleCollection = add(db, article);

		article.setId(2L);
		DBObject object2 = articleToObject2(article);
		articleCollection.insert(object2);

		Long id = 1L;
		Article articleBefore = findById(articleCollection, id);
		if (articleBefore != null) {
			System.out.println("刚刚新增的文章=" + articleBefore);
		}

		articleBefore.setTitle("标题被修改啦");
		update(articleCollection, articleBefore);
		Article articleAfter = findById(articleCollection, id);
		if (articleAfter != null) {
			System.out.println("修改后的文章=" + articleAfter);
		}

		List idList = Arrays.asList(1L, 2L);
		List<Article> articleList = findByIdList(articleCollection, idList);
		if (articleList != null) {
			for (Article a : articleList) {
				System.out.println(a);
			}
		}

		BasicDBObject removeAll = new BasicDBObject();
		articleCollection.remove(removeAll);
	}

	//增加
	public static DBCollection add(DB db, Article article) {
		DBObject object = articleToObject2(article);
		DBCollection articleCollection = db.getCollection("article");
		articleCollection.insert(object);
		return articleCollection;
	}

	//构造测试数据
	private static Article buildArticle() {
		Article article = new Article();
		article.setAuthor("FansUnion");
		article.setContent("neirong");
		article.setDate(new Date());
		article.setId(1L);
		article.setTitle("title");
		return article;
	}

	// 从集合中,根据ID查找
	public static Article findById(DBCollection collection, Long id) {
		BasicDBObject searchArticleById = new BasicDBObject();
		searchArticleById.append(ID, id);
		Article articleBefore = null;
		DBCursor cursor = collection.find(searchArticleById);
		while (cursor.hasNext()) {
			DBObject articleObject = cursor.next();
			articleBefore = objectToArticle(articleObject);

			String internalId = articleObject.get("_id").toString();
			articleBefore.setInternalId(internalId);
		}
		cursor.close();
		return articleBefore;
	}

	// 修改
	public static void update(DBCollection collection, Article article) {
		if (article.getId() == null) {
			return;
		}

		BasicDBObject updateCondition = new BasicDBObject();
		updateCondition.append(ID, article.getId());

		DBObject newObject = BeanUtil.bean2DBObject(article);

		DBObject updateSetValue = new BasicDBObject("$set", newObject);
		collection.update(updateCondition, updateSetValue);
	}

	//根据ID集合查找
	public static List<Article> findByIdList(DBCollection collection,
			List<Long> idList) {
		BasicDBList values = new BasicDBList();
		values.addAll(idList);

		DBObject inQuery = new BasicDBObject("$in", values);

		DBObject con = new BasicDBObject();
		con.put(ID, inQuery);
		DBCursor cursorIdArray = collection.find(con);

		List<Article> articleList = new ArrayList<Article>();
		while (cursorIdArray.hasNext()) {
			DBObject articleObject = cursorIdArray.next();
			Article article = new Article();
			BeanUtil.dbObject2Bean(articleObject, article);
			String internalId = articleObject.get("_id").toString();
			article.setInternalId(internalId);

			articleList.add(article);
		}
		return articleList;
	}

	//对象转换
	private static Article objectToArticle(DBObject object) {
		if (object == null) {
			return null;
		}
		Article article = new Article();
		// 用工具方法转换,手动转换,需要判断类型,比较麻烦
		article = BeanUtil.dbObject2Bean(object, article);
		return article;
	}

	// 手动把Bean转换为Mongodb的对象
	private static BasicDBObject articleToObject(Article article) {
		BasicDBObject object = new BasicDBObject();
		object.append(TITLE, article.getTitle());
		object.append(CONTENT, article.getContent());
		object.append(AUTHOR, article.getAuthor());
		object.append(DATE, article.getDate());
		object.append(ID, article.getId());
		return object;
	}

	// 实用工具转换,简单
	private static DBObject articleToObject2(Article article) {
		return BeanUtil.bean2DBObject(article);
	}
}

和上一篇总结2的区别


1.文章先用Java对象表示。

public class Article {
private Long id;
private String title;
private String content;
private String author;
private Date date;

}

2.Mongodb的参数用个配置类。

public class MongodbConfig {


private String host;
private String port;
private String db;

}


3.Mongodb获得连接,用个类表示。

public class MongoUtil {
	public static final int DEFAULT_PORT = 27017;
	public static final String DEFAULT_HOST = "172.17.100.150";

	private static Mongo instance;

	@Resource(name="mongodbConfig")
	private static MongodbConfig mongodbConfig;	
	
	public static Mongo mongo() {
		try {
			if (instance == null) {
				instance = new Mongo(DEFAULT_HOST, DEFAULT_PORT);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return instance;
	}

	public static void close() {
		if (instance != null) {
			instance.close();
		}
	}

}

4.Bean工具类,把Java对象和Mongodb对象进行转换。

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.ArrayUtils;

import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;

public class BeanUtil {

	/**
	 * 把实体bean对象转换成DBObject
	 */
	public static <T> DBObject bean2DBObject(T bean)
	 {
		if (bean == null) {
			return null;
		}
		DBObject dbObject = new BasicDBObject();
		// 获取对象对应类中的所有属性域
		Field[] fields = bean.getClass().getDeclaredFields();
		//父类的属性
		Field[] parentFields=bean.getClass().getSuperclass().getDeclaredFields();
		//合并
		Field[] allFeilds=(Field[]) ArrayUtils.addAll(fields, parentFields);
		for (Field field : allFeilds) {
			// 获取属性名
			String varName = field.getName();
			// 修改访问控制权限
			boolean accessFlag = field.isAccessible();
			if (!accessFlag) {
				field.setAccessible(true);
			}
			Object param;
			try {
				param = field.get(bean);
				if (param == null) {
					continue;
				} else if (param instanceof Integer) {// 判断变量的类型
					int value = ((Integer) param).intValue();
					dbObject.put(varName, value);
				} else if (param instanceof String) {
					String value = (String) param;
					dbObject.put(varName, value);
				} else if (param instanceof Double) {
					double value = ((Double) param).doubleValue();
					dbObject.put(varName, value);
				} else if (param instanceof Float) {
					float value = ((Float) param).floatValue();
					dbObject.put(varName, value);
				} else if (param instanceof Long) {
					long value = ((Long) param).longValue();
					dbObject.put(varName, value);
				} else if (param instanceof Boolean) {
					boolean value = ((Boolean) param).booleanValue();
					dbObject.put(varName, value);
				} else if (param instanceof Date) {
					Date value = (Date) param;
					dbObject.put(varName, value);
				}
				// 恢复访问控制权限
				field.setAccessible(accessFlag);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				e.printStackTrace();
			}
			
		}
		return dbObject;
	}

	/**
	 * 把DBObject转换成bean对象
	 */
	public static <T> T dbObject2Bean(DBObject dbObject, T bean) {
		if (bean == null) {
			return null;
		}
		Field[] fields = bean.getClass().getDeclaredFields();
		Field[] parentFields=bean.getClass().getSuperclass().getDeclaredFields();
		Field[] allFeilds=(Field[]) ArrayUtils.addAll(fields, parentFields);
		for (Field field : allFeilds) {
			String varName = field.getName();
			Object object = dbObject.get(varName);
			if (object != null) {
				try {
					BeanUtils.setProperty(bean, varName, object);
				} catch (IllegalAccessException | InvocationTargetException e) {
					e.printStackTrace();
				}
			}
		}
		return bean;
	}
}

5.方法封装的,看起来更清晰。

add、findById、update、findByIdList。

上次的demo**,主要是演示。


6.特别说明,BeanUtil中把Mongodb对象和Java对象互相转换的时候,要考虑到简单的继承"extends"情况。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 56
博文 857
码字总数 825464
作品 0
丰台
高级程序员
Spring boot中mongodb的使用

mongodb的增删改查 Spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb: 1、pom包配置 pom包里面添加spring-boot-starter-dat...

glen_xu ⋅ 06/11 ⋅ 0

Node连接MySQL并封装其增删查改

Node连接MySQL并封装其增删查改 Node连接Mysql 说到node,可能大家会想到MOngoDB作为数据库,这里将会介绍node与mysql的连接,并分享了封装好的实例代码,在项目开发中可直接使用。下一篇博客...

优惠券活动 ⋅ 05/18 ⋅ 0

一把双刃剑:关于MongoDB的学习和避坑

  【IT168 评论】MongoDB 是一把双刃剑,它对数据结构的要求并不高。数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档。所以我们在使用的过程中非常方便。正是这种方便...

博客园 ⋅ 05/28 ⋅ 0

MongoDB之compact操作详解

摘要: compact操作步骤很多,但是可以有效减少磁盘使用量。 MongoDB与磁盘 当Fundebug处理的数据越来越多,这导致MongoDB的磁盘使用量越来越多,增长也越来越快。于是,我开始定时删除过期数...

Fundebug ⋅ 04/27 ⋅ 0

Spring从MongoDB中下载文件之GridFS

问题 之前提到过以GridFS方式上传问题到MongoDB中:Spring保存文件到MongoDB之GridFS支持。现在需要从Mongodb中读取文件,应该怎么处理类? 解决 Maven 注解mongoDbFactory 获取文件流 Note...

亚林瓜子 ⋅ 06/12 ⋅ 0

spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 很多时候我们往往需要操作多个数据库(微服务架构下一个...

尹吉欢 ⋅ 04/22 ⋅ 0

MongoDB 3.4.2 SQL 查询语句详解

本文对 MongoDB 的一些基本操作做一下整理和总结。 首先会介绍一下基于命令行的sql操作,其次结合 spring 的 mongoTemplate 介绍一下如何通过 java 操作数据库。对 NoSQL 不熟悉的同学可以了...

gaob2001 ⋅ 05/24 ⋅ 0

介绍一款好用 mongodb 可视化工具

最近想自己搭建一个个人博客,所以学了下mongodb,mongodb是用命令行输入的,有些人可能不太习惯,我自己找了下mongodb的一些可视化工具,发现了一款adminmongo很好用,这里介绍给你们用一下...

simpower ⋅ 05/26 ⋅ 0

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999 ⋅ 05/02 ⋅ 0

mongodb的命令行操作命令详解(增删改查、高级查询)

mongodb的命令行操作命令详解(增删改查、高级查询) 本文为上文的续篇,主要讲解mongodb在cmd的直接操作命令,我的mongodb是安装在d:mongodb下 1,mongodb启动服务 : 2,mongodb停止服务 : ...

xiaocao13140 ⋅ 06/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA PermGen space内存溢出

解决方案: File -> Settings -> Build, Execution, Deployment / Build Tools / Maven / Runner下,找到VM Options选项,默认是空的,改为如下内容(或更大值)...

快乐的小火柴 ⋅ 8分钟前 ⋅ 0

前端常见跨域解决方案

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。 广义的跨域: 1.) 资源跳转: A链接、重定向、表单提交2.) 资源嵌入: <link>、<script>、<im...

临江仙卜算子 ⋅ 9分钟前 ⋅ 0

系统管理命令service

service命令用来控制系统服务的实用工具,例如启动、停止、重启和关闭系统服务,以及当前状态。当然也可以直接操作,例如/etc/init.d/mysqld restart等。 语法 service (选项)(参数) 选项...

Jpchina ⋅ 14分钟前 ⋅ 0

MySQL 联合索引的命中规则

为什么要用联合索引? 对于查询语句“SELECT T.* FROM T WHERE T.c1=1 AND T.c3=2”涉及到两列,这个时候我们一般采用一个联合索引(c1, c3);而不用两个单列索引,这是因为一条查询语句往往应...

hensemlee ⋅ 22分钟前 ⋅ 0

Spring 自动组件扫描

通常情况下都是在XML配置文件中手动声明Bean和组件的。不过Spring也可以自动扫描组件实例化Bean,这样就可以避免在XML文件中繁琐的Bean声明。 手动声明Bean: 这里不再啰嗦,就是简单地在XML...

霍淇滨 ⋅ 26分钟前 ⋅ 0

MapReduce简单需求分析-共同好友及查找互粉的情况

MapReduce的设计,最重要的是要找准key,然后制定一系列的数据处理流程。MapReduce的Map中,会把key相同的分配到同一个reduce中,对于key的选择,可以找到某个相同的因素。以下面的几个例子说...

Jason_typ ⋅ 28分钟前 ⋅ 0

springboot多数据源自动切换

SpringBoot多数据源切换,先上配置文件: 1.pom: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20......

JackyRiver ⋅ 30分钟前 ⋅ 0

Boost库编译应用

版本:Boost 1.66.0 Windows库编译 官网指南:直接执行bootstrap.bat处理文件即可,可以我却遇到一堆的问题。 环境:Windows 10 + Visual Studio 2017 Boost编译出来库命名 boost库生成文件命...

水海云 ⋅ 35分钟前 ⋅ 0

解决Eclipse发布到Tomcat丢失依赖jar包的问题

如果jar文件是以外部依赖的形式导入的。Eclipse将web项目发布到Tomcat时,是不会自动发布这些依赖的。 可以通过Eclipse在项目上右击 - Propertics - Deployment Assembly,添加“Java Build ...

ArlenXu ⋅ 35分钟前 ⋅ 0

iview tree组件层级过多时可左右滚动

使用vue+iview的tree组件,iview官网iview的tree树形控件 问题描述:tree层级过多时左右不可滚动 问题解决:修改overflow属性值 .el-tree-node>.el-tree-node_children { overflow: vi...

YXMBetter ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部