整合代码教程

pom文件里添加mongodb依赖

<!-- mongodb -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

application.yml配置文件 添加mongodb 配置

写法一:

spring:
  data:
    mongodb:
      host: 127.0.0.1
      username: process
      password: 123456
      port: 27017
      database: tarzan

 写法二:

data:
    mongodb:
      database:tarzan
      uri: mongodb://process:123456@127.0.0.1:27017

推荐使用第二种写法,因为第一种必须给每个mongodb的数据库设置用户密码,第二种,只需要给服务器的mongo设置用户密码,所有的数据库都可通用 

mongodb操作工具类

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.formula.functions.T;
import org.bson.Document;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.mongodb.core.CollectionOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.*;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

/**
 * Mongo db工具类
 *
 * @author tarzan
 * @version 1.0
 * @company 北斗天地股份有限公司
 * @copyright (c) 2020 Niubility Tiger Co.LTD.All rights reserved.
 * @date 2022年03月08日 10:44:18
 * @since JDK1.8
 */
@Lazy
@Component
public class MongoUtil {
    /** 无条件查询 */
    public static final Query EMPTY_QUERY = new BasicQuery("{}");

    public static MongoTemplate template;

    static {
        MongoUtil.template = SpringUtil.getBean(MongoTemplate.class);
    }

    /**
     * 方法描述: query-by-id
     *
     * @param id
     * @Return {@link Query}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:20:20
     */
    private static Query idQuery(String id) {
        Criteria criteria = Criteria.where("id").is(id);
        return Query.query(criteria);
    }

    /**
     * 方法描述: multi-key-eq-val-query
     *
     * @param data
     * @Return {@link Query}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:20:45
     */
    public static Query eqQuery(Map<String, Object> data) {
        if (CollectionUtils.isEmpty(data)) {
            return EMPTY_QUERY;
        }
        Criteria criteria = new Criteria();
        for (Map.Entry<String, Object> entry : data.entrySet()) {
            criteria.and(entry.getKey()).is(entry.getValue());
        }
        return Query.query(criteria);
    }

    /**
     * 方法描述: single-key-eq-val-query
     *
     * @param field
     * @param val
     * @Return {@link Query}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:21:13
     */
    public static Query eqQuery(String field, Object val) {
        assert !StringUtils.isEmpty(field);
        Criteria criteria = Criteria.where(field).is(val);
        return Query.query(criteria);
    }

    /**
     * 方法描述: collection-name exists
     *
     * @param collectionName
     * @Return {@link boolean}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:22:00
     */
    public static boolean collectionExists(String collectionName) {
        return template.collectionExists(collectionName);
    }

    /**
     * 方法描述: clazz exists
     *
     * @param clazz
     * @throws
     * @Return {@link boolean}
     * @author tarzan
     * @date 2019年12月05日 16:29:34
     */
    public static boolean collectionExists(Class<?> clazz) {
        return template.collectionExists(clazz);
    }

    /**
     * 方法描述: find by id
     *
     * @param id
     * @param clazz
     * @Return {@link K}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:24:28
     */
    public static <K> K findById(String id, Class<K> clazz) {
        return template.findOne(idQuery(id), clazz);
    }

    /**
     * 方法描述: get mongo collection by tableName
     *
     * @param tableName
     * @Return {@link MongoCollection< Document>}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:25:17
     */
    public static MongoCollection<Document> getCollection(String tableName) {
        assert !StringUtils.isEmpty(tableName);
        return template.getCollection(tableName);
    }

    /**
     * 方法描述: create mongo collection by tableName
     *
     * @param tableName
     * @Return {@link MongoCollection< Document>}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:25:32
     */
    public static MongoCollection<Document> createCollection(String tableName) {
        assert !StringUtils.isEmpty(tableName);
        if (collectionExists(tableName)) {
            return getCollection(tableName);
        }
        return template.createCollection(tableName);
    }

    /**
     * 方法描述:  create mongo collection by tableName and collection-options
     *
     * @param tableName
     * @param options
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:27:20
     */
    public static void createCollection(String tableName, CollectionOptions options) {
        assert !StringUtils.isEmpty(tableName);
        if (collectionExists(tableName)) {
            return;
        }
        template.createCollection(tableName, options);
    }

