MongoDB入门(5)- 我们自己封装的MongoDB-Java版本
用法
实体定义
package com.wisdombud.mongotool;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "Project")
public class Project extends MongoDbEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String ProjectId;
private String weituodanwei;
private String weituodanweidizhi;
private String post;
private String yangpinzhizaodanwei;
private String zhizaodanweidizhi;
private String phone;
private String contact;
private String yangpinjiazhi;
public String getProjectId() {
return ProjectId;
}
public void setProjectId(String projectId) {
ProjectId = projectId;
}
public String getWeituodanwei() {
return weituodanwei;
}
public void setWeituodanwei(String weituodanwei) {
this.weituodanwei = weituodanwei;
}
public String getWeituodanweidizhi() {
return weituodanweidizhi;
}
public void setWeituodanweidizhi(String weituodanweidizhi) {
this.weituodanweidizhi = weituodanweidizhi;
}
public String getPost() {
return post;
}
public void setPost(String post) {
this.post = post;
}
public String getYangpinzhizaodanwei() {
return yangpinzhizaodanwei;
}
public void setYangpinzhizaodanwei(String yangpinzhizaodanwei) {
this.yangpinzhizaodanwei = yangpinzhizaodanwei;
}
public String getZhizaodanweidizhi() {
return zhizaodanweidizhi;
}
public void setZhizaodanweidizhi(String zhizaodanweidizhi) {
this.zhizaodanweidizhi = zhizaodanweidizhi;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
public String getYangpinjiazhi() {
return yangpinjiazhi;
}
public void setYangpinjiazhi(String yangpinjiazhi) {
this.yangpinjiazhi = yangpinjiazhi;
}
public String getShenqingleixing() {
return shenqingleixing;
}
public void setShenqingleixing(String shenqingleixing) {
this.shenqingleixing = shenqingleixing;
}
public String getYangpinmingcheng() {
return yangpinmingcheng;
}
public void setYangpinmingcheng(String yangpinmingcheng) {
this.yangpinmingcheng = yangpinmingcheng;
}
public String getXinghao() {
return xinghao;
}
public void setXinghao(String xinghao) {
this.xinghao = xinghao;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getJianceyiju() {
return jianceyiju;
}
public void setJianceyiju(String jianceyiju) {
this.jianceyiju = jianceyiju;
}
public List<String> getJiancexiangmu() {
return jiancexiangmu;
}
public void setJiancexiangmu(List<String> jiancexiangmu) {
this.jiancexiangmu = jiancexiangmu;
}
public String getYangpinzhuangkuang() {
return yangpinzhuangkuang;
}
public void setYangpinzhuangkuang(String yangpinzhuangkuang) {
this.yangpinzhuangkuang = yangpinzhuangkuang;
}
public String getYangpinxuhao() {
return yangpinxuhao;
}
public void setYangpinxuhao(String yangpinxuhao) {
this.yangpinxuhao = yangpinxuhao;
}
public String getYangpinfujian() {
return yangpinfujian;
}
public void setYangpinfujian(String yangpinfujian) {
this.yangpinfujian = yangpinfujian;
}
public String getYangpintijiaofangshi() {
return yangpintijiaofangshi;
}
public void setYangpintijiaofangshi(String yangpintijiaofangshi) {
this.yangpintijiaofangshi = yangpintijiaofangshi;
}
public String getYangpinbaogaotijiaofangshi() {
return yangpinbaogaotijiaofangshi;
}
public void setYangpinbaogaotijiaofangshi(String yangpinbaogaotijiaofangshi) {
this.yangpinbaogaotijiaofangshi = yangpinbaogaotijiaofangshi;
}
public String getYangpinchuzhifangshi() {
return yangpinchuzhifangshi;
}
public void setYangpinchuzhifangshi(String yangpinchuzhifangshi) {
this.yangpinchuzhifangshi = yangpinchuzhifangshi;
}
public Date getCreateDay() {
return CreateDay;
}
public void setCreateDay(Date createDay) {
CreateDay = createDay;
}
private String shenqingleixing;
private String yangpinmingcheng;
private String xinghao;
private String number;
private String jianceyiju;
private List<String> jiancexiangmu;
private String yangpinzhuangkuang;
private String yangpinxuhao;
private String yangpinfujian;
private String yangpintijiaofangshi;
private String yangpinbaogaotijiaofangshi;
private String yangpinchuzhifangshi;
private Date CreateDay;
}
DAO实现
package com.wisdombud.mongotool;
import org.springframework.data.mongodb.core.MongoOperations;
public class ProjectDaoImpl extends SimpleMongoDaoImpl<Project, String> implements ProjectDao {
public ProjectDaoImpl(MongoOperations mongoOper) {
super(mongoOper);
}
}
核心源码
package com.wisdombud.mongotool;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.ArrayUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import common.toolkit.java.entity.PageEntity;
import common.toolkit.java.orm.hibernate.GeneralQuery;
import common.toolkit.java.util.ReflectUtils;
public class SimpleMongoDaoImpl<T, PK extends Serializable> implements SimpleMongoDao<T, PK> {
@Autowired
protected MongoOperations mongoOper;
protected Class<T> entityClazz;
/**
* 字符串分隔的标志符号,现在用:表示,在关联查询的时候用。
***/
private final String splitMarker = "::";
public SimpleMongoDaoImpl(MongoOperations mongoOper) {
this.mongoOper = mongoOper;
this.entityClazz = ReflectUtils.getSuperClassGenricType(getClass());
}
@Override
public PK save(T entity) {
return null;
}
@Override
public void update(T entity) {
mongoOper.save(entity);
}
@Override
public void saveOrUpdate(T entity) {
mongoOper.save(entity);
}
@Override
public void saveOrUpdate(Collection<T> entities) {
for (T entity : entities) {
mongoOper.save(entity);
}
}
@Override
public void delete(T entity) {
mongoOper.remove(entity);
}
@Override
public void deleteAll(Collection<T> entities) {
for (T entity : entities) {
mongoOper.remove(entity);
}
}
@Override
public void deleteById(PK id) {
mongoOper.remove(new Query(Criteria.where("_id").is(id)), entityClazz);
}
@Override
public T get(PK id) {
return mongoOper.findById(id, entityClazz);
}
@Override
public List<T> getAll() {
return this.mongoOper.findAll(entityClazz);
}
@Override
public T load(PK id) {
// TODO Auto-generated method stub
return null;
}
@Override
public void refresh(T entity) {
// TODO Auto-generated method stub
}
@Override
public void merge(T entity) {
// TODO Auto-generated method stub
}
@Override
public void merge(String entityName, T entity) {
// TODO Auto-generated method stub
}
@Override
public void evict(T entity) {
// TODO Auto-generated method stub
}
@Override
public boolean contains(Object entity) {
// TODO Auto-generated method stub
return false;
}
@Override
public List<T> findBy(String propertyName, Object value) {
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put(propertyName, value);
return this.findBy(paramMap, null);
}
@Override
public List<T> findBy(Map<String, Object> paramMap, List<Order> orderList) {
Query query = this.buildQuery(paramMap, orderList);
return mongoOper.find(query, entityClazz);
}
@Override
public T findUniqueBy(String propertyName, Object value) {
HashMap<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put(propertyName, value);
Query query = this.buildQuery(paramMap, null);
return mongoOper.findOne(query, entityClazz);
}
@Override
public T findUniqueBy(Map<String, Object> paramMap, List<Order> orderList) {
Query query = this.buildQuery(paramMap, orderList);
return mongoOper.findOne(query, entityClazz);
}
@Override
public void pageList(Map<String, Object> paramMap, List<Order> orderList, PageEntity<T> pageEntity) {
Query query = this.buildQuery(paramMap, orderList);
pageEntity.setTotalResults(mongoOper.count(query, entityClazz));// 总记录数
pageEntity.setTotalPages();// 总页数
query.skip(pageEntity.getStart());
query.limit(pageEntity.getPageSize());
pageEntity.setResults(mongoOper.find(query, entityClazz));// 分页数据
pageEntity.setCurrentPageLength(pageEntity.getResults().size());// 当前页面记录数
}
public Class<T> getEntityClazz() {
return entityClazz;
}
public void setEntityClazz(Class<T> entityClazz) {
this.entityClazz = entityClazz;
}
protected void buildQuery(String key, Object value, Query query) {
// 如果为数字
if (key.contains("_id")) {
query.addCriteria(Criteria.where(key).is(new ObjectId(value.toString())));
} else {
if (value instanceof Integer || value instanceof Float || value instanceof Double
|| value instanceof Boolean) {
query.addCriteria(Criteria.where(key).is(value));
} else {
// 字符串 模糊查询
// i为查询大小写不敏感
query.addCriteria(Criteria.where(key).regex(value.toString(), "i"));
}
}
}
protected Query buildQuery(Map<String, Object> paramMap, List<Order> orderList) {
Query query = new Query();
if (paramMap != null && paramMap.size() > 0) {
for (String key : paramMap.keySet()) {
Object value = paramMap.get(key);
if (key.contains(this.splitMarker)) {// 处理关联查询的情况
String[] arr = key.split(this.splitMarker);
if (arr.length != 2) {
continue;
}
String p1 = arr[0];
String p2 = arr[1];
Class<T> clazz = ReflectUtils.getSuperClassGenricType(getClass());
Field[] fs = this.getAllFields(clazz);
// ReflectUtils.getAllFields(clazz);
Class<?> clazz1 = null;
for (Field f : fs) {
if (f.getName().equals(p1)) {
clazz1 = f.getType();
break;
}
}
Query query0 = new Query();
this.buildQuery(p2, value, query0);
query.addCriteria(Criteria.where(p1).in(mongoOper.find(query0, clazz1)));
} else {
this.buildQuery(key, value, query);
}
}
}
if (orderList != null && orderList.size() > 0) {
Sort sort = new Sort(orderList);
query.with(sort);
}
return query;
}
private Field[] getAllFields(Class<? super T> clazz) {
Class<?> originClazz = clazz;
Field[] resultField = clazz.getDeclaredFields();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
if (clazz == originClazz) {
continue;
}
try {
Field[] superFields = clazz.getDeclaredFields();
resultField = (Field[]) ArrayUtils.addAll(resultField, superFields);
} catch (Exception e) {
System.out.println("error");
}
}
return resultField;
}
@Override
public List<T> findBy(Map<String, Object> paramsMap) {
// TODO Auto-generated method stub
return null;
}
@Override
public GeneralQuery<T> createGeneralQuery() {
// TODO Auto-generated method stub
return null;
}
}
MongoDB入门(5)- 我们自己封装的MongoDB-Java版本的更多相关文章
- 算法入门 - 链表的实现及应用(Java版本)
之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...
- [MongoDB知识体系] 一文全面总结MongoDB知识体系
MongoDB教程 - Mongo知识体系详解 本系列将给大家构建MongoDB全局知识体系.@pdai MongoDB教程 - Mongo知识体系详解 知识体系 学习要点 学习资料 官网资料 入门系 ...
- .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块
.Net Core ORM选择之路,哪个才适合你 因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...
- Nodejs学习笔记(十)--- 与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门(mongo.exe客户端操作) 库操作 插入 查询 修改 删除 存储过程 nodejs操作MongoDB 插入 查询 ...
- MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshell.c ...
- Nodejs学习笔记(十)—与MongoDB的交互(mongodb/node-mongodb-native)、MongoDB入门
简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...
- MongoDB入门实践
MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...
- MongoDB入门(7)- SpringDataMongoDB
入门 本文介绍如何应用SpringDataMongoDB操作实体和数据库,本文只介绍最基本的例子,复杂的例子在后面的文章中介绍. SpringDataMongoDB简介 SpringDataMongo ...
- mongodb入门学习小记
Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...
随机推荐
- #pragma pack(n)对齐格式
#pragma pack(n)对齐格式 #pragma pack(n) 是预处理器用来指定对齐格式的指令,表示n对齐.当元素字节小于n时,要扩展到n:若元素字节大于n则占用其实际大小. struct ...
- 《剑指Offer》题五十一~题六十
五十一.数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,在数组{7, 5, 6, 4}中,一共存 ...
- 《剑指Offer》题二十一~题三十
二十一.调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 测试用例: 功能测试:输入数组中的奇 ...
- Java学习个人备忘录之抽象类
抽象类 特点:1. 方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中.该类必须也被abstract修饰2. 抽象类不可以被实例化. 为什么? 因为调 ...
- lintcode-197-排列序号
197-排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号.其中,编号从1开始. 样例 例如,排列 [1,2,4] 是第 1 个排列. 思路 参考http://www ...
- TCP系列24—重传—14、F-RTO虚假重传探测
一.虚假重传 在一些情况下,TCP可能会在没有数据丢失的情况下初始化一个重传,这种重传就叫做虚假重传(Spurious retransmission).发生虚假重传的原因可能是包传输中重排序.传输中发 ...
- Jenkins系列-Jenkins通过Publish over SSH插件实现远程部署
配置ssh免秘钥登录 安装Publish over SSH插件 插件使用官网:https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plug ...
- C语言中printf直接打出2进制数是%什么?16进制是什么?
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- [Leetcode] 2.Add Two Numbers(List To Long,模拟)
本题题意是指将两个数倒序存储在链表中,再将两数之和同样存储在链表中输出. 我最开始的思路是将每一位相加,再考虑是否进位,但这时就需要考虑一些情况,比较麻烦. 于是我决定采取另一种在网上新学到的方法:这 ...
- 【ADO.NET】SqlBulkCopy批量添加DataTable
使用事务和SqlBulkCopy批量插入数据 SqlBulkCopy是.NET Framework 2.0新增的类,位于命名空间System.Data.SqlClient下,主要提供把其他数据源的数据 ...