像传统数据库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, "");
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值