Java连接MongoDB数据库进行增删改查操作

用于最近项目中用到了Mongodb数据库,这里简单记录下Java对Mongodb进行增删改查:

项目整体介绍:

采用springboot框架搭建的项目

用redis对每行数据进行排序

前端table展示使用element-ui离线文件

项目结构如下图:

 

MongodbUtils类:
package com.fengyulv.fyl.common.untils;

import com.fengyulv.fyl.common.config.Result;
import com.mongodb.BasicDBObject;
import org.springframework.data.domain.Sort;
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.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.regex.Pattern;

/**
 * @author fyl
 * @date 2021/06/01
 * mongodb的增删改查工具类
 */
@Component
public class MongodbUtils {
    public static MongodbUtils mongodbUtils;
    /**
     * 线程池创建
     */
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 200, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

    @PostConstruct
    public void init() {
        mongodbUtils = this;
        mongodbUtils.mongoTemplate = this.mongoTemplate;
    }

    @Resource
    private MongoTemplate mongoTemplate;

    /**
     * 查询出所有结果集 集合为数据对象中@Document 注解所配置的collection
     *
     * @param clazz 泛型
     * @return List
     */
    public static <T> List<T> findAll(Class<T> clazz) {
        List<T> resultList = mongodbUtils.mongoTemplate.findAll(clazz);
        return resultList;
    }

    /**
     * 分页查找某个子集元素的长度大于等于1,并且不为null
     *
     * @param childName 子集元素的名称
     * @param clazz     类型
     * @param <T>       泛型
     * @return 数据集合
     */
    public <T> List<T> findChildDocumentGtOne(Integer limit, Integer page, String childName, Class<T> clazz) {
        List<T> resultList = null;
        try {
            resultList = mongodbUtils.mongoTemplate.find(Query.query(Criteria.where(childName + ".0").exists(true).and(childName).exists(true)).limit(limit).skip(limit * (page - 1)), clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultList;
    }


    /**
     * 分页查询 集合为数据对象中@Document 注解所配置的collection
     *
     * @param page  当前页
     * @param limit 分页条数
     * @return 数据
     */
    public <T> Map<String, Object> findAllByPage(Class<T> clazz, Integer page, Integer limit) {
        Map<String, Object> map = new HashMap<>();
        page = page - 1;
        Query query = new Query();
        //根据集合中对象的某个字段排序
        query.with(Sort.by(Sort.Order.desc("sort")));
        long count = mongodbUtils.mongoTemplate.count(query, clazz);
        List<T> ts = mongodbUtils.mongoTemplate.find(query.limit(limit).skip(page * limit), clazz);
        map.put("data", ts);
        map.put("count", count);
        return map;
    }

    /**
     * 根据条件查询出所有结果集
     *
     * @param tClass         泛型
     * @param keys           查询条件 key
     * @param values         查询条件 value
     * @param collectionName 集合名字
     * @return 信息
     */
    public <T> List<T> findDataByKeyLimit(Class<T> tClass, String[] keys, String[] values, String collectionName) {
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            if (i == 0) {
                criteria = Criteria.where(keys[i]).is(values[i]);
            } else {
                criteria.and(keys[i]).is(values[i]);
            }
        }
        Query query = Query.query(criteria);
        //全部结果信息
        return mongodbUtils.mongoTemplate.find(query, tClass, collectionName);
    }

    /**
     * 根据条件查询出分页结果集
     *
     * @param clazz  泛型
     * @param page   当前页
     * @param limit  分页条数
     * @param keys   查询条件 key
     * @param values 查询条件 value
     * @return 信息
     */
    public <T> Map<String, Object> findDataByKey(Class<T> clazz, String[] keys, String[] values, Integer page, Integer limit) {
        Map<String, Object> map = new HashMap<>();
        page = page - 1;
        Query query = new Query();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Criteria criteria = null;
        for (int i = 0; i < keys.length; i++) {
            Pattern pattern = Pattern.compile("^" + values[i] + "", Pattern.CASE_INSENSITIVE);
            if (i == 0) {
                criteria = Criteria.where(keys[i]).regex(pattern);
            } else {
                criteria.and(keys[i]).regex(pattern);
            }
        }
        query.addCriteria(criteria);

        //总量
        CompletableFuture<Long> future1 = CompletableFuture.supplyAsync(() -> {
            long count = this.mongoTemplate.count(query, clazz);
            return count;
        }, executor);

        Integer finalPage = page;
        CompletableFuture<List<T>> future2 = CompletableFuture.supplyAsync(() -> {
            //根据集合中对象的某个字段排序
            query.with(Sort.by(Sort.Order.desc("sort")));
            List<T> resultList = new ArrayList<>();
            resultList = mongodbUtils.mongoTemplate.find(query.limit(limit).skip(limit * finalPage), clazz);
            return resultList;
        }, executor);

        CompletableFuture<Map<String, Object>> all = future1.thenCombineAsync(future2, (f1, f2) -> {
            Map<String, Object> maps = new HashMap<>();
            maps.put("count", f1);
            maps.put("data", f2);
            return maps;
        }, executor);

        try {
            map = all.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 修改子集的删除字段为1,表示删除
     *
     * @param documentId 文档的id
     */
    public void updateDataIsDel(String documentId, Class<?> clazz) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(documentId));
        mongodbUtils.mongoTemplate.remove(query, clazz);
    }

    public void updateDataPLIsDel(String[] documentId, Class<?> clazz) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").in(documentId));
        mongodbUtils.mongoTemplate.remove(query, clazz);
    }


