像传统数据库DAO一样操作MongoDB
作者之前已经写了关于如何对MongoDBTemplatezuo做进一步封装,这一次将进一步封装,使得MongoDB的基本操作像传统数据操作DAO分层一样操作
创建MongoDao
package com.onecloud.wm.core.db.mongo.dao;
import com.onecloud.wm.core.db.mongo.MongoFilter;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import java.util.List;
import java.util.Map;
/**
*
* mongo dao 通用封装
*
* @author wm
* @date 2021/09/27
*/
public interface MongoDao<T> {
/**
* 批量增加
*
* @param list 集合
* @param collectionName 表名
* @return 结果
*/
boolean batchSave(List<T> list, String collectionName);
/**
* 增加
*
* @param t 对象
* @return 结果
*/
boolean save(T t);
/**
* 删除
*
* @param t 对象
* @return 结果
*/
boolean remove(T t);
/**
* 更新
*
* @param entityClass 对象类
* @param valueMap 条件map
* @param updateMap 更新map
* @return 结果
*/
boolean update(Class<?> entityClass, Map<String, Object> valueMap, Map<String, Object> updateMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param valueMap 条件map
*/
T findUniqueBy(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 条件统计数量
*
* @param entityClass 表对象类
* @param valueMap 条件map
* @return 数据量
*/
long count(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param valueMap 条件map
*/
List<T> find(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表分页查找对象.
*
* @param entityClass 表对象类
* @param pageRequest 分页条件
* @param valueMap 条件map
*/
PageImpl<T> findPage(Class<?> entityClass, PageRequest pageRequest, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param filters 条件过滤器
*/
List find(Class<?> entityClass, List<MongoFilter> filters);
}
MongoDao实现类
package com.onecloud.wm.core.db.mongo.dao.impl;
import com.onecloud.wm.core.db.IDbTemplate;
import com.onecloud.wm.core.db.mongo.MongoFilter;
import com.onecloud.school.core.db.mongo.dao.MongoDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* mongo dao 通用封装实现
*
* @author wm
* @date 2021/09/27
*/
@Component
public class MongoDaoImpl<T> implements MongoDao<T> {
@Autowired
private IDbTemplate template;
@Override
public boolean batchSave(List<T> list, String collectionName) {
return template.batchSave(list, collectionName);
}
@Override
public boolean save(T t) {
return template.save(t);
}
@Override
public boolean remove(T t) {
return template.remove(t);
}
@Override
public boolean update(Class<?> entityClass, Map<String, Object> valueMap, Map<String, Object> updateMap) {
return template.update(entityClass, valueMap, updateMap);
}
@Override
@SuppressWarnings("unchecked")
public T findUniqueBy(Class<?> entityClass, Map<String, Object> valueMap) {
return (T)template.findUniqueBy(entityClass, valueMap);
}
@Override
public long count(Class<?> entityClass, Map<String, Object> valueMap) {
return template.count(entityClass, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public List<T> find(Class<?> entityClass, Map<String, Object> valueMap) {
return template.find(entityClass, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public PageImpl<T> findPage(Class<?> entityClass, PageRequest pageRequest, Map<String, Object> valueMap) {
return template.findPage(entityClass, pageRequest, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public List<T> find(Class<?> entityClass, List<MongoFilter> filters) {
return template.find(entityClass, filters);
}
}
MongoService服务层接口
package com.onecloud.scada.school.core.db.mongo.service;
import com.onecloud.scada.school.core.db.mongo.MongoFilter;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import java.util.List;
import java.util.Map;
/**
* mongo service 通用封装
* @author wm
* @date 2021/09/27
*/
public interface MongoService<T> {
/**
* 批量增加
*
* @param list 集合
* @param collectionName 表名
* @return 结果
*/
boolean batchSave(List<T> list, String collectionName);
/**
* 增加
*
* @param t 对象
* @return 结果
*/
boolean save(T t);
/**
* 删除
*
* @param t 对象
* @return 结果
*/
boolean remove(T t);
/**
* 更新
*
* @param entityClass 对象类
* @param valueMap 条件map
* @param updateMap 更新map
* @return 结果
*/
boolean update(Class<?> entityClass, Map<String, Object> valueMap, Map<String, Object> updateMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param valueMap 条件map
*/
T findUniqueBy(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 条件统计数量
*
* @param entityClass 表对象类
* @param valueMap 条件map
* @return 数据量
*/
long count(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param valueMap 条件map
*/
List<T> find(Class<?> entityClass, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表分页查找对象.
*
* @param entityClass 表对象类
* @param pageRequest 分页条件
* @param valueMap 条件map
*/
PageImpl<T> findPage(Class<?> entityClass, PageRequest pageRequest, Map<String, Object> valueMap);
/**
* 按属性过滤条件列表查找对象列表.
*
* @param entityClass 表对象类
* @param filters 条件过滤器
*/
List find(Class<?> entityClass, List<MongoFilter> filters);
}
MongoServiceImpl服务层实现
package com.onecloud.wm.core.db.mongo.service.impl;
import com.onecloud.wm.core.db.mongo.MongoFilter;
import com.onecloud.wm.core.db.mongo.dao.MongoDao;
import com.onecloud.wm.core.db.mongo.service.MongoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import java.util.List;
import java.util.Map;
/**
* mongo service 通用封装实现
* @author wm
* @date 2021/09/27
*/
public abstract class MongoServiceImpl<T> implements MongoService<T> {
@Autowired
private MongoDao mongoDao;
@Override
@SuppressWarnings("unchecked")
public boolean batchSave(List<T> list, String collectionName) {
return mongoDao.batchSave(list, collectionName);
}
@Override
@SuppressWarnings("unchecked")
public boolean save(T t) {
return mongoDao.save(t);
}
@Override
@SuppressWarnings("unchecked")
public boolean remove(T t) {
return mongoDao.remove(t);
}
@Override
@SuppressWarnings("unchecked")
public boolean update(Class<?> entityClass, Map<String, Object> valueMap, Map<String, Object> updateMap) {
return mongoDao.update(entityClass, valueMap, updateMap);
}
@Override
@SuppressWarnings("unchecked")
public T findUniqueBy(Class<?> entityClass, Map<String, Object> valueMap) {
return (T)mongoDao.findUniqueBy(entityClass, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public long count(Class<?> entityClass, Map<String, Object> valueMap) {
return mongoDao.count(entityClass, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public List<T> find(Class<?> entityClass, Map<String, Object> valueMap) {
return mongoDao.find(entityClass, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public PageImpl<T> findPage(Class<?> entityClass, PageRequest pageRequest, Map<String, Object> valueMap) {
return mongoDao.findPage(entityClass, pageRequest, valueMap);
}
@Override
@SuppressWarnings("unchecked")
public List find(Class<?> entityClass, List<MongoFilter> filters) {
return mongoDao.find(entityClass, filters);
}
}
使用示例
创建实体类
/**
* @author wm
* @date 2021/09/16
*/
@Document(collection = "t_student")
@Data
public class MongoTestEntity {
@Id()
private String id;
@Field
@Indexed(name = "index_name")
private String name;
@Field
private int num;
@Field
private double price;
@Field
@Indexed(name = "index_address")
private String address;
@Field
private Date date;
}
创建对象的service接口
/**
* @author wm
* @date 2021/09/27
*/
public interface MongoTestEntityService extends MongoService<MongoTestEntity> {
MongoTestEntity get();
}
创建对象的serviceImpl
这里get方法为测试所用。只是为了说明根据需要不同的service可自定义实现自己想要的接口
@Service
public class MongoTestEntityServiceImpl extends MongoServiceImpl<MongoTestEntity> implements MongoTestEntityService {
@Override
public MongoTestEntity get() {
Map<String, Object> valueMap = new HashMap<>();
valueMap.put("name", "test188");
return this.findUniqueBy(MongoTestEntity.class, valueMap);
}
}
controller测试
public class MongoDBTestController {
@Autowired
private MongoTestEntityService mongoTestEntityService;
@ResponseBody
@RequestMapping(value = "test", method = RequestMethod.GET)
public JsonObject test(HttpServletRequest req) {
// get测试
//mongoTestEntityService.get();
MongoTestEntity entity = new MongoTestEntity();
Random randon = new Random();
entity.setName("test" + randon.nextInt(200));
entity.setAddress(UuidUtil.uuid());
entity.setNum(new Random().nextInt(10));
entity.setPrice(22.5);
entity.setDate(new Date());
mongoTestEntityService.save(entity);
return new JsonObject(true, "");
}