    /**
     * 方法描述: create mongo collection by clazz
     *
     * @param clazz
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:29:03
     */
    public static void createCollection(Class<?> clazz) {
        assert clazz != null;
        if (collectionExists(clazz)) {
            return;
        }
        template.createCollection(clazz);
    }

    /**
     * 方法描述: drop collection
     *
     * @param tableName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:29:18
     */
    public static void dropCollection(String tableName) {
        assert !StringUtils.isEmpty(tableName);
        template.dropCollection(tableName);
    }

    /**
     * 方法描述: insert
     *
     * @param t
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:29:28
     */
    public static void insert(Object t) {
        assert t != null;
        template.insert(t);
    }

    /**
     * 方法描述:  batch insert in specified  table
     *
     * @param coll
     * @param tableName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:29:41
     */
    public static <K> void insertBatch(Collection<K> coll, String tableName) {
        assert !StringUtils.isEmpty(tableName) && !CollectionUtils.isEmpty(coll);
        template.insert(coll, tableName);
    }

    /**
     * 方法描述: batch insert (support multi tables)
     *
     * @param coll
     * @Return {@link boolean}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:30:34
     */
    public static <K> boolean insertAll(Collection<K> coll) {
        assert !CollectionUtils.isEmpty(coll);
        template.insertAll(coll);
        return true;
    }

    /**
     * 方法描述: insert or update
     *
     * @param t
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:31:03
     */
    public static <K> void save(K t) {
        assert t != null;
        template.save(t);
    }

    /**
     * 方法描述: update first
     *
     * @param t
     * @param collectionName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:31:40
     */
    public static <K> void save(K t, String collectionName) {
        assert t != null && !StringUtils.isEmpty(collectionName);
        template.save(t, collectionName);
    }

    /**
    * 方法描述: update first
    *
    * @param query
    * @param update
    * @param tableName
    * @Return {@link boolean}
    * @throws
    * @author tarzan
    * @date 2022年03月08日 11:31:50
    */
    public static boolean updateFirst(Query query, Update update, String tableName) {
        assert update != null && !StringUtil.isEmpty(tableName);
        UpdateResult wr = template.updateFirst(query, update, tableName);
        return wr.getModifiedCount() == 1;
    }

    /**
     * 方法描述: update by id
     *
     * @param id
     * @param obj
     * @param clazz
     * @Return {@link boolean}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:32:03
     */
    public static <K> boolean updateById(String id, JSONObject obj, Class<?> clazz) {
        DBObject update = new BasicDBObject();
        obj.put("update_time", new Date());
        update.put("$set", obj);
        UpdateResult result = template.updateFirst(idQuery(id), new BasicUpdate(update.toString()), clazz);
        return result.getModifiedCount() == 1;
    }

    /**
     * 方法描述: auto-inc specified  filed by id
     *
     * @param id
     * @param field
     * @param type
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:32:22
     */
    public static <K> void updateIncById(String id, String field, Class<K> type) {
        Query query = idQuery(id);
        Update inc = new Update().inc(field, 1);
        template.updateFirst(query, inc, type);
    }

    /**
     * 方法描述:  auto-inc specified  field by id
     *
     * @param id
     * @param field
     * @param collectionName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:32:47
     */
    public static void updateIncById(String id, String field, String collectionName) {
        Query query = idQuery(id);
        Update inc = new Update().inc(field, 1);
        template.updateFirst(query, inc, collectionName);
    }

    /**
     * 方法描述:  auto-inc specified  field specified step by id
     *
     * @param id
     * @param field
     * @param step
     * @param type
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:33:10
     */
    public static <K> void updateIncById(String id, String field, Integer step, Class<K> type) {
        if (step == 0) {
            return;
        }
        Query query = idQuery(id);
        Update inc = new Update().inc(field, step);
        template.updateFirst(query, inc, type);
    }

