本文实现一个通用泛型封装实现类,需要给定一个集合对象,类似mysql中与java对应的表;思想就是把给定的对象解析出所有非空字段,保存到一个BasicDBObject中,这里一定要保证java对象与mongodb中的文档字段名字一样,因为代码为了实现通用,是默认以java对象的字段为BasicDBObject的查询字段。

核心代码1:这是将java对象转换为查询条件。

/*** 通过反射获取非空字段信息* @param record* @param <Q>* @return*/private <Q> BasicDBObject getCondition(Q record) {BasicDBObject cond = new BasicDBObject();Class clazz = record.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);Object value = field.get(record);if (value != null)cond.put(field.getName(), value);} catch (IllegalAccessException e) {e.printStackTrace();}}return cond;}

核心代码2:这是将查询到的文档转换为java对象,这里也是默认java对象的字段和数据库文档字段一样,也是利用java的反射动态获取用户自定义对象的所有字段,然后进行赋值,我在赋值过程中单独判断了int和long型,因为插入mongodb的时候一般是以double存的,这样就会造成转型错误。

/*** 将结果转化为自定义对象* @param document* @param target* @param <Q>* @return*/private <Q> Q parseToObject(Document document, Class<Q> target) {try {Q result = target.newInstance();Field[] fields = target.getDeclaredFields();for (Field f : fields) {f.setAccessible(true);Object value = document.get(f.getName());if (value == null)continue;else if (f.getType() == Integer.class)f.set(result, ((Number) value).intValue());else if (f.getType() == Long.class)f.set(result, ((Number) value).longValue());elsef.set(result, document.get(f.getName(), f.getType()));}return result;} catch (IllegalAccessException e) {e.printStackTrace();return null;} catch (InstantiationException e) {e.printStackTrace();return null;}}

调用方法:先转换查询参数,查询的时候是以id来判断正序倒序,所以默认数据库中一定要有id的标识字段。

public <Q> List<Q> queryByCondition(BaseQuery<Q> query,boolean up) {Q record = query.getQuery();BasicDBObject cond = getCondition(record);FindIterable<Document> findIterable;if (query.getStart() != null && query.getRows() != null)findIterable = thisCollection().find(cond).sort(new BasicDBObject("id", up ? 1 : -1)).skip((query.getStart() - 1) * query.getRows()).limit(query.getRows());elsefindIterable = thisCollection().find(cond).sort(new BasicDBObject("id", up ? 1 : -1));MongoCursor<Document> iterator = findIterable.iterator();List<Q> result = new ArrayList<>();while (iterator.hasNext()) {Document document = iterator.next();result.add((Q) parseToObject(document, record.getClass()));}iterator.close();return result;}

