1 接口

package com.***.biz.service;

import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.rad.etl.transform.api.common.MongoPage;
import com.rad.etl.transform.api.common.MongoPageable;
import org.springframework.data.mongodb.core.query.Query;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

public interface IMongoService<T> {

    /**
     * 新增记录
     */
    T insert(T t);

    /**
     * 批量新增记录
     */
    Collection<T> batchInsert(Collection<? extends T> list);

    /**
     * 根据ID更新记录,对象属性全部更新
     */
    UpdateResult updateById(T t, Serializable id, Class<?> clazz);

    /**
     * 根据ID更新记录,仅更新不为null属性的对象
     */
    UpdateResult updateByIdSelective(T t, Serializable id, Class<?> clazz);

    /**
     * 根据ID删除记录
     */
    DeleteResult deleteById(String id, Class<?> clazz);

    /**
     * 根据条件删除记录
     */
    DeleteResult delete(Query query, Class<?> clazz);

    /**
     * 根据条件查询记录
     */
    List<T> find(Query query, Class<?> clazz);

    /**
     * 查询集合全部记录
     */
    List<T> findAll(Class<?> clazz);

    /**
     * 根据ID获取记录
     */
    T findById(String id, Class<?> clazz);

    /**
     * 根据条件查询一条记录
     */
    T findOne(Query query, Class<?> clazz);

    /**
     * 分页查询
     */
    <T> MongoPage<T> findPaging(Class<T> clazz, Query query, MongoPageable pageable);

    /**
     * 获取数量
     */
    long getCount(Query query, Class<?> clazz);

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.

2 实现类

package com.***.biz.service.impl;

import com.alibaba.fastjson2.JSON;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import com.rad.etl.output.biz.service.IMongoService;
import com.rad.etl.transform.api.common.MongoPage;
import com.rad.etl.transform.api.common.MongoPageable;
import lombok.AllArgsConstructor;
import org.bson.Document;
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 org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

@AllArgsConstructor
@Service
public class MongoServiceImpl<T> implements IMongoService<T> {

    private final MongoTemplate mongoTemplate;

    /**
     * 新增记录
     */
    @Override
    public T insert(T t) {
        return mongoTemplate.insert(t);
    }

    /**
     * 批量新增记录
     */
    @Override
    public Collection<T> batchInsert(Collection<? extends T> list) {
        return mongoTemplate.insertAll(list);
    }

    /**
     * 根据ID更新记录,对象属性全部更新
     */
    @Override
    public UpdateResult updateById(T t, Serializable id, Class<?> clazz) {
        Criteria criteria = Criteria.where("_id").is(id);
        Query query = new Query(criteria);
        Update update = getUpdateByObjectAllField(t);
        return mongoTemplate.updateMulti(query, update, clazz);
    }

    /**
     * 根据ID更新记录,仅更新不为null属性的对象
     */
    @Override
    public UpdateResult updateByIdSelective(T t, Serializable id, Class<?> clazz) {
        Criteria criteria = Criteria.where("_id").is(id);
        Query query = new Query(criteria);
        Update update = getUpdateByObjectNotNullField(t);
        return mongoTemplate.updateMulti(query, update, clazz);
    }

    /**
     * 根据ID删除记录
     */
    @Override
    public DeleteResult deleteById(String id, Class<?> clazz) {
        Query query = new Query(Criteria.where("_id").is(id));
        return mongoTemplate.remove(query, clazz);
    }

    /**
     * 根据条件删除记录
     */
    @Override
    public DeleteResult delete(Query query, Class<?> clazz) {
        return mongoTemplate.remove(query, clazz);
    }

    /**
     * 根据条件查询记录
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<T> find(Query query, Class<?> clazz) {
        return (List<T>) mongoTemplate.find(query, clazz);
    }

    /**
     * 查询集合全部记录
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<T> findAll(Class<?> clazz) {
        return (List<T>) mongoTemplate.findAll(clazz);
    }

    /**
     * 根据ID获取记录
     */
    @SuppressWarnings("unchecked")
    @Override
    public T findById(String id, Class<?> clazz) {
        return (T) mongoTemplate.findById(id, clazz);
    }

    /**
     * 根据条件查询一条记录
     */
    @SuppressWarnings("unchecked")
    @Override
    public T findOne(Query query, Class<?> clazz) {
        return (T) mongoTemplate.findOne(query, clazz);
    }


    /**
     * 将对象的所有属性设置进update
     */
    private Update getUpdateByObjectAllField(T t) {
        Document document = Document.parse(JSON.toJSONString(t));
        Update update = new Update();
        for (Map.Entry<String, Object> entry : document.entrySet()) {
            update.set(entry.getKey(), entry.getValue());
        }
        return update;
    }

    /**
     * 将对象内不为null的属性设置进update
     */
    private Update getUpdateByObjectNotNullField(T t) {
        Document document = Document.parse(JSON.toJSONString(t));
        Update update = new Update();
        for (Map.Entry<String, Object> entry : document.entrySet()) {
            if (entry.getValue() != null) {
                update.set(entry.getKey(), entry.getValue());
            }
        }
        return update;
    }

    /**
     * 分页查询
     */
    public <T> MongoPage<T> findPaging(Class<T> clazz, Query query, MongoPageable pageable) {
        long count = mongoTemplate.count(query, clazz);
        query.with(pageable.getPageRequest());
        List<T> list = mongoTemplate.find(query, clazz);
        return new MongoPage<>(list, pageable.getPageRequest().getPageNumber(), pageable.getPageRequest().getPageSize(), count);
    }

    /**
     * 获取数量
     */
    @Override
    public long getCount(Query query, Class<?> clazz) {
        return mongoTemplate.count(query, clazz);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.

3 工具类

package com.***.api.common;

import java.util.List;

public class MongoPage<T> {

    /**
     * 存储分页内容的列表
     */
    private final List<T> content;

    /**
     * 当前页码
     */
    private final int pageNumber;

    /**
     * 每页的大小
     */
    private final int pageSize;

    /**
     * 总共的元素数量
     */
    private final long totalElements;

    public MongoPage(List<T> content, int pageNumber, int pageSize, long totalElements) {
        this.content = content;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.totalElements = totalElements;
    }

    public List<T> getContent() {
        return content;
    }

    public int getPageNumber() {
        return pageNumber;
    }

    public int getPageSize() {
        return pageSize;
    }

    public long getTotalElements() {
        return totalElements;
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
package com.***.api.common;

import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

public class MongoPageable {

    /**
     * 页码
     */
    private final int page;

    /**
     * 每页的记录数
     */
    private final int size;

    /**
     * 排序条件
     */
    private Sort sort;

    public MongoPageable(int page, int size) {
        this.page = page;
        this.size = size;
    }

    public MongoPageable(int page, int size, Sort sort) {
        this.page = page;
        this.size = size;
        this.sort = sort;
    }

    public PageRequest getPageRequest() {
        if (sort == null) {
            return PageRequest.of(page, size);
        } else {
            return PageRequest.of(page, size, sort);
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.