Mongodb总结3-稍微封装一下
来源:互联网 发布:狼雨seo官网 编辑:程序博客网 时间:2024/06/05 16:05
上次发表的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"情况。
0 0
- Mongodb总结3-稍微封装一下
- 稍微总结一下
- 稍微总结一下Python中集合的用法
- 稍微改进了一下,下一步应该是封装对象,然后尝试组件话一个东东~?
- java修饰符总结(为了应试,稍微总结了一下,不考的就不总结了)
- 稍微记录一下xamarin的安装过程
- 稍微开始尝试写一下博客WWWW
- 从AtomicXXX稍微说一下Unsafe
- 今天稍微学些了一下句柄,记录一下~
- mongodb命令总结+nodejs增删改查的封装
- 终于稍微完整的学习了一下Linux
- 终于可以歇一下了 稍微松一口气
- 以前写的一个计算器,稍微改进了一下
- 稍微谈一下 javascript 开发中的 MVC 模式
- 【转】稍微谈一下 javascript 开发中的 MVC 模式
- 稍微谈一下 javascript 开发中的 MVC 模式
- hdu 1728 逃离迷宫(BFS+稍微改变一下搜索步骤)
- DWR入门教程(代码要稍微调整一下才能用)
- svn版本管理之trunk、branched、tags
- POJ分类很好很有层次感
- SQlite数据库简介
- Java 5.36
- 解决SwipeRefreshLayout多次下拉 加载图标显示异常
- Mongodb总结3-稍微封装一下
- lwip【1】LwIP移植心得
- struts2学习(一)
- 黑马程序员——Java基础---反射
- 解决error C2011: 'fd_set' : 'struct' type redefinition的方法
- CSS设置文字样式——模拟Google
- NCRE三级网络技术考试——八,九月总结
- lwip【2】 lwip--有趣的数组定义(预处理)
- [Java]Http报文详解