SpringBoot集成MongoDB的实现

 更新时间:2025年01月06日 08:28:59   作者:rivercoder  
本文主要介绍了SpringBoot集成MongoDB的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、MongoDB简介

MongoDB 是一个开源的、高性能、无模式(schema-free)的文档型数据库,它属于 NoSQL 数据库的一种。MongoDB 的设计初衷是为了简化开发和方便扩展,同时提供可扩展的高性能数据存储解决方案。

以下是 MongoDB 的一些关键特点:

  • 面向文档:MongoDB 中的数据以文档的形式存储,这些文档是键值对的集合,类似于 JSON 对象但使用的是 BSON(Binary JSON)格式,这使得它可以存储复杂的数据类型。
  • 无模式(Schema-less):与关系型数据库不同,MongoDB 不需要预先定义固定的表结构,每个文档可以有不同的字段和数据类型。
  • 高可用性和扩展性:MongoDB 支持自动分片(sharding),这有助于水平扩展,能够处理大量的数据和高并发访问。
  • 丰富的查询语言:MongoDB 提供了强大的查询能力,其语法接近于面向对象的查询语言,支持复杂的查询操作,包括排序、聚合等。
  • 索引支持:为了加快查询速度,MongoDB 支持对字段创建索引,包括单字段索引、复合索引、地理空间索引等。
  • 复制和容错:通过副本集(replica set),MongoDB 可以实现数据的冗余存储,提高系统的可靠性和容错能力。
  • 易于使用和集成:MongoDB 提供了多种编程语言的驱动程序,方便开发者进行应用开发,并且拥有图形化管理工具如 Compass、Navicat、Studio 3T等来辅助数据库管理和维护。
  • 社区和支持:作为一个广泛使用的数据库系统,MongoDB 拥有一个活跃的社区和官方提供的商业支持服务。

MongoDB 被设计用来满足现代应用程序的需求,特别是那些需要处理大量非结构化或半结构化数据的应用场景,比如内容管理系统、实时分析、移动应用后端等。由于其灵活性和性能优势,MongoDB 成为许多开发者和企业的首选数据库解决方案之一。

2、MongoDB安装

Linux安装
下载MongoDB Community Server
下载地址:https://www.mongodb.com/try/download/community

解压后启动MongoDB Server

#创建dbpath和logpath
mkdir -p /mongodb/data /mongodb/log  
#进入mongodb目录,启动mongodb服务
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log

3、SpringBoot集成MongoDB

3.1、环境准备

1、引入依赖

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

完整依赖如下:

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>

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

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.68</version>
    </dependency>
  </dependencies>

2、配置

application.properties

# MongoDB
spring.data.mongodb.host = 127.0.0.1
spring.data.mongodb.port = 27017
spring.data.mongodb.database = test
spring.data.mongodb.auto-index-creation = true

# 或者直接使用uri方式
#spring.data.mongodb.uri=mongodb://user:password@127.0.0.1:27017/test?authSource=admin

# 打印mongoDB日志
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.mongodb.driver.connection=DEBUG

连接配置可参考文档 https://www.mongodb.com/zh-cn/docs/manual/reference/connection-string/

3.2、文档操作

1、新增实体

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "person") // 指定集合名称
public class Person {
    @Id  // 映射文档中的_id
    private Long id;
    private String name;
    private Integer age;
}

2、添加集合文档

集合操作时注入MongoTemplate

@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class InsertTests {
    
    @Resource
    private MongoTemplate mongoTemplate;

    @Test
    public void testInsert() {
        Person person = Person.builder().id(2L).name("river").age(18).build();
        mongoTemplate.insert(person);

        // 如果有就修改, 没有就插入
        mongoTemplate.save(Person.builder().id(2L).name("zhangsan").age(28).build());

        // 批量写入
        List<Person> persons = new ArrayList<>();
        for (int i = 100; i <= 150; i++) {
            person = Person.builder().id(Long.valueOf(i)).name("lisi" + i).age(i).build();
            persons.add(person);
        }
        mongoTemplate.insertAll(persons);
    }
}

插入数据时: insert插入的_id 不能有重复,否则会报 DuplicateKeyException 提示主键重复; save对已存在的数据进行更新;
批处理操作时: insertAll可以一次性插入所有数据,效率较高;save需遍历所有数据,一次插入或更新,效率较低。

3、查询集合文档

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class QueryTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void find() {
        // 查询集合中的全部文档数据
        List<Person> personList = mongoTemplate.findAll(Person.class);
        log.info("查询结果:{}", personList);

        // 查询集合中指定的ID文档数据
        Person byId = mongoTemplate.findById(1L, Person.class);
        log.info("查询结果:{}", byId.toString());

        // 根据条件查询符合条件的文档数据并返回第一条数据
        Query query = new Query(Criteria.where("name").is("river"));
        Person result = mongoTemplate.findOne(query, Person.class);
        log.info("查询结果:{}", result);

        // 根据条件查询所有符合条件的文档
        query = new Query(Criteria.where("age").gt(18));
        List<Person> list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        // 创建查询对象,然后将条件对象添加到其中
        Criteria criteria = Criteria.where("age").gt(18).lte(30);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        Criteria name = Criteria.where("name").is("zhangsan");
        Criteria age = Criteria.where("age").is(18);
        // 创建条件对象,将上面条件进行 AND 关联
        criteria = new Criteria().andOperator(name, age);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);

        // 从第5行开始,查询3条数据返回
        query = new Query(Criteria.where("age").is("20"))
                .with(Sort.by("id"))
                .limit(3).skip(5);
        list = mongoTemplate.find(query, Person.class);
        log.info("查询结果:{}", list);
    }
}

Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法查询连接起来,方便我们操作查询语句。

