上次发表的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"情况。

Mongodb总结3-稍微封装一下的更多相关文章

  1. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  2. MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

    回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...

  3. 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类)

    近期工作中有使用到 MongoDb作为日志持久化对象,需要实现对MongoDb的增.删.改.查,但由于MongoDb的版本比较新,是2.4以上版本的,网上已有的一些MongoDb Helper类都是基 ...

  4. mongodb 的基本函数语法封装

    //这个模块里面封装了所有对数据库的常用操作 var MongoClient = require('mongodb').MongoClient; var config = require(" ...

  5. Golang 对MongoDB的操作简单封装

    使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s ...

  6. Mongodb for .Net Core 封装类库

    一:引用的mongodb驱动文件版本为 Mongodb.Driver 20.4.3 二:我只是进行了常用方法的封装,如有不当之处,请联系我 创建mongodb的连接 using MongoDB.Bso ...

  7. golang mongodb 驱动二次封装

    mongodb 官方的go驱动包 go.mongodb.org/mongo-driver 使用起来比较繁琐,最近对其进行了二次封装 github地址:https://github.com/w3liu/ ...

  8. MongoDB学习笔记~自己封装的Curd操作(按需更新的先决条件)

    回到目录 我们上一讲中介绍了大叔封装的Mongo仓储,其中介绍了几个不错的curd操作,而对于按需更新内部子对象,它是有条件的,即你的子对象不能为null,也就是说,我们在建立主对象时,应该为子对象赋 ...

  9. 【MongoDB:】稍微复杂的操作

    1:插入数据稍微复杂的形式 doc=( {"user_id" : "ABCDBWN", "password" :"ABCDBWN& ...

  10. MongoDB Helper的简单封装

    db.properties #mongodb数据库配置文件 #数据库server所在的ip地址 ip=127.0.0.1  #mongodb服务port号 port=27017 #要连接的库 dbNa ...

随机推荐

  1. BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)

    Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...

  2. <QT障碍之路>QApplication:No such file or directory

    原因:QT5将很多部件都移动了QT widgets模块中. 解决方法: 在.pro文件中添加 greaterThan(QT_MAJOR_VERSION, ): QT += widgets

  3. 树莓派 使用python来操作GPIO 控制LED灯

    一.创建python驱动和控制GPIO 先新建一个文件夹用于放置脚本 mkdir python_gpio 进入文件夹内新建一个gpio_blink.py的脚本 cd python_gpio touch ...

  4. 【Henu ACM Round#16 D】Bear and Two Paths

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先搞一条a到b的路径 a c x3 x4 x5....xn-2 d b 然后第二个人的路径可以这样 c a x3 x4 x5...x ...

  5. Google开源新的 RISC-V IP核: “BottleRocket”(https://cnrv.io)

    BottleRocket是RISCV RV32IMC的实现. Google在2017年11月29日在Github上非官方开源了BottleRocket的RTL代码,同时表明这并不是一个官方支持的Goo ...

  6. vim基础学习之搜索功能

    当我们使用vim看源码的时候,我们可能会碰到一个方法或者变量,我们想要知道这个变量在其他地方的使用情况.这时候我们经常的做法就是退出当前的文件,或者是重新切换一个终端,然后使用grep或者find等s ...

  7. vim-缓存区中打开另外一个文件的方法

    现在有这么一种情况:    我现在在ubuntu用户根目录下--    我根目录下有一个文件夹blogs,这个文件夹下面有两个文件:text1,text2.    我现在从-目录下进行如下操作    ...

  8. headset-监听有线耳机插拔

    今天在做项目的时候,需要对耳机的插拔事件进行监听,所以就写了如下的一个小demo,对耳机监听事件进行验证.直接看代码 package com.example.alert; import android ...

  9. css中linear-gradient的使用

    注明:此篇文章来自http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-text-shadow.html.

  10. centos 6.7下安装rabbitmq 3.6.6过程

    准备,请确保有root权限或者sudo权限,不然不用继续看下去了. 1.erland的安装 首先测试一下是否已经安装了erlang,命令 rpm -qa | grep erlang 若没有安装,则 y ...