SpringBoot 整合 MongoDB

SpringBoot 整合 MongoDB

好久没搞 SpringBoot 相关的东西勒,但最近看的代码涉及到了这部分,虽然之前没做过也能看懂,但还是从基础开始搞起比较好。

准备工作

SpringBoot 项目创建

这个本来都不用说的,SpringBoot 创建项目还能不会啊,但因为某些限制,现在用不了专业版 IDEA,只能用社区版,没法直接创建 SpringBoot 项目了,于是研究了一下怎么用社区版搭建,记录一下。

首先,创建一个新的 Maven 工程,这个在社区版中也是有的,在 pom.xml 中手动添加 SpringBoot 启动器的依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starters</artifactId>
            <version>2.2.13.RELEASE</version>
        </dependency>

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

然后,在 resources 目录下创建 application.properties 配置文件,进行项目的一些配置,如这里将端口改为 8088:

# 更改启动端口
server.port=8088

最后,在项目最大的包下(创建的时候默认是 java/org.example )创建主启动类,类名随意,作为 SpringBoot 的启动类,代码如下:

package org.qyc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class CloudClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(CloudClientApplication.class, args);
    }
}

这样 SpringBoot 项目就算搭建好了!再写一个 Controller 测试一下 org.qyc.controller.HelloController

package org.qyc.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController{

    @RequestMapping("hello")
    public String helloWorld(){
        return "hello world!!!";
    }

}

然后启动项目,访问 localhost:8088/hello 就可以看到信息,成功!

MongoDB

安装

本来以为安装个 MongoDB 能有什么问题,但实际操作之后也是被整晕了,所以还是记一下。

首先在官网下载 MongoDB 本体( https://www.mongodb.com/try/download/community ),这里应该没什么问题,下载 msi 版本一路安装就行(可以自定义)。但中途有个选项 Install MongoDB Compass 是安装 Mongo 的 GUI,我勾选它两次都没装上,还导致安装很慢。所以建议不勾选,后面单独装。

装完本体后(需要选择作为服务器安装),访问 http://localhost:27017/ 可以看到提示:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

说明安装成功。

在之前的版本中,MongoDB 是自带 MongoShell 的,即在 CMD 中输入 mongo 可以看到当前连接信息并进入 MongoShell 模式。但目前的版本(6.0+)已经不自带 MongoDB Shell 了,需要额外安装(在 MongoDB 的 bin 目录里已经没有 mongo.exe 文件了)。

在官网下载 MongoDB Shell( https://www.mongodb.com/try/download/shell ),也是选择 msi 版本(在 Platform 里选),一路确认即可。不知道为什么要分开,无语。

参考: https://www.w3cschool.cn/mongodb/mongodb_shell_install.html

最后安装 MongoDB Compass,是 MongoDB 数据库的可视化工具,官网( https://www.mongodb.com/try/download/compass ),这个没什么好说的。

安装完这三个就算齐活了,补几个 MongoDB Shell 的命令:

查看数据库:show dbs

查看集合:show collections

使用某个数据库:use 数据库名

插入数据:db.集合名.insert( { name : 'qyc' } )

查询数据:db.集合名.find()

配置

进入到 admin 数据库,创建管理员

admin> db.createUser({ user: "admin", pwd:"qyc", roles: [{role: "userAdminAnyDatabase", db:"admin"}]})
{ ok: 1 }

MongoDB 的用户的权限是基于 role 的,这个 admin 的 role 是 userAdminAnyDatabase,只能用于管理账户,所以还需要创建一个 root,管理数据库:

admin> db.createUser({ user: "root", pwd:"0723", roles:[{role:"root", db:"admin"}]})
{ ok: 1 }

然后切换到实际用的数据库,创建这个数据库的拥有者账户就行了:

admin> use mongotest
switched to db mongotest
mongotest> db.createUser({ user: "qyc", pwd:"0723", roles:[{role:"dbOwner", db:"mongotest"}]})
{ ok: 1 }

角色 dbOwner 为这个数据库的最高权限,只要读写的话 readWrite 即可。

配置好后,就可以使用 mongodb://user:password@localhost:27017/databasename 连接到数据库了。

SpringBoot + MongoDB

构建

完成准备工作,开始进行整合。首先是在创建的项目的添加 springboot-mongodb 的依赖:

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

接着在 application.properties 中配置 MongoDB 的连接:

# 连接 mongo
spring.data.mongodb.uri=mongodb://qyc:0723@localhost:27017/mongotest

配置完成,正式写代码,创建一个实体类 User,用了 lombok,不多说:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {

    @Id
    private String userId;
    private String name;
    private Integer age;
    private Date createDate;

}

接着创建数据库访问层( DAO ),对于 MyBatis,会放在 mapper 包下,而对于 MongoDB 而言,一般放在 repository 包下,这里创建 UserRepository:

public interface UserRepository extends MongoRepository<User, String> {
    // 无需实现
}

此处使用的方式是继承 MongoRepository,继承了这个类后,只需要配置对应的数据类型和数据的 ID 类型,一句代码都不用写,就实现了对数据库访问层!这里多提一下 MongoRepository 的来源:

Repository:Repository 类不提供任何方法,只是一个标识,表明继承它的类是仓库接口类;

CrudRepository: 继承 Repository,实现了 CRUD 相关的方法;

PagingAndSortingRepository: 继承 CrudRepository,实现了分页排序相关的方法;

MongoRepository: 继承 PagingAndSortingRepository,实现了访问 MongoDB 相关的方法;

最后创建 Controller,给出不同功能的接口:

@RestController
@RequestMapping("/user")
public class UserRepositoryController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/getAllUsers")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping("/addUser")
    public User addNewUser(@RequestBody User user) {
        System.out.println("addUser: " +  user.toString());
        return userRepository.save(user);
    }
}

其中的 findAll()save(user) 都是 MongoRepository 帮我们实现的方法,直接用就行了!

到这,一个简单的 MongoDB 服务就搭建完成了!

访问

启动 SpringBoot 服务后,使用 Postman 请求一下接口,首先是加一个 User:

img

返回了这个 User 对象,说明添加成功!可以在 MongoDB Compass 中可视化的看一下(要刷新数据库!):

img

亲眼看到,完美!

然后测试一下获取所有 User 的接口:

img

没问题,舒服了。继续完善下去,一个通过 MongoDB 管理 User 的应用就完成了!

posted @ 2023-04-14 16:29  Qirror  阅读(545)  评论(0)    收藏  举报
Live2D