    /**
     * 方法描述:  auto-inc specified  field specified step by id
     *
     * @param id
     * @param field
     * @param num
     * @param collectionName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:33:10
     */
    public static void updateIncById(String id, String field, Integer num, String collectionName) {
        if (num == 0) {
            return;
        }
        Query query = idQuery(id);
        Update inc = new Update().inc(field, num);
        template.updateFirst(query, inc, collectionName);
    }

    /**
     * 方法描述: multi update in specified table
     *
     * @param query
     * @param update
     * @param tableName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:34:20
     */
    public static void updateMulti(Query query, Update update, String tableName) {
        template.updateMulti(query, update, tableName);
    }

    /**
     * 方法描述: 条件统计
     *
     * @param query
     * @param collectionName
     * @throws
     * @Return {@link long}
     * @author tarzan
     * @date 2019年12月05日 16:16:19
     */
    public static long count(Query query, String collectionName) {
        return template.count(query, collectionName);
    }

    /**
     * 方法描述: search
     *
     * @param query
     * @param clazz
     * @Return {@link List<K>}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:34:52
     */
    public static <K> List<K> find(Query query, Class<K> clazz) {
        return template.find(query, clazz);
    }

    /**
     * 方法描述: delete by id
     *
     * @param id
     * @param collectionName
     * @Return {@link boolean}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:35:05
     */
    public static boolean deleteById(String id, String collectionName) {
        DeleteResult result = template.remove(idQuery(id), collectionName);
        return result.getDeletedCount() == 1;
    }

    /**
     * 方法描述: delete by id
     *
     * @param id
     * @param clazz
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:35:17
     */
    public static void deleteById(String id, Class<?> clazz) {
        template.remove(idQuery(id), clazz);
    }

    /**
     * 方法描述: batch delete
     *
     * @param query
     * @param collectionName
     * @Return
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:35:29
     */
    public static void deleteBatch(Query query, String collectionName) {
        template.remove(query, collectionName);
    }

    /**
     * 方法描述: count
     *
     * @param query
     * @param clazz
     * @Return {@link long}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:34:41
     */
    public static long count(Query query, Class<T> clazz) {
        return template.count(query, clazz);
    }

    /**
     * 方法描述: count by id ( determinte the record exists )
     *
     * @param id
     * @param collectionName
     * @Return {@link long}
     * @throws
     * @author tarzan
     * @date 2022年03月08日 11:35:40
     */
    public static long countById(String id, String collectionName) {
        if (StringUtils.isEmpty(id) || StringUtils.isEmpty(collectionName)) {
            return 0L;
        }
        return template.count(idQuery(id), collectionName);
    }

    public static void resolve(T t) {

    }

}

分页实现代码demo

@Override
    public Page<UnifyDownholeDrill> getPage(int current,int size) {
        Query mongoQuery = new Query();
        long count = mongoTemplate.count(mongoQuery, UnifyDownholeDrill.class);
        Pageable pageable = PageRequest.of((current - 1) * size, size);
        List<UnifyDownholeDrill> pageList = mongoTemplate.find(mongoQuery.with(pageable), UnifyDownholeDrill.class);
        Page<UnifyDownholeDrill> page = new PageImpl<UnifyDownholeDrill>(pageList, pageable, count);
        return page;
    }

MongoDB 保存数据出现_class 如何去掉

添加mongodb配置转换类

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

/**
 * @author tarzan
 */
@Configuration
public class MongoConfig {

    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
        try {
            mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
        }
        catch (NoSuchBeanDefinitionException ignore) {}
        // Don't save _class to mongo
        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return mappingConverter;
    }

}

相关知识点

MongoDB

MongoDB是一种开源的、面向文档的NoSQL数据库管理系统,它使用了由键值对组成的BSON(Binary JSON)格式来存储数据。MongoDB以其灵活性、可伸缩性和容错特性而闻名于世。

1. 数据模型: MongoDB采用文档数据库模型,即将数据存储在一个称为文档的结构化记录中。文档可以是JSON、BSON等格式,不需要遵循固定的模式,这使得MongoDB非常适合处理半结构化和多变的数据。文档的字段可以包含子文档、数组和其他复杂类型。

