SpringBoot 整合MongoDB

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: SpringBoot 整合MongoDB

一、概述

MongoDB中的记录是一个文档,它是一个数据结构组成 字段和值对。MongoDB文档类似于JSON对象。

字段的值可能包括其他文档、数组、 和文档数组:

    • 数据库(Database):和关系型数据库一样,每个数据库中有自己的用户权限,不同的项目组可以使用不同的数据库
      • 集合(Collection): 集合指的是文档组(类似于 Mysql 中的表的概念),里面可以存储许多文档
        • 文档(Document): 文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档、数组和文档数组

        官网MongoDB: The Developer Data Platform | MongoDB

        二、主要特点

        1、高性能

        MongoDB提供高性能的数据持久性。特别

          • 对嵌入式数据模型的支持减少了数据库上的 I/O 活动 系统。
            • 索引支持更快的查询,并且可以包含来自嵌入式的键 文档和数组。

            2、查询接口

            MongoDB Query API 支持读写 操作(CRUD)以及:

              • 数据聚合
                • 文本搜索和地理空间查询。

                3、高可用性

                MongoDB的复制工具,称为副本集提供:

                  • 自动故障转移
                    • 数据冗余。

                    一个副本集是一组 维护相同数据集的MongoDB服务器,提供冗余 以及提高数据可用性。

                    4、水平可扩展性

                    MongoDB提供水平可扩展性作为其核心功能的一部分:

                      • 分片跨 计算机群集。
                        • 从3.4开始,MongoDB支持创建区的数据基于分片键.在一个 平衡集群,MongoDB直接读取和写入区域覆盖 只到区域内的那些碎片。请参阅的手册页了解更多信息。

                        5、支持多个存储引擎

                        MongoDB支持多个存储引擎:

                          • WiredTiger 存储引擎(包括对静态加密)
                            • In-Memory存储引擎。

                            此外,MongoDB提供了可插拔的存储引擎API,允许 为MongoDB开发存储引擎的第三方

                            6、MongoDB的体系结构与术语

                            MongoDB 是最像关系型数据库的非关系型数据库,之所以这样子说,是因为它的体系结构和MySQL 是比较像的。

                            我们通过对比的形式对 MongoDB 的体系结构做一个初步的了解。

                            SQL术语/概念

                            MongoDB术语/概念

                            解释/说明

                            database

                            database

                            数据库

                            table

                            collection

                            数据库表/集合

                            row

                            document

                            表中的一条数据

                            column

                            field

                            数据字段/域

                            index

                            index

                            索引

                            table joins

                            表连接,MongoDB不支持

                            primary key

                            primary key

                            主键,MongoDB自动将_id字段设置为主键

                            三、SpringBoot整合MongoDB

                            1、添加MongoDB依赖

                            Spring Data MongDB 是Spring Data的下的一个模块,在SpringBoot中整合MongoDB就需要添加Spring Data MongDB的依赖

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

                            image.gif

                            2、配置文件

                            spring:
                              data:
                                mongodb:
                                  host: 192.168.136.160
                                  port:27017
                                  database:leo
                                  username:admin
                                  password:123456

                            image.gif

                            3、实例代码

                            主要注解:

                            @Document,文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。

                            @Id(主键):用来将成员变量的值映射为文档的_id的值

                            @Indexed(索引): 索引是一种特殊的数据结构,存储在一个易于遍历读取的数据集合中,能够对数据库文档中的数据进行排序。索引能极大提高文档查询效率,如果没有设置索引,MongoDB 会遍历集合中的整个文档,选取符合查询条件的文档记录。这种查询效率是非常低的。

                            @Field(字段): 文档中的字段,类似于 MySql 中的列。

                            @Aggregation(聚合): 聚合主要用于数据处理,例如统计平均值、求和等。

                            import org.springframework.data.annotation.Id;
                            import org.springframework.data.mongodb.core.mapping.Document;
                            @Document(collection = "Book")
                            public class Book {
                                @Id
                                private String id;
                                private String title;
                                private String author;
                                private String summary;
                                public String getId() {
                                    return id;
                                }
                                public void setId(String id) {
                                    this.id = id;
                                }
                                public String getTitle() {
                                    return title;
                                }
                                public void setTitle(String title) {
                                    this.title = title;
                                }
                                public String getAuthor() {
                                    return author;
                                }
                                public void setAuthor(String author) {
                                    this.author = author;
                                }
                                public String getSummary() {
                                    return summary;
                                }
                                public void setSummary(String summary) {
                                    this.summary = summary;
                                }
                            }

                            image.gif

                            SpringBoot操作MongoDB有两种方式,分别是继承MongoRepository类和service注入MongoTemplate

                            MongoRepository方式:

                            Repository是用于操作数据库的类

                            package com.palmer.rachelle.javaspringmongodb.repository;
                            import com.palmer.rachelle.javaspringmongodb.model.Book;
                            import org.springframework.data.mongodb.repository.MongoRepository;
                            import java.util.List;
                            public interface BookRepository extends MongoRepository<Book, String> {
                                List<Book> findByTitleStartsWithOrAuthor(String title, String author);
                            }

                            image.gif

                            Controller代码:

                            import com.palmer.rachelle.javaspringmongodb.model.Book;
                            import com.palmer.rachelle.javaspringmongodb.repository.BookRepository;
                            import org.springframework.beans.factory.annotation.Autowired;
                            import org.springframework.stereotype.Controller;
                            import org.springframework.ui.Model;
                            import org.springframework.validation.BindingResult;
                            import org.springframework.web.bind.annotation.GetMapping;
                            import org.springframework.web.bind.annotation.PathVariable;
                            import org.springframework.web.bind.annotation.PostMapping;
                            import java.util.List;
                            @Controller
                            public class BookController {
                                @Autowired
                                private BookRepository bookRepository;
                                /**
                                 * Handles listing of all books and searching.
                                 * @param model
                                 * @return
                                 */
                                @GetMapping({"/index", "/search"})
                                public String showBooks(Model model, String keyword) {
                                    if (keyword != null) {
                                        model.addAttribute("books",
                                            this.bookRepository.findByTitleStartsWithOrAuthor(keyword, keyword));
                                        model.addAttribute("keyword", keyword);
                                    } else {
                                        List<Book> books = this.bookRepository.findAll();
                                        model.addAttribute("books", books);
                                    }
                                    return "index";
                                }
                                /**
                                 * Show form for adding a book document
                                 * @param book
                                 * @return
                                 */
                                @GetMapping("/add-book")
                                public String showAddBookForm(Book book) {
                                    return "add-book";
                                }
                                /**
                                 * This will CREATE a books. C of CRUD.
                                 * @param book
                                 * @param result
                                 * @param model
                                 * @return
                                 */
                                @PostMapping("/add-book")
                                public String addBook(Book book, BindingResult result, Model model) {
                                    if (result.hasErrors()) {
                                        return "add-book";
                                    }
                                    this.bookRepository.save(book);
                                    return "redirect:/index";
                                }
                                /**
                                 * Show form for editing a book document. The R in CRUD.
                                 * @param id
                                 * @param model
                                 * @return
                                 */
                                @GetMapping("/edit-book/{id}")
                                public String showUpdateForm(@PathVariable("id") String id, Model model) {
                                    Book book = this.bookRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid book Id:" + id));
                                    model.addAttribute("book", book);
                                    return "edit-book";
                                }
                                /**
                                 * This will update a book document. The U in CRUD
                                 * @param id
                                 * @param book
                                 * @param result
                                 * @param model
                                 * @return
                                 */
                                @PostMapping("/edit-book/{id}")
                                public String updateBook(@PathVariable("id") String id, Book book, BindingResult result, Model model) {
                                    if (result.hasErrors()) {
                                        book.setId(id);
                                        return "edit-book";
                                    }
                                    this.bookRepository.save(book);
                                    return "redirect:/index";
                                }
                                /**
                                 * This will delete a book document. The D in CRUD.
                                 * @param id
                                 * @param model
                                 * @return
                                 */
                                @GetMapping("/delete-book/{id}")
                                public String deleteUser(@PathVariable("id") String id, Model model) {
                                    Book book = this.bookRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid book Id:" + id));
                                    this.bookRepository.delete(book);
                                    return "redirect:/index";
                                }
                            }

                            image.gif

                            MongoTemplate实现方式:

                            MongoTemplate是由org.springframework.data.mongodb.corepacket 提供一个Java类。它提供了一组用于与MongoDB交互的丰富特性,并充当Spring的MongoDB支持的中心类。此外,MongoTemplate是线程安全的,可以跨多个实例调用。MongoTemplate类实现了接口MongoOperations,提供了流畅的API进行Query, Criteria, Update等基本操作,此外,也支持泛型的方法实现。使用起来也非常方便,可直接将MongoTemplate作为类中的属性来使用。

                            import java.util.List;
                            /**
                             * @author  
                             * @version 1.0
                             * @date 2022/12/17 15:33
                             */
                            public interface BookService {
                                List<Book> findAll();
                                NewUser findById(String BookId);
                                NewUser save(Book book);
                                void deleteById(String BookId);
                            }

                            image.gif

                            import org.springframework.beans.factory.annotation.Autowired;
                            import org.springframework.data.mongodb.core.MongoTemplate;
                            import org.springframework.data.mongodb.core.query.Criteria;
                            import org.springframework.data.mongodb.core.query.Query;
                            import java.util.List;
                            public class BookServiceImpl implements BookService {
                                @Autowired
                                private MongoTemplate template;
                                @Override
                                public List<Book> findAll() {
                                    return template.findAll(Book.class);
                                }
                                @Override
                                public Book findById(String BookId) {
                                    return template.findById(BookId,Book.class);
                                }
                                @Override
                                public Book save(Book book) {
                                    template.save(book);
                                    return book;
                                }
                                @Override
                                public void deleteById(String BookId) {
                                    Query query = new Query();
                                    query.addCriteria(Criteria.where("id").is(BookId));
                                    template.remove(query, Book.class);
                                }
                            }

                            image.gif

                            @RestController
                            @RequestMapping("/book")
                            public class BookController {
                                @Autowired
                                private final BookService bookService;
                                @GetMapping("")
                                public List<Book> getAllBooks() {
                                    return bookService.findAll();
                                }
                                @GetMapping("/{userId}")
                                public Book getByBookId(@PathVariable String bookId) {
                                    return bookService.findById(bookId);
                                }
                                @PostMapping("/addNewBook")
                                @ResponseBody
                                public Book addNewBook(@RequestBody Book book) {
                                    return bookService.save(book);
                                }
                                @DeleteMapping("/{bookId}")
                                public String delete(@PathVariable String bookId) {
                                    Book book = new Book();
                                    book.setId(bookId);
                                    bookService.deleteById(bookId);
                                    return "deleted: " + bookId;
                                }
                                @PutMapping("")
                                public Book update(@RequestBody Book book) {
                                    return bookService.save(book);
                                }
                            }

                            image.gif

                             


                            Doker 技术人的数码品牌!!!

                            文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群!!!你的支持和鼓励是我创作的动力❗❗❗

                            官网:Doker 多克; 官方旗舰店首页-Doker 多克创新官方店-淘宝网全品大优惠优惠!!!

                            相关实践学习
                            MongoDB数据库入门
                            MongoDB数据库入门实验。
                            快速掌握 MongoDB 数据库
                            本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
                            目录
                            相关文章
                            |
                            2月前
                            |
                            NoSQL Java MongoDB
                            springboot整合MongoDB(简单demo实现包含注意点及踩坑)
                            springboot整合MongoDB(简单demo实现包含注意点及踩坑)
                            93 0
                            |
                            4月前
                            |
                            NoSQL Java 测试技术
                            spring boot MongoDB实战(二)
                            spring boot MongoDB实战
                            86 1
                            |
                            4月前
                            |
                            NoSQL Java MongoDB
                            spring boot整合MongoDB 一(2)
                            spring boot整合MongoDB 一
                            61 0
                            |
                            4月前
                            |
                            NoSQL Java MongoDB
                            spring boot整合MongoDB 一(3)
                            spring boot整合MongoDB 一
                            56 0
                            |
                            4月前
                            |
                            NoSQL Java MongoDB
                            Spring Boot中MongoDB的使用和实战
                            Spring Boot中MongoDB的使用和实战
                            63 0
                            |
                            4月前
                            |
                            存储 NoSQL MongoDB
                            spring boot整合MongoDB 一(1)
                            spring boot整合MongoDB 一
                            82 0
                            |
                            4月前
                            |
                            NoSQL MongoDB 数据库
                            MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
                            MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
                            144 0
                            |
                            4月前
                            |
                            NoSQL Java MongoDB
                            spring boot MongoDB实战(一)
                            spring boot MongoDB实战
                            55 1
                            |
                            5月前
                            |
                            存储 NoSQL Java
                            微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
                            微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
                            118 0
                            |
                            5天前
                            |
                            NoSQL MongoDB 数据库
                            MongoDB数据恢复—MongoDB数据库文件被破坏的数据恢复案例
                            服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分区进行了格式化操作,然后将数据库文件拷回原分区,重新启动MongoDB服务,服务无法启动。