• Spring Boot 整合 NoSQL(3)


    本章概要

    • 整合 MongoDB

    6.2 整合 MongoDB

    6.2.1 MongoDB 简介

    MongoDB 是一种面向文档的数据库管理系统,它是一个介于关系型数据库和非关系型数据库之间的产品,MongoDB 功能丰富,它支持一种类似 JSON 的 BSON 数据格式,既可以存储简单的数据格式,也可以存储复杂的数据类型。MongoDB 最大的特点是它支持的查询语句非常强大,并且还支持对数据建立索引。总体来说,MongoDB 是一款应用相当广泛的 NoSQL 数据库。

    6.2.2 MongoDB 安装

    MongoDB 版本 4.0.0 ,安装环境 CentOS 7

    1. 下载 MongoDB

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
    
    • 1

    在这里插入图片描述

    解压,重命名

    tar -zxvf mongodb-linux-x86_64-4.0.0.tgz -C /opt/soft/
    mv /opt/soft/mongodb-linux-x86_64-4.0.0 /opt/soft/mongodb
    
    • 1
    • 2

    2. 配置 MongoDB

    进入 MongoDB 目录下,创建两个文件夹 db 和 logs ,分别用来保存数据和日志

    mkdir /opt/soft/mongodb/db
    mkdir /opt/soft/mongodb/logs
    touch /opt/soft/mongodb/logs/mongdb.log
    
    • 1
    • 2
    • 3

    然后进入 bin 目录下,创建一个新的 MongoDB 配置文件 mongo.conf ,文件内容如下

    dbpath=/opt/soft/mongodb/db
    logpath=/opt/soft/mongodb/logs/mongdb.log
    port=27017
    fork=true
    
    • 1
    • 2
    • 3
    • 4

    配置解释:

    • fork 表示以守护程序的方式启动 MongoDB ,即允许 MongoDB 在后台运行
    • 其它三个自行脑补

    3. MongoDB 的启动和关闭

    启动 MongoDB

    /opt/soft/mongodb/bin/mongod -f /opt/soft/mongodb/bin/mongo.conf --bind_ip_all
    
    • 1

    在这里插入图片描述

    参数解释:

    • -f 指定配置文件
    • –bind_ip_all 允许所有远程地址连接

    执行 mongo 命令,进入 MongoDB 控制台,输入db.version(),查看版本号

    /opt/soft/mongodb/bin/mongo
    db.version()
    
    • 1
    • 2

    在这里插入图片描述

    默认情况下,启动后连接的是 MongoDB 中的 test 库,而关闭 MongoDB 的命令需要在 admin 库中执行,因此关闭 MongoDB 需要先切换到 admin 库,然后执行 db.shutdownServer(); 命令,如下

    use admin;
    db.shutdownServer(); 
    exit
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4. 安全管理

    默认情况下,启动的 MongoDB 没有登录密码,在生产环境中非常不安全,但是不同于 MySQL、Oracle 等关系型数据库, MongoDB 中每一个都有独立的密码,在那一个库中创建用户就要在哪一个库中验证密码。要配置密码,首先要创建一个用户,例如在 admin 库中创建一个用户,如下

    use admin;
    db.createUser({user:"root1",pwd:"root1",roles:[{role:"readWrite",db:"test"}]});
    
    • 1
    • 2

    在这里插入图片描述

    新创建的用户名为 root1 ,密码是 root1 ,roles 表示该用户具有的角色,这里的配置表示该用户对 test 库具有读和写两项权限
    用户创建成功后,关闭当前实例,然后重新启动

    /opt/soft/mongodb/bin/mongod -f /opt/soft/mongodb/bin/mongo.conf --auth --bind_ip_all
    
    • 1

    启动成功后,在此进入控制台,然后切换到 admin 库中验证登录(默认连接上的库是 test 库),验证成功后就可以对 test 库进行读写操作了,如下

    /opt/soft/mongodb/bin/mongo
    use admin;
    db.auth("root1","root1")
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    db.auth(“root1”,“root1”) 返回 1 表示认证成功。

    6.2.3 整合 Spring Boot

    借助于 Spring Data MongoDB ,Spring Boot 为 MongoDB 也提供了开箱即用的自动化配置方案,具体步骤如下:

    1. 创建 Spring Boot 工程

    创建 Spring Boot Web 工程,添加 MongoDB 依赖,如下

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-data-mongodbartifactId>
    dependency>
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 配置 MongoDB

    在 application.properties 中配置 MongoDB 连接信息

    # 验证登录信息的库
    spring.data.mongodb.authentication-database=admin
    # 要连接的库,认证信息不一定要在连接的库中创建,因此这两个分开配置
    spring.data.mongodb.database=test
    # mongodb 的连接地址 端口 帐号 密码
    spring.data.mongodb.host=ip地址
    spring.data.mongodb.port=27017
    spring.data.mongodb.username=root1
    spring.data.mongodb.password=root1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 创建实体类

    public class Book{
        private Integer id;
        private String name;
        private String author;
        @Override
        public String toString() {
            return "Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    '}';
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    4. 创建 BookDao

    BookDao 的定义类似于 Spring Data JPA 中的 Repository 定义

    public interface BookDao extends MongoRepository<Book,Integer> {
        List<Book> findByAuthorContains(String author);
        Book findByNameEquals(String name);
    }
    
    • 1
    • 2
    • 3
    • 4

    5. 创建 Controller

    简单起见,直接将 BookDao 注入 Controller 进行测试

    @RestController
    public class BookController {
        @Autowired
        BookDao bookDao;
    
        @GetMapping("/test1")
        public void test1() {
            List<Book> books = new ArrayList<>();
            Book b1 = new Book();
            b1.setId(1);
            b1.setName("朝花夕拾");
            b1.setAuthor("鲁迅");
            books.add(b1);
            Book b2 = new Book();
            b2.setId(2);
            b2.setName("呐喊");
            b2.setAuthor("鲁迅");
            books.add(b2);
            bookDao.insert(books);
            List<Book> books1 = bookDao.findByAuthorContains("鲁迅");
            System.out.println(books1);
            Book book = bookDao.findByNameEquals("朝花夕拾");
            System.out.println(book);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    6. 测试 BookDao

    启动项目,localhost:8081/test1,打印日志如下

    [Book{id=1, name='朝花夕拾', author='鲁迅'}, Book{id=2, name='呐喊', author='鲁迅'}]
    Book{id=1, name='朝花夕拾', author='鲁迅'}
    
    • 1
    • 2

    7. 使用 MongoTemplate

    除了继承 MongoRepository 外,Spring Data MongoDB 还提供了 MongoTemplate 用来方便地操作 MongoDB。在 Spring Boot 中,若添加了 MongoDB 相关依赖,而开发者并没有提供 MongoTemplate ,则默认会有一个 MongoTemplate 注册到 Spring 容器中,相关配置源码在 MongoDataAutoConfiguration 类中。因此,用户可以直接使用 MongoTemplate ,在Controller 中直接注入 MongoTemplate 就可以使用,添加如下代码在 controller 中

     @Autowired
    MongoTemplate mongoTemplate;
    
    @GetMapping("/test2")
    public void test2() {
        List<Book> books = new ArrayList<>();
        Book b1 = new Book();
        b1.setId(3);
        b1.setName("围城");
        b1.setAuthor("钱钟书");
        books.add(b1);
        Book b2 = new Book();
        b2.setId(4);
        b2.setName("宋诗选注");
        b2.setAuthor("钱钟书");
        books.add(b2);
        mongoTemplate.insertAll(books);
        List<Book> list = mongoTemplate.findAll(Book.class);
        System.out.println(list);
        Book book = mongoTemplate.findById(3, Book.class);
        System.out.println(book);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    8. 测试使用 MongoTemplate

    启动项目,localhost:8081/test2,打印日志如下

    [Book{id=1, name='朝花夕拾', author='鲁迅'}, Book{id=2, name='呐喊', author='鲁迅'}, Book{id=3, name='围城', author='钱钟书'}, Book{id=4, name='宋诗选注', author='钱钟书'}]
    Book{id=3, name='围城', author='钱钟书'}
    
    • 1
    • 2
  • 相关阅读:
    消息队列 - RabbitMQ
    linux网络编程epoll内核实现代码分析
    二次型的概念
    操作系统复习:线程
    3D-2D PNP
    【读书笔记】《0day安全》第二章:栈溢出的原理和实践
    混淆技术研究笔记(八)扩展yGuard实现签名
    你就想这样一辈子躺平,还是改变这个世界?
    【idea】正则表达式去除项目中的各种注释
    c++初识之一
  • 原文地址:https://blog.csdn.net/GXL_1012/article/details/126162426