这里传入的BaseQuery如下:里面的query就是个需要查询的java对象,start&rows是为了用来分页的。这里是用到了lombok的插件,这样简化很多的gettter&setter等代码。

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Data
@Accessors(chain = true)
public class BaseQuery<Q> {private Integer start;private Integer rows;private Q query;public BaseQuery(Class clazz) {try {this.query = (Q) clazz.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}
}

测试条件查询方法:这里用到的实体如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User_info {private Integer id;private String name;private Integer age;private Integer role;
}
public static void main(String[] args) {User_info record = new User_info();BaseQuery<User_info> query = new BaseQuery<>();query.setQuery(record);BaseMongoDao dao = new BaseMongoDao("test");List<User_info> result = dao.queryByCondition(query, true);for (User_info user : result) {System.out.println(user);}}

因为这里用到的查询条件为空,所有会匹配数据库的所有项:

现在测试一下设置权限为1的数据:

public static void main(String[] args) {User_info record = new User_info();record.setRole(1);BaseQuery<User_info> query = new BaseQuery<>();query.setQuery(record);BaseMongoDao dao = new BaseMongoDao("test");List<User_info> result = dao.queryByCondition(query, true);for (User_info user : result) {System.out.println(user);}}

输出:

这个条件查询方法是一个例子,其他的删除,增加,修改都是这个原理,下面带有:

1.public <Q> List<Q> queryByCondition(BaseQuery<Q> query,boolean up)

2.public <Q> Integer queryCoditionCount(BaseQuery<Q> query)

3.public <Q> boolean insertOne(Q record)

4.public <Q> boolean insertList(List<Q> records)

5.public boolean deleteById(Integer id)

6.public  boolean deleteByIds(List<Integer> ids)

7.public <Q> void updateById(Q record)

放上所有代码:

package cn.wzy.dao;import com.mongodb.*;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.cn.wzy.query.BaseQuery;
import org.cn.wzy.util.PropertiesUtil;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;/*** Create by Wzy* on 2018/7/28 18:15* 不短不长八字刚好*/
public class BaseMongoDao {private static final MongoClient mongoClient;private static final MongoDatabase mongo;static {MongoClientOptions options = MongoClientOptions.builder().connectionsPerHost(150).maxWaitTime(2000).socketTimeout(2000).maxConnectionLifeTime(5000).connectTimeout(5000).build();ServerAddress serverAddress = new ServerAddress(PropertiesUtil.StringValue("mongo.host"),PropertiesUtil.IntegerValue("mongo.port"));List<ServerAddress> addrs = new ArrayList<>();addrs.add(serverAddress);MongoCredential credential = MongoCredential.createScramSha1Credential(PropertiesUtil.StringValue("mongo.user"), PropertiesUtil.StringValue("mongo.db"), PropertiesUtil.StringValue("mongo.pwd").toCharArray());mongoClient = new MongoClient(addrs, credential, options);mongo = mongoClient.getDatabase(PropertiesUtil.StringValue("mongo.db"));}public BaseMongoDao(String colName) {this.colName = colName;}private String colName;private MongoCollection<Document> thisCollection() {return mongo.getCollection(colName);}public <Q> List<Q> queryByCondition(BaseQuery<Q> query,boolean up) {Q record = query.getQuery();BasicDBObject cond = getCondition(record);FindIterable<Document> findIterable;if (query.getStart() != null && query.getRows() != null)findIterable = thisCollection().find(cond).sort(new BasicDBObject("id", up ? 1 : -1)).skip((query.getStart() - 1) * query.getRows()).limit(query.getRows());elsefindIterable = thisCollection().find(cond).sort(new BasicDBObject("id", up ? 1 : -1));MongoCursor<Document> iterator = findIterable.iterator();List<Q> result = new ArrayList<>();while (iterator.hasNext()) {Document document = iterator.next();result.add((Q) parseToObject(document, record.getClass()));}iterator.close();return result;}public <Q> Integer queryCoditionCount(BaseQuery<Q> query) {Q record = query.getQuery();BasicDBObject cond = getCondition(record);return (int) thisCollection().countDocuments(cond);}public <Q> boolean insertOne(Q record) {BasicDBObject cond = getCondition(record);try {int top = getTop();cond.put("id",++top);thisCollection().insertOne(new Document(cond));return true;} catch (Exception e) {e.printStackTrace();return false;}}public <Q> boolean insertList(List<Q> records) {try {List<Document> list = new ArrayList<>(records.size());if (!changeIds(records))return false;for (Q record : records) {list.add(new Document(getCondition(record)));}thisCollection().insertMany(list);return true;}catch (Exception e) {e.printStackTrace();return false;}}public boolean deleteById(Integer id) {try {if (id == null)return false;thisCollection().deleteOne(new BasicDBObject("id",id));return true;} catch (Exception e) {e.printStackTrace();return false;}}public  boolean deleteByIds(List<Integer> ids) {BasicDBObject cond = new BasicDBObject("id",new BasicDBObject("$in",ids.toArray()));try {thisCollection().deleteMany(cond);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 只通过id更改,查询就只是搜索id* @param record* @param <Q>*/public <Q> void updateById(Q record) {BasicDBObject cond = getCondition(record);BasicDBObject update = new BasicDBObject("$set",cond);BasicDBObject query = new BasicDBObject("id",cond.get("id"));thisCollection().updateOne(query,update);}/*** 通过反射获取非空字段信息* @param record* @param <Q>* @return*/private <Q> BasicDBObject getCondition(Q record) {BasicDBObject cond = new BasicDBObject();Class clazz = record.getClass();Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {try {field.setAccessible(true);Object value = field.get(record);if (value != null)cond.put(field.getName(), value);} catch (IllegalAccessException e) {e.printStackTrace();}}return cond;}/*** 将结果转化为自定义对象* @param document* @param target* @param <Q>* @return*/private <Q> Q parseToObject(Document document, Class<Q> target) {try {Q result = target.newInstance();Field[] fields = target.getDeclaredFields();for (Field f : fields) {f.setAccessible(true);Object value = document.get(f.getName());if (value == null)continue;else if (f.getType() == Integer.class)f.set(result, ((Number) value).intValue());else if (f.getType() == Long.class)f.set(result, ((Number) value).longValue());elsef.set(result, document.get(f.getName(), f.getType()));}return result;} catch (IllegalAccessException e) {e.printStackTrace();return null;} catch (InstantiationException e) {e.printStackTrace();return null;}}/*** 使id自增* @param records* @param <Q>* @return*/private <Q> boolean changeIds(List<Q> records) {if (records == null || records.size() == 0)return false;Class clazz = records.get(0).getClass();try {Field id = clazz.getDeclaredField("id");id.setAccessible(true);int top = getTop();for (Q record: records) {id.set(record,++top);}} catch (NoSuchFieldException e) {e.printStackTrace();return false;} catch (IllegalAccessException e) {e.printStackTrace();return false;}return true;}/*** 查找顶针* @return*/private int getTop() {return ((Number) thisCollection().find().sort(new BasicDBObject("id",-1)).first().get("id")).intValue();}}

java操作mongodb,泛型封装增删查改、条件查询等操作相关推荐