    /**
     * 根据集合对象中的id删除数据
     *
     * @param id     对象id
     * @param tClass 映射的集合
     */
    public void removeById(String id, Class<?> tClass) {
        try {
            mongodbUtils.mongoTemplate.remove(new Query(Criteria.where("_id").is(id)), tClass);
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * 删除子集文档的数据
     *
     * @param documentId  父级文档的id
     * @param childIdName 子集文档的唯一字段名称
     * @param childId     子集文档的唯一字段名称的值
     * @param childName   子集文档的名字
     * @param tClass      泛型
     * @return Result
     */
    public Result removeChildDocument(String documentId, String childIdName, String childId, String childName, Class<?> tClass) {
        try {
            Query query = Query.query(Criteria.where("_id").is(documentId));
            BasicDBObject s = new BasicDBObject();
            s.put(childIdName, childId);
            Update update = new Update();
            update.pull(childName, s);
            mongodbUtils.mongoTemplate.updateFirst(query, update, tClass);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error(500, "删除失败");
        }
        return Result.ok();
    }


    /**
     * 根据key,value到指定集合删除数据
     *
     * @param key            键
     * @param value          值
     * @param collectionName 集合名
     */
    public Result removeByKeyValue(String key, Object value, String collectionName) {
        Criteria criteria = Criteria.where(key).is(value);
        criteria.and(key).is(value);
        Query query = Query.query(criteria);
        try {
            mongodbUtils.mongoTemplate.remove(query, collectionName);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error(500, "删除失败");
        }
        return Result.ok();
    }

    /**
     * 修改子集文档数组中内嵌文档指定一个元素的值
     *
     * @param documentId       父级文档的id
     * @param childIdName      子集文档的唯一字段名称
     * @param childId          子集文档的唯一字段名称的值
     * @param childName        子集文档的名字
     * @param updateChildName  要跟新的字段
     * @param updateChildValue 要跟新的值
     * @param tClass           泛型
     * @return Result
     */
    public Result updateChildDocument(String documentId, String childIdName, String childId, String childName, String updateChildName, String updateChildValue, Class<?> tClass) {
        try {
            Query query = Query.query(Criteria.where("_id").is(documentId)
                    .and(childName + "." + childIdName).is(childId));
            Update update = new Update();
            update.set(childName + ".$." + updateChildName, updateChildValue);
            mongoTemplate.updateFirst(query, update, tClass);
        } catch (Exception e) {
            return Result.error(500, "修改失败");
        }
        return Result.ok();
    }

    /**
     * 向子集文档添加一个数据
     *
     * @param query       条件
     * @param childIdName 子集文档名字
     * @param o           元素对象
     * @param tClass      泛型
     * @return 结果
     */
    public void saveOneFieldChildDocument(Query query, String childIdName, Object o, Class<?> tClass) {
        try {
            Update update = new Update();
            update.addToSet(childIdName, o);
            mongodbUtils.mongoTemplate.upsert(query, update, tClass);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 保存数据对象,集合为数据对象中@Document 注解所配置的collection
     *
     * @param obj
     */
    public void saveData(Object obj) {
        try {
            mongodbUtils.mongoTemplate.save(obj);
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * 指定集合保存数据对象
     *
     * @param obj            数据对象
     * @param collectionName 集合名
     */
    public void saveData(Object obj, String collectionName) {
        try {
            mongodbUtils.mongoTemplate.save(obj, collectionName);
        } catch (Exception e) {
            throw e;
        }
    }


    /**
     * 指定集合 修改数据,且仅修改找到的第一条数据
     *
     * @param accordingKey   修改条件 key
     * @param accordingValue 修改条件 value
     * @param updateKeys     修改内容 key数组
     * @param updateValues   修改内容 value数组
     * @param collectionName 集合名
     */
    public void updateFirst(String accordingKey, Object accordingValue, String[] updateKeys, Object[] updateValues, String collectionName) {
        Criteria criteria = Criteria.where(accordingKey).is(accordingValue);
        Query query = Query.query(criteria);
        Update update = new Update();
        for (int i = 0; i < updateKeys.length; i++) {
            update.set(updateKeys[i], updateValues[i]);
        }
        mongodbUtils.mongoTemplate.updateFirst(query, update, collectionName);
    }

    /**
     * 指定集合 修改数据,且修改所找到的所有数据
     *
     * @param accordingKey   修改条件 key
     * @param accordingValue 修改条件 value
     * @param updateKeys     修改内容 key数组
     * @param updateValues   修改内容 value数组
     * @param collectionName 集合名
     */
    public static void updateMulti(String accordingKey, Object accordingValue, String[] updateKeys, Object[] updateValues, String collectionName) {
        Criteria criteria = Criteria.where(accordingKey).is(accordingValue);
        Query query = Query.query(criteria);
        Update update = new Update();
        for (int i = 0; i < updateKeys.length; i++) {
            update.set(updateKeys[i], updateValues[i]);
        }
        mongodbUtils.mongoTemplate.updateMulti(query, update, collectionName);
    }
}
部分代码这里就不展示了,感兴趣的可以下载项目!
项目运行截图:



Gitee地址:
https://gitee.com/lifu1234/mongodb/

 

posted @ 2021-06-01 17:36  逢玉FYL  阅读(917)  评论(2编辑  收藏  举报