mongodb java条件查询_java实现对mongodb,泛型封装增删查改、条件查询等操作
本文实现一个通用泛型封装实现类,需要给定一个集合对象,类似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,泛型封装增删查改、条件查询等操作相关推荐
- java操作mongodb,泛型封装增删查改、条件查询等操作
本文实现一个通用泛型封装实现类,需要给定一个集合对象,类似mysql中与java对应的表:思想就是把给定的对象解析出所有非空字段,保存到一个BasicDBObject中,这里一定要保证java对象与m ...
- mongodb java 单例_Java单例MongoDB工具类
我经常对MongoDB进行一些基础操作,将这些常用操作合并到一个工具类中,方便自己开发使用. 没用Spring Data.Morphia等框架是为了减少学习.维护成本,另外自己直接JDBC方式的话可以 ...
- mongodb java 单例_JAVA单例MongoDB工具类详解
shasha 2018年09月07日 681 0 JAVA单例MongoDB工具类 JAVA驱动版本: org.mongodb mongo-java-driver 3.0.2 工具类代码如下: pac ...
- Extjs6(六)——增删查改之查询
本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...
- Java Web用户信息管理系统的简单设计(增删查改)
用户信息管理系统 技术需求:Servlet +jsp+ mvc +jdbc 软件需求 :Eclipse mysql Tomcat Google 功能需求:完成用户登录 查询所有用户 增加删除用户信息 ...
- 8天学通MongoDB——第二天 细说增删查改
2019独角兽企业重金招聘Python工程师标准>>> 看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongod ...
- java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作
全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...
- Java操作MongoDB数据库CRUD(增删查改)
Java操作MongoDB数据库CRUD(增删查改) 借助mongo-java-driver包,对MongoDB数据库的集合(DataTable)及文档(BSON对象数据)进行增删查改操作.本文的核心 ...
- java调用js查询mongo_MongoDB增删查改操作示例【基于JavaScript Shell】
本文实例讲述了MongoDB增删查改操作.分享给大家供大家参考,具体如下: MongoDB自带了一个JavaScript Shell,所以在其中使用js语法是可以的. Insert操作: 单条插入 v ...
最新文章
- ICCV 2021 Workshop 盘点
- AI不会很快取代作家——但未来可能比你想象的更近
- 如何实现Oracle数据库之间的数据同步?
- Oracle私网mtu滚动修改实施方案
- oracle技术之oracle备份恢复概述
- JavaEE下关于JSF开发的一些知识点小节
- 【FPGA】ds18b20温度传感器
- Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御
- 你必须掌握的人生定律
- 淘宝双11实时数据分析项目报告
- 实验六 视图的创建与管理
- Animation(五-足球动态移动)
- 有没有可以跨平台的待办事项清单软件推荐?
- html改变元素外边距,CSS 简明教程 - 外边距 ( margin ) 属性
- Java响应式流框架Reactor中的Mono和Flux
- Java Web项目开发灵感和知识点总结
- python之numpy之axis=1和axis=0
- 移动 网通 联通 电信
- Arduino获取商业遥控器(如天地飞等)PWM信号的例子
- 3.软碟通制作Linux安装盘