上次发表的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. python3之开发环境PyCharm配置

    1. 安装PyCharm(安装时注意选择python),地址: https://www.jetbrains.com/pycharm/ 2. 安装python 地址: https://www.pytho ...

  2. HDU 5281 Senior&#39;s Gun 杀怪

    题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得 ...

  3. android側滑菜单-DrawerLayout的基本使用

    眼下主流App开发中,部分是以側滑菜单为主布局架构,曾经做android側滑菜单时.大多选择使用github上的第三方开源框架SildingMenu,可是这个框架还是稍显笨重.好消息是google已经 ...

  4. AutoLayout具体解释+手把手实战

    首先说一下这篇博客尽管是标记为原创,可是事实并不是本人亲自写出来的.知识点和样例本人花了一天各处查找和整理终于决定写一个汇总的具体解释,解去各位朋友到处盲目查找的必要,由于不是转载某一个人的内容.故此 ...

  5. Your Ruby version is 2.2.3, but your Gemfile specified 2.2.2

    在文章 Ruby On Rails中REST API使用演示样例--基于云平台+云服务打造自己的在线翻译工具 中,从Bluemix上下载的初始Hello World演示样例代码在本地环境下运行调试时提 ...

  6. SSM(spring,springMVC,Mybatis)框架的整合

    这几天想做一个小项目,所以搭建了一个SSM框架. 1.基本概念 1.1.Spring   Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Joh ...

  7. Java 关于运算结果

    今天发现一个自己的一个知识误区 原来有些自己以为会发生异常的运算,并没有异常发生,只要运算符两端存在至少一个浮点数 比如: public class Demo { /** * @param args ...

  8. 33.IDEA + maven]在IDEA中打开一个maven项目,resolve完依赖后,缺少部分jar包问题

    转自:https://www.cnblogs.com/zazalu/p/7649590.html [注意]作者只是对使用过程中遇到的问题提出了一个解决方案,但是本人在编写此解决方案文章的时候,对mav ...

  9. Web跨域问题基础

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...

  10. Android RecyclerView滑动监听,判断是否滑动到了最后一个item

    项目中的需求,RecyclerView横向滑动列表,要有加载更多的功能,给RecyclerView设置一个滑动监听,在onScrolled方法中判断一下滑动方向,然后在onScrollStateCha ...