2. 查询语言和索引: MongoDB提供了强大的查询语言,支持各种操作符和函数,可以进行复杂的查询和聚合操作。同时,MongoDB内置了多种类型的索引(例如B树索引、地理空间索引等),以加快查询速度并优化性能。

3. 可扩展性和分布式架构: MongoDB具有良好的可扩展性,可以轻松地通过添加更多的节点来实现集群化,并自动分布数据到各个节点上。通过在多个节点上进行数据复制,还可以提高系统的可靠性和容错性。

4. 高性能: MongoDB支持以写入驱动和读取驱动的方式进行数据访问,可以根据应用程序的需求选择合适的读写策略。在写入方面,MongoDB支持快速的批量写操作,可以将大量的文档一次性插入或更新到数据库中。在读取方面,MongoDB的查询引擎使用了各种优化技术(如索引和查询计划优化),以提供高效的查询性能。

5. 安全性: MongoDB提供了多种安全机制来保护数据库的数据和访问权限。可以通过身份验证、访问控制、加密传输等方式来确保数据的机密性和完整性。此外,MongoDB还支持审计功能,记录所有与数据库相关的操作和事件。

6. 社区和生态系统: MongoDB拥有一个活跃的开源社区,提供了丰富的工具和第三方库,以及大量的文档和教程。这使得开发人员能够更轻松地学¥和使用MongoDB,并解决遇到的问题。

总结起来,MongoDB是一款适用于处理半结构化和多变的数据的强大数据库管理系统。它具有灵活性、可伸缩性、强大的查询语言和索引、高性能、安全性以及活跃的社区支持等特点,广泛应用于Web应用程序、大数据分析、实时分析等场景中。

spring-boot-starter-data-mongodb

spring-boot-starter-data-mongodb是Spring Boot提供的用于集成MongoDB数据库的起步依赖。它简化了在Spring Boot应用程序中使用MongoDB的配置和操作,提供了一系列预配置的类和方法,使得开发人员可以更轻松地进行MongoDB的数据访问和操作。以下是关于spring-boot-starter-data-mongodb的详细解释:

  1. 配置简化:spring-boot-starter-data-mongodb通过自动配置功能,减少了手动配置的工作量。只需在application.properties或application.yml文件中添加相应的配置属性,即可完成与MongoDB的连接。
  2. MongoDB模板(MongoTemplate):该起步依赖提供了MongoTemplate类,用于执行各种MongoDB操作,如插入文档、更新文档、查询文档等。MongoTemplate封装了MongoDB原生驱动的操作,使得操作更加简洁和方便。
  3. Repository支持:spring-boot-starter-data-mongodb还集成了Spring Data MongoDB,可以通过接口方式定义Repository,并自动生成对应的实现类。这样,开发人员只需编写Repository接口,无需编写实现逻辑即可完成基本的CRUD操作。
  4. 实体映射:支持使用注解将Java实体类映射到MongoDB中的文档(Document),简化了实体与文档之间的转换和操作过程。
  5. 插件扩展:spring-boot-starter-data-mongodb为MongoDB提供了丰富的插件扩展机制,可以根据需要添加和使用各种插件,如查询注解、聚合操作等。
  6. 数据验证和转换:该起步依赖支持数据验证和转换功能,可以通过注解方式定义字段级别的验证规则,并提供了一系列内置的数据转换器,用于在文档和实体之间进行数据转换。

总结:

spring-boot-starter-data-mongodb是Spring Boot提供的用于集成MongoDB数据库的起步依赖。它使得在Spring Boot应用程序中使用MongoDB变得更加简单和高效,提供了预配置的类和方法,简化了MongoDB的数据访问和操作。通过学习和掌握spring-boot-starter-data-mongodb的特性和用法,开发人员可以更好地利用Spring Boot和MongoDB构建强大的应用程序。然而,深入理解和熟练应用spring-boot-starter-data-mongodb还需要进一步的学习和实践,请根据实际需求和情况不断探索和扩展您对其的认识和应用能力。