在SpringBoot中使用MongoDB完成数据存储

 更新时间:2023年11月19日 09:48:47   作者:Miaow.Y.Hu  
本文主要介绍了在SpringBoot中如恶化使用MongoDB完成数据存储,接下来这篇我们将围绕MongoDB进行,MongoDB是一个开源的,面向文档的NoSQL数据库管理系统,使用类似JSON的BSON(二进制JSON)格式来存储数据,具有灵活的数据模型和强大的查询功能,需要的朋友可以参考下

我们在开发中用到的数据存储工具有许多种,我们常见的数据存储工具包括:

关系性数据库:使用表格来存储数据,支持事务和索引。(如:MySQL,Oracle,SQL Server等)。NoSQL数据库:不使用表格来存储数据,而是使用键值对、文档、或者图形等方式来存储数据,适合处理高并发和大规模数据。(Redis,MongoDB,Cassandra等)文件存储:将数据存储在本地或者远程服务器文件中,常用与存储较小的文件。(FTP,SFTP,AWS C3等)云存储:数据存储在云端,方便多人协作和备份。(Google Drive,Dropbox,OneDriver等)内存存储 :将数据存储在内存中,提供快速的读写速度,但是不适用存储持久化数据(Redis,Memcache等)。缓存:将数据存储在缓存中,提高访问速度,减少数据库压力。(Apc,Memcache,Redis等)队列:将任务分发到不同的队列中进行处理,提高系统的可靠性和可拓展性。(RabbitMQ,Kafka等)

这篇我们将围绕MongoDB进行,MongoDB是一个开源的,面向文档的NoSQL数据库管理系统,使用类似JSON的BSON(二进制JSON)格式来存储数据,具有灵活的数据模型和强大的查询功能。

与传统的关系型数据库不同的是,MongoDB不使用表和行的结构,而是使用集合和文档进行的,一个集合就相当于关系型数据库里边的表,一个文档就相当于表中的一行数据,每个文档都是一个键值对的集合,可以包含不同类型的数据。

MongoDB的特点:

  • 面向文档:MongoDB使用灵活的文档模型,可以存储不同结构的数据,无需事先定义表结构。
  • 可扩展性:MongoDB支持水平扩展,可以通过添加更多的服务器来处理大规模的数据和高并发访问。
  • 高性能:MongoDB具有快速的读写性能,支持索引和复杂查询。
  • 强大的查询语言:MongoDB支持丰富的查询语言,包括条件查询、范围查询、正则表达式查询等。
  • 数据复制和故障恢复:MongoDB支持数据复制和自动故障恢复,可以提供高可用性和数据安全性。
  • 地理空间索引:MongoDB支持地理空间索引,可以进行地理位置相关的查询和分析。
  • 开源和活跃的社区:MongoDB是开源的,拥有庞大的用户社区和活跃的开发者社区。

首先在我们测试MongoDB之前,我们需要安装MongoDB,MongoDB下载网站:https://www.mongodb.com/try/download/community

在这里插入图片描述

之后安装后,创建一个test数据库:

在这里插入图片描述

引入相关依赖:

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

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

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

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

在application.properties中配置相关连接:

spring.data.mongodb.uri=mongodb://localhost:27017/test

server.port=7723

创建一个实体类User

public class User {

    @Id
    private Long id;

    private String username;
    private Integer age;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User() {
    }

    public User(Long id, String username, Integer age) {
        this.id = id;
        this.username = username;
        this.age = age;
    }
}

实现用户实体User的数据访问对象

public interface UserRepository extends MongoRepository<User, Long> {

    User findByUsername(String username);

}

接下来创建一个单元测试用例:

@SpringBootTest(classes = Application.class)
public class ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {
        userRepository.deleteAll();

        // 创建三个User,并验证User总数
        userRepository.save(new User(1L, "麻衣**", 22));
        userRepository.save(new User(2L, "娜*", 24));
        userRepository.save(new User(3L, "玩偶**", 26));
        Assertions.assertEquals(3, userRepository.findAll().size());

        // 删除一个User,再验证User总数
        User u = userRepository.findById(1L).get();
        userRepository.delete(u);
        Assertions.assertEquals(2, userRepository.findAll().size());

        // 删除一个User,再验证User总数
        u = userRepository.findByUsername("娜*");
        userRepository.delete(u);
        Assertions.assertEquals(1, userRepository.findAll().size());
    }

}

控制台输出

