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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 开车撞伤人交警说车主全责怎么办 面对喜欢上网又判逆的儿子怎么办 五年级了计算题老是出错怎么办 三年级的孩子老是计算题出错怎么办 写在表上的字写错了怎么办不能涂改 我的孩子做作业很马虎怎么办 幼儿园老师把学生名字写错怎么办 孩子的手写字磨了疙瘩怎么办 我家孩子上一年级算题特慢怎么办 脚注太多导致与正文距离太大怎么办 搜狗输入法打字不显示选字框怎么办 粘贴文字时带自动添加了序号怎么办 电脑上是表字打印出来是坔怎么办 不同颜色的衣服一起洗染色了怎么办 两岁宝宝不爱吃饭怎么办且消瘦 一岁两个月宝宝不爱吃饭怎么办 罗汉鱼头座大颜色不红怎么办 为什么孩子的牙都是龋齿怎么办呀 蓝迪儿童墙膜出现气泡了怎么办 空sd卡或文件系统不受支持怎么办 8个月宝宝吃了纸怎么办 宝宝出生两天了不吃不喝怎么办 八个月宝宝阴唇边红肿痛怎么办 儿童五周岁九个月比同龄矮怎么办 8个月宝宝长牙母乳喂养咬人怎么办 6周的孩子视力低常怎么办 宝宝吃了甜食生痰咳嗽怎么办 两个月的边牧抵抗力差怎么办 阴茎勃起后向上翘的厉害怎么办 5个月宝宝发烧38.5度怎么办 9个月宝宝发烧38.5度怎么办 八个月宝宝只吃母乳不吃奶粉怎么办 八个月母乳不够宝宝不吃奶粉怎么办 八个月宝宝吃母乳不吃奶粉怎么办 八个月宝宝戒奶不吃奶粉怎么办 刚满月的宝宝发烧38度怎么办 未满月的宝宝发烧38度怎么办 半月大的婴儿吃奶就漾奶怎么办 上司交给你不能完成的任务怎么办 电脑光驱里放入光碟放不出来怎么办 黑暗之魂3太难了怎么办