spring-data-mongo BaseDao的封装
来源:互联网 发布:sql server 2008修复 编辑:程序博客网 时间:2024/06/08 20:07
引言
使用spring-data-mongo操作mongo数据库时,按常规的写法dao中会有很多重复且冗余的代码,所以将BaseDao通用的代码抽取出来一个基类是很有必要的,不过这个抽取的方式有多种每个人可能都不一样,在这里我讲我抽取的基类贴出来希望大家共同进步。
具体实现
BaseDao代码如下:
package com.mn.dao;import com.mn.comm.PageList;import com.mn.domain.BaseEntity;import org.springframework.data.domain.Pageable;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import java.util.List;/** * Created by mn on 2017/7/22 0022. */public interface BaseDao<T extends BaseEntity> { /** * 通过指定条件查找一个 */ T findOne(Query query); /** * 通过指定条件查找列表,不做分页 * @param query * @return */ List<T> find(Query query); /** * 通过指定条件查找列表,分页 * @param query * @param pageable * @return */ PageList<T> find(Query query, Pageable pageable); /** * 更新所有的字段,除了指定字段 * @param t */ int updateAll(T t); /** * 更新制定字段 * @param query 查询条件 * @param update 更新字段集合 * @return 是否成功 */ int update(Query query, Update update); /** * 更新制定字段 * @param query 查询条件 * @param update 更新字段集合 * @return 是否成功 */ int updateMulti(Query query, Update update); /** * 查找更新 * @param query 查询条件 * @param update 更新字段集合 * @param isNew 是否返回更新后的记录 * @return */ T findAndModify(Query query, Update update, boolean isNew); /** * 插入 * @param t 要插入的记录 */ void insert(T t); /** * 删除 * @param query 查询条件 */ int delete(Query query); /** * 批量插入 * @param tList */ void insert(List<T> tList); /** * 查询数量 * @param query 查询条件 * @return */ long count(Query query); /** * 是否存在 * @param query 查询条件 * @return */ boolean isExist(Query query);}
BaseDao适配器
package com.mn.dao;import com.mn.comm.Fixed;import com.mn.comm.PageList;import com.mn.domain.BaseEntity;import com.mongodb.WriteResult;import org.springframework.data.domain.Pageable;import org.springframework.data.mongodb.core.FindAndModifyOptions;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.lang.reflect.ParameterizedType;import java.util.List;/** * Created by mn on 2017/7/22 0022. */public class BaseDaoAdapter<T extends BaseEntity> implements BaseDao<T> { protected MongoTemplate mongoTemplate; protected Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; protected String tabName = entityClass.getSimpleName(); public BaseDaoAdapter(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public void setTabName(String tabName) { this.tabName = tabName; } @Override public T findOne(Query query) { return mongoTemplate.findOne(query, entityClass, tabName); } @Override public List<T> find(Query query) { return mongoTemplate.find(query, entityClass, tabName); } @Override public PageList<T> find(Query query, Pageable pageable) { PageList<T> pageList = new PageList<>(); if (pageable != null) { long totalCount = count(query); int pageCount = (int) (totalCount / pageable.getPageSize()); if (totalCount % pageable.getPageSize() != 0) { pageCount += 1; } query.with(pageable); pageList.makePageList(null, pageable.getPageSize(), totalCount, pageable.getPageNumber(), pageCount); } pageList.setPage(mongoTemplate.find(query, entityClass, tabName)); return pageList; } /** * 通过反射将对象的值设置到update中 * @param obj * @param cur_class * @param update */ private void setClassFieldToUpdate(Object obj, Class cur_class, Update update) { Field[] obj_fields = cur_class.getDeclaredFields(); try { for (Field field : obj_fields) { if (Modifier.isFinal(field.getModifiers()) || Modifier.isPublic(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) { continue; } field.setAccessible(true); boolean isFixed = false; Annotation annotations[] = field.getAnnotations(); for (Annotation annotation:annotations){ if(annotation.getClass()== Fixed.class){ isFixed = true; } } if(isFixed){//如果字段是不变的则不添加在update中 continue; } update.set(field.getName(), field.get(obj)); } if (cur_class.getSuperclass() != null) { setClassFieldToUpdate(obj, cur_class.getSuperclass(), update);//递归获取父类的字段值 } } catch (Exception e) { e.printStackTrace(); } } @Override public int updateAll(T t) { Update update = new Update(); setClassFieldToUpdate(t,entityClass,update); return mongoTemplate.updateFirst(Query.query(Criteria.where(BaseEntity._ID).is(t.get_id())),update,entityClass,tabName).getN(); } @Override public int update(Query query, Update update) { return mongoTemplate.updateFirst(query,update,entityClass,tabName).getN(); } @Override public int updateMulti(Query query, Update update) { return mongoTemplate.updateMulti(query,update,entityClass,tabName).getN(); } @Override public T findAndModify(Query query, Update update, boolean isNew) { FindAndModifyOptions findAndModifyOptions = new FindAndModifyOptions(); findAndModifyOptions.returnNew(isNew); findAndModifyOptions.upsert(true); return mongoTemplate.findAndModify(query,update,findAndModifyOptions,entityClass,tabName); } @Override public void insert(T t) { mongoTemplate.insert(t,tabName); } @Override public int delete(Query query) { return mongoTemplate.remove(query,entityClass,tabName).getN(); } @Override public void insert(List<T> tList) { mongoTemplate.insertAll(tList); } @Override public long count(Query query) { return mongoTemplate.count(query,entityClass,tabName); } @Override public boolean isExist(Query query) { return mongoTemplate.exists(query,entityClass,tabName); }}
使用方式
package com.mn.dao.impl;import com.mn.dao.BaseDaoAdapter;import com.mn.dao.IResMenuDao;import com.mn.domain.ResMenu;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.stereotype.Repository;/** * Created by Administrator on 2017/7/22 0022. */@Repositorypublic class ResMenuDaoImpl extends BaseDaoAdapter<ResMenu> implements IResMenuDao { @Autowired public ResMenuDaoImpl(MongoTemplate mongoTemplate) { super(mongoTemplate); }}
测试
import com.mn.dao.IResMenuDao;import com.mn.domain.ResMenu;import com.mn.utils.StringUtils;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import java.util.List;/** * Created by Administrator on 2017/7/22 0022. */public class ResMenuTest extends AbstractSpringWithJunitTestRunner { @Autowired IResMenuDao resMenuDao; @Test public void update() { ResMenu resMenu = new ResMenu(); resMenu.setName("测试"); resMenu.setPid(""); resMenu.setUrl("www.baidu.com"); resMenu.set_id(StringUtils.getId()); resMenuDao.insert(resMenu); List<ResMenu> resMenuList = resMenuDao.find(null); System.out.println(); }}
最后所有的代码都上传到git上了源码
阅读全文
0 0
- spring-data-mongo BaseDao的封装
- spring data mongo 的upsert和update
- spring data jpa 定义全局接口BaseDao
- spring data jpa 定义全局接口BaseDao
- mongo查询总结-spring-data-mongo
- Spring Data for Mongo 介绍
- spring data mongo API learn
- 【MongoDB】spring-data-mongo配置
- spring data mongo 聚合查询
- spring-data-mongo 实现aggregation
- Spring Data Mongo简单搭建
- Spring Data Mongo单元测试Junit
- spring data mongo使用小记
- 基于JDBC封装的极简BaseDAO
- spring data jpa specification的封装
- spring data jpa的动态查询封装
- Spring Data MongoDB <mongo:mongo-client … />配置
- 简化MongoAPI(spring-data-mongo)第一部分
- MATLAB神经网络应用设计【1】
- Scala学习—面向对象编程之Trait
- A1011
- easyUI validatabox 重写验证方法 验证正则表达式
- 截取圆形或圆角图片
- spring-data-mongo BaseDao的封装
- 累加和小于等于给定值k的最长子数组
- CF(831B) C语言
- linux基础二
- 递归排序
- 判断Activity是否在运行?
- java并发编程实战-并发程序的测试
- jquery源码解析(第3章元素之偏移算法)
- 关于安全删除Arraylist中的一组节点