2023-11-17 15:39:39.655  INFO 15808 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
2023-11-17 15:39:39.737  INFO 15808 --- [localhost:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:2, serverValue:26}] to localhost:27017
2023-11-17 15:39:39.737  INFO 15808 --- [localhost:27017] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:1, serverValue:27}] to localhost:27017
2023-11-17 15:39:39.737  INFO 15808 --- [localhost:27017] org.mongodb.driver.cluster               : Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=17, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=58204100}
2023-11-17 15:39:39.963  INFO 15808 --- [           main] c.miaow.demo.ApplicationTests   : Started ApplicationTests in 2.079 seconds (JVM running for 2.619)
2023-11-17 15:39:40.106  INFO 15808 --- [           main] org.mongodb.driver.connection            : Opened connection [connectionId{localValue:3, serverValue:28}] to localhost:27017
2023-11-17 15:39:40.184  INFO 15808 --- [extShutdownHook] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:3, serverValue:28}] to localhost:27017 because the pool has been closed.
2023-11-17 15:39:40.184  INFO 15808 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

注意,MongoDB的语法有所区别,具体的如下:

查询语法:

插入文档:db.collection.insertOne(document)db.collection.insertMany(documents)

查询文档:db.collection.find(query, projection)

更新文档:db.collection.updateOne(filter, update)db.collection.updateMany(filter, update)

删除文档:db.collection.deleteOne(filter)db.collection.deleteMany(filter)

条件查询:db.collection.find({ field: value })

范围查询:db.collection.find({ field: { $gt: value1, $lt: value2 } })
正则表达式查询:db.collection.find({ field: /pattern/ })

排序:db.collection.find().sort({ field: 1 })(1表示升序,-1表示降序)

分页:db.collection.find().skip(offset).limit(limit)

聚合查询:db.collection.aggregate(pipeline)

在Java中的相关操作:

连接MongoDB:使用MongoClient类来连接MongoDB数据库。

普通连接方式,如果是Spring Boot中就是配置一下

MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("mydatabase");

获取集合:使用getCollection方法获取集合对象。

MongoCollection<Document> collection = database.getCollection("mycollection");

插入文档:

Document document = new Document("name", "miaow")
    .append("age", 24)
    .append("email", "miaow@example.com");
collection.insertOne(document);

查询文档:

FindIterable<Document> result = collection.find(new Document("name", "miaow"));
for (Document document : result) {
    // 处理查询结果
}

更新文档:

collection.updateOne(eq("name", "miaow"), new Document("$set", new Document("age", 24)));

删除文档:

collection.deleteOne(eq("name", "miaow"));

以上就是在SpringBoot中使用MongoDB完成数据存储的详细内容,更多关于SpringBoot MongoDB数据存储的资料请关注脚本之家其它相关文章!

相关文章

  • java集合继承关系图分享

    java集合继承关系图分享

    这篇文章主要为大家详细介绍了java集合继承关系图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 浅谈springboot多模块(modules)开发

    浅谈springboot多模块(modules)开发

    这篇文章主要介绍了浅谈springboot多模块(modules)开发,详细的介绍了springboot多模块的实现,有兴趣的可以了解一下
    2017-09-09
  • 使用MyBatis-Generator如何自动生成映射文件

    使用MyBatis-Generator如何自动生成映射文件

    这篇文章主要介绍了使用MyBatis-Generator如何自动生成映射文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java中的HashMap源码分析

    Java中的HashMap源码分析

    这篇文章主要介绍了Java中的HashMap源码分析,散列表是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表,需要的朋友可以参考下
    2023-09-09
  • java数据结构和算法中数组的简单入门

    java数据结构和算法中数组的简单入门

    在本文里小编给大家整理了关于java数据结构和算法中数组的简单入门知识点整理,需要的朋友们学习下。
    2019-06-06
  • 解决javaWEB中前后台中文乱码问题的3种方法

    解决javaWEB中前后台中文乱码问题的3种方法

    这篇文章主要介绍了解决javaWEB中前后台中文乱码问题的3种方法,中文问题一直是很多人难以解决的问题,对这方面感兴趣的朋友可以参考一下
    2015-11-11
  • 解决Mybatis plus实体类属性与表字段不一致的问题

    解决Mybatis plus实体类属性与表字段不一致的问题

    这篇文章主要介绍了Mybatis plus实体类属性与表字段不一致解决方法,文末给大家提到了Mybatis-plus中数据库表名和表字段名的相关知识,需要的朋友可以参考下
    2022-07-07
  • Java面试题之HashMap 的 hash 方法原理是什么

    Java面试题之HashMap 的 hash 方法原理是什么

    那天,小二去蔚来面试,面试官老王一上来就问他:HashMap 的 hash 方法的原理是什么?当时就把裸面的小二给蚌埠住了,这篇文章将详细解答该题目
    2021-11-11
  • SpringMVC + servlet3.0 文件上传的配置和实现代码

    SpringMVC + servlet3.0 文件上传的配置和实现代码

    本篇文章主要介绍了SpringMVC + servlet3.0 文件上传的配置和实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Java中常见的XML解析方法与应用详解

    Java中常见的XML解析方法与应用详解

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,被广泛应用于表示和交换独立于应用程序和硬件平台的结构化信息,下面我们就来看看它的常见解析方法有哪些吧
    2024-01-01

最新评论