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

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

* 通过反射获取非空字段信息

* @param record

* @param

* @return

*/

private 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

* @return

*/

private Q parseToObject(Document document, Class 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());

else

f.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 List queryByCondition(BaseQuery query,boolean up) {

Q record = query.getQuery();

BasicDBObject cond = getCondition(record);

FindIterable 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());

else

findIterable = thisCollection().find(cond)

.sort(new BasicDBObject("id", up ? 1 : -1));

MongoCursor iterator = findIterable.iterator();

List 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 {

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 query = new BaseQuery<>();

query.setQuery(record);

BaseMongoDao dao = new BaseMongoDao("test");

List 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 query = new BaseQuery<>();

query.setQuery(record);

BaseMongoDao dao = new BaseMongoDao("test");

List result = dao.queryByCondition(query, true);

for (User_info user : result) {

System.out.println(user);

}

}

输出:

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

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

2.public Integer queryCoditionCount(BaseQuery query)

3.public boolean insertOne(Q record)

4.public boolean insertList(List records)

5.public boolean deleteById(Integer id)

6.public boolean deleteByIds(List ids)

7.public 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 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 thisCollection() {

return mongo.getCollection(colName);

}

public List queryByCondition(BaseQuery query,boolean up) {

Q record = query.getQuery();

BasicDBObject cond = getCondition(record);

FindIterable 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());

else

findIterable = thisCollection().find(cond)

.sort(new BasicDBObject("id", up ? 1 : -1));

MongoCursor iterator = findIterable.iterator();

List result = new ArrayList<>();

while (iterator.hasNext()) {

Document document = iterator.next();

result.add((Q) parseToObject(document, record.getClass()));

}

iterator.close();

return result;

}

public Integer queryCoditionCount(BaseQuery query) {

Q record = query.getQuery();

BasicDBObject cond = getCondition(record);

return (int) thisCollection().countDocuments(cond);

}

public 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 boolean insertList(List records) {

try {

List 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 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

*/

public 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

* @return

*/

private 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

* @return

*/

private Q parseToObject(Document document, Class 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());

else

f.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

* @return

*/

private boolean changeIds(List 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();

}

}

相关文章:

相关视频:

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

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

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

  2. mongodb java 单例_Java单例MongoDB工具类

    我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用. 没用Spring Data.Morphia等框架是为了减少学习.维护成本,另外自己直接JDBC方式的话可以 ...

  3. mongodb java 单例_JAVA单例MongoDB工具类详解

    shasha 2018年09月07日 681 0 JAVA单例MongoDB工具类 JAVA驱动版本: org.mongodb mongo-java-driver 3.0.2 工具类代码如下: pac ...

  4. Extjs6(六)——增删查改之查询

    本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...

  5. Java Web用户信息管理系统的简单设计(增删查改)

    用户信息管理系统 技术需求:Servlet +jsp+ mvc +jdbc 软件需求 :Eclipse mysql Tomcat Google 功能需求:完成用户登录  查询所有用户 增加删除用户信息 ...

  6. 8天学通MongoDB——第二天 细说增删查改

    2019独角兽企业重金招聘Python工程师标准>>> 看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongod ...

  7. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...

  8. Java操作MongoDB数据库CRUD(增删查改)

    Java操作MongoDB数据库CRUD(增删查改) 借助mongo-java-driver包,对MongoDB数据库的集合(DataTable)及文档(BSON对象数据)进行增删查改操作.本文的核心 ...

  9. java调用js查询mongo_MongoDB增删查改操作示例【基于JavaScript Shell】

    本文实例讲述了MongoDB增删查改操作.分享给大家供大家参考,具体如下: MongoDB自带了一个JavaScript Shell,所以在其中使用js语法是可以的. Insert操作: 单条插入 v ...

最新文章

  1. ICCV 2021 Workshop 盘点
  2. AI不会很快取代作家——但未来可能比你想象的更近
  3. 如何实现Oracle数据库之间的数据同步?
  4. Oracle私网mtu滚动修改实施方案
  5. oracle技术之oracle备份恢复概述
  6. JavaEE下关于JSF开发的一些知识点小节
  7. 【FPGA】ds18b20温度传感器
  8. Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御
  9. 你必须掌握的人生定律
  10. 淘宝双11实时数据分析项目报告
  11. 实验六 视图的创建与管理
  12. Animation(五-足球动态移动)
  13. 有没有可以跨平台的待办事项清单软件推荐?
  14. html改变元素外边距,CSS 简明教程 - 外边距 ( margin ) 属性
  15. Java响应式流框架Reactor中的Mono和Flux
  16. Java Web项目开发灵感和知识点总结
  17. python之numpy之axis=1和axis=0
  18. 移动 网通 联通 电信
  19. Arduino获取商业遥控器(如天地飞等)PWM信号的例子
  20. 3.软碟通制作Linux安装盘

热门文章

  1. Flink的sink实战之一:初探,2020-2021蚂蚁金服Java面试真题解析
  2. 【毕设教学】单片机如何运行SD卡里的程序
  3. 计算两点之间的角度并取得方向
  4. 单细胞测序之基本的数据处理基本流程
  5. 为什么eolinker发送老是等待_eolinker使用有感
  6. 新手学逆向踩坑系列----从找不到DDMS到打不开DDMS
  7. 王者服务器维护6月8日,王者荣耀6月8日更新内容 6月8日更新庄周bug修复
  8. MySQL数据库数据迁移
  9. mysql为表和字段取别名_MySQL查询函数---为表和字段取别名
  10. 计算机模拟及其应用,浅析计算机虚拟仿真技术及其应用