  1. mongodb java条件查询_java实现对mongodb,泛型封装增删查改、条件查询等操作

    本文实现一个通用泛型封装实现类,需要给定一个集合对象,类似mysql中与java对应的表:思想就是把给定的对象解析出所有非空字段,保存到一个BasicDBObject中,这里一定要保证java对象与m ...

  2. MongoDB数据库(二):增删查改

    MongoDB数据库的增删查改 1.插入数据 语法: db.集合名称.insert(document) db.table_name.insert({name:'gj',gender:1}) db.ta ...

  3. Java JDBC篇2——JDBC增删查改

    Java JDBC篇2--JDBC增删查改 url=jdbc:mysql://localhost:3306/test user=root password=blingbling123. driver= ...

  4. MySQL表sql语句增删查改_学会这些操作你就不会栓Q(狗头)

    目录 本章目标 CRUD 新增(Create) 单行数据,全列插入 多行插入,指定列插入 查询(Retrieve) 修改(Update) 删除(Delete) 本章目标 学会MySQL表中的sql语句 ...

  5. python数据存储系列教程——python中mongodb数据库操作:连接、增删查改、多级路径

    全栈工程师开发手册 (作者:陈玓玏) python教程全解 调试环境python3.6,调试python操作mongodb数据库,首先要在本地或服务器安装mongodb数据库.安装参考:http:// ...

  6. zCrud组件(vue2封装增删查改到一个组件)

    文章目录 一.前言 二.参数总览 1. 搜索配置对象searchOption 1.1 查询项配置对象query 2. 列配置数组columns 3. 操作列配置对象handleOption 4. 分页 ...

  7. php+mysql封装增删查改

    2019独角兽企业重金招聘Python工程师标准>>> 简介:这个主要是分享一下给还在研究原生php的MYSQL操作方法封装的朋友.为什么我们要把查询语句封装起来呢?一切从简, 说白 ...

  8. python数据存储系列教程——python中redis数据库操作:连接、增删查改、多级路径

    全栈工程师开发手册 (作者:陈玓玏) python教程全解 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品 ...

  9. 用java项目做Hibernate的增删查改,和分页(hibernate-distribution-3.6.0.Final为例)

    1, 在文档中找到导入7个jar包 hibernate3.jar 核心jar包 lib-required下的全部jar包6个 lib-jpa下的一个jar 2,写一个配置文件config 默认名为hi ...

最新文章

  1. R语言编写自定义描述统计计算函数、使用doBy包的summaryBy函数计算不同分组(group)的描述性统计值(Descriptive statistics by group、样本个数、均值、标准)
  2. boost::multi_array模块实现编写调整大小函数的测试,multi_arrays 将使用来自另一个的范围来构建自己
  3. opencv2 取二进制数据_百亿数据量下,掌握这些Redis技巧你就能Hold全场
  4. 中国万网被黑客黑的情景
  5. Best Practices for Speeding Up Your Web Site(4)
  6. 音响在线测试软件,音响检测:漫步者煲箱软件
  7. c语言反序数1234变4321,C语言编程题练习
  8. 朋友圈集赞神器 | 1秒集齐300个赞,从此点赞不求人
  9. java动态添加成员变量,java如何访问成员变量
  10. 手机计算机国二支付,“刷手机”时代悄然来临 手机支付呼唤国家标准(二)...
  11. C/C++ 字符数字-‘0‘ 字符数字+‘0‘ 是什么意思
  12. 公众号运营-Datawhale-1
  13. 东华OJ基础85——手机短号
  14. Python爬取豆瓣高分图书TOP100存入Excel
  15. yapi文档转换jmx脚本
  16. 编写程序判断变量X的值 是偶数还是奇数,偶数buf为1,奇数buf为0
  17. 转载 学写钢笔字应该注意些什么
  18. 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
  19. html开发android,使用HTML5开发Android本地应用(一)
  20. PMP 项目管理知识框架 - 引子

热门文章

  1. 微信小程序使用阿里图库iconfont
  2. linux拷贝目录并修改名字,linux复制文件夹、重命名文件夹、删除文件夹
  3. Python数据可视化 Pyecharts 制作 Funnel 漏斗图
  4. 100个网络基础知识简答
  5. 学院计算机迎新横幅,2018高校开学迎新横幅哪家强?这么有创意是想要笑死人嘛.........
  6. git连接华为软件开发云
  7. 电脑连手机热点连得上微信,QQ上不了网
  8. 利用C++实现仓库管理系统
  9. 想转行当程序员的必看!2021年Android春招面试经历,威力加强版
  10. centos7 mysql 3306端口_Centos7开启/关闭3306端口实现远程连接数据库