4、更新集合文档

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class UpdateTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void update() {
        Person person = mongoTemplate.findById(1L, Person.class);
        person.setName("wangwu");
        mongoTemplate.save(person);

        Query query = new Query(Criteria.where("id").is(1L));
        // 修改内容
        Update update = new Update().set("name", "lisi");
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Person.class);
//        // 只更新满足条件的第一条记录
//        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Person.class);

        // 没有符合条件的记录则插入数据
//       //  update.setOnInsert("id",11);  // 指定_id
//        updateResult = mongoTemplate.upsert(query, update, Person.class);

        // 返回修改的记录数
        log.info("updateResult: {}", updateResult.getModifiedCount());

    }
}

如果更新后的结果和更新前的结果是相同,返回0。
updateFirst() 只更新满足条件的第一条记录
updateMulti() 更新所有满足条件的记录
upsert() 没有符合条件的记录则插入数据

5、删除集合文档

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class DeleteTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void delete() {
        // 删除id为1的记录
        Query query = new Query(Criteria.where("id").is(1L));
        DeleteResult remove = mongoTemplate.remove(query, Person.class);
        log.info("删除的条数为:{}", remove.getDeletedCount());

        // 删除符合条件的单个文档并返回删除的文档
        query = new Query(Criteria.where("id").is(2L));
        Person per = mongoTemplate.findAndRemove(query, Person.class);
        log.info("删除的文档: {}", per);
    }
}

3.3、去掉_class属性

使用MongoTemplate写入文档时,会自动将_class属性添加到文档中,一般不需要使用_class属性,可以配置去掉_class属性。

@Configuration
public class MongoConfig {

    @Bean("mongoTemplate")
    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext mongoMappingContext) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        // 去掉_class字段
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
    }
}

到此这篇关于SpringBoot集成MongoDB的实现的文章就介绍到这了,更多相关SpringBoot集成MongoDB内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java中i++的一些问题总结

    Java中i++的一些问题总结

    这篇文章主要给大家介绍了关于Java中i++的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot @Test单元测试方式

    SpringBoot @Test单元测试方式

    这篇文章主要介绍了SpringBoot @Test单元测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • mybatis 在typeAliases别名时报错的解决

    mybatis 在typeAliases别名时报错的解决

    这篇文章主要介绍了mybatis 在typeAliases别名时报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot图文并茂讲解Lombok库的安装与使用

    SpringBoot图文并茂讲解Lombok库的安装与使用

    Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法;在使用Lombok之后,将由其来自动帮你实现代码生成
    2022-06-06
  • Springboot自定义注解&传参&简单应用方式

    Springboot自定义注解&传参&简单应用方式

    SpringBoot框架中,通过自定义注解结合AOP可以实现功能如日志记录与耗时统计,首先创建LogController和TimeConsuming注解,并为LogController定义参数,然后,在目标方法上应用这些注解,最后,使用AspectJ的AOP功能,通过切点表达式定位这些注解
    2024-10-10
  • SpringBoot3使用Jasypt实现配置文件信息加密的方法

    SpringBoot3使用Jasypt实现配置文件信息加密的方法

    对于一些单体项目而言,在没有使用SpringCloud的情况下,配置文件中包含着大量的敏感信息,如果这些信息泄露出去将会对企业的资产产生重大威胁,因此,对配置文件中的敏感信息加密是一件极其必要的事,所以本文介绍了SpringBoot3使用Jasypt实现配置文件信息加密的方法
    2024-07-07
  • Java中的关键字之final详解

    Java中的关键字之final详解

    这篇文章主要介绍了Java中的关键字之final详解,final关键字算是个高频的java基础问题了,面试官可能会问说说final,final修饰的抽象类能够被继承吗等等,下面汇总关于final关键字的知识点,需要的朋友可以参考下
    2024-01-01
  • IDEA中实现springboot热部署方式

    IDEA中实现springboot热部署方式

    在IDEA中实现SpringBoot的热部署可以通过修改设置来完成,首先在设置中搜索Compiler,并勾选Build project automatically,然后进入Advanced Settings,勾选Allow auto-make to start even if developed application is currently running
    2024-09-09
  • 使用Java实现RabbitMQ延时队列

    使用Java实现RabbitMQ延时队列

    RabbitMQ 延时队列是指消息在发送到队列后,并不立即被消费者消费,而是等待一段时间后再被消费者消费,本文为大家介绍了实现RabbitMQ延时队列的Java代码,希望对大家有所帮助
    2023-06-06
  • Java的System.getProperty()方法获取大全

    Java的System.getProperty()方法获取大全

    这篇文章主要介绍了Java的System.getProperty()方法获取大全,罗列了System.getProperty()方法获取各类信息的用法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12

最新评论