您好,欢迎访问一九零五行业门户网

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

本文实现一个通用泛型封装实现类,需要给定一个集合对象,类似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()); 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 <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()); else finditerable = 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()); else finditerable = 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()); 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 <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:基本的增删改查
mongodb(六)java操作mongodb增删改查
相关视频:
黑马云课堂mongodb实操视频教程
以上就是java实现对mongodb,泛型封装增删查改、条件查询等操作的详细内容。
其它类似信息

推荐信息