SpringBoot整合MongoDB

 MongoDB

MongoDB是 open-source NoSQL 文档数据库,它使用 JSON-like schema 而不是传统的 table-based 关系数据。 Spring Boot 提供了一些使用 MongoDB 的便利,包括spring-boot-starter-data-mongodbspring-boot-starter-data-mongodb-reactive“Starters”。

 连接到 MongoDB 数据库

要访问 Mongo 数据库,可以 inject auto-configured org.springframework.data.mongodb.MongoDbFactory。默认情况下,实例尝试在mongodb://localhost/test处连接到 MongoDB 服务器。以下 example 显示如何连接到 MongoDB 数据库:

import org.springframework.data.mongodb.MongoDbFactory;
import com.mongodb.DB;

@Component
public class MyBean {

    private final MongoDbFactory mongo;

    @Autowired
    public MyBean(MongoDbFactory mongo) {
        this.mongo = mongo;
    }

    // ...

    public void example() {
        DB db = mongo.getDb();
        // ...
    }

}

您可以设置spring.data.mongodb.uri property 来更改 URL 并配置其他设置,例如副本集,如以下 example 所示:

spring.data.mongodb.uri=mongodb://user:[emailprotected]:12345,mongo2.example.com:23456/test

或者,当您使用 Mongo 2.x 时__,您可以指定host/port。例如,您可以在application.properties中声明以下设置:

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017

如果你已经定义了自己的MongoClient,它将被用于 auto-configure 一个合适的MongoDbFactory。支持com.mongodb.MongoClientcom.mongodb.client.MongoClient

如果使用 Mongo 3.0 Java 驱动程序,则不支持spring.data.mongodb.hostspring.data.mongodb.port。在这种情况下,应使用spring.data.mongodb.uri来提供所有 configuration。

如果未指定spring.data.mongodb.port,则使用默认值27017。您可以从前面显示的 example 中删除此 line。

如果你不使用 Spring Data Mongo,你可以 inject com.mongodb.MongoClient beans 而不是MongoDbFactory。如果要完全控制建立 MongoDB 连接,还可以声明自己的MongoDbFactoryMongoClient bean。

如果您使用 reactive 驱动程序,则 SSL 需要 Netty。如果 Netty 可用,则 auto-configuration 会自动配置此工厂,并且尚未自定义要使用的工厂。

 MongoTemplate

Spring Data MongoDB提供了MongoTemplate class,其设计与 Spring 的JdbcTemplate非常相似。与JdbcTemplate,Spring Boot auto-configures _ bean 一样,您可以 inject 模板,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public MyBean(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    // ...

}

 Spring Data MongoDB Repositories

Spring Data 包括 MongoDB 的 repository 支持。与前面讨论的 JPA repositories 一样,基本原则是基于方法名称自动构造查询。

实际上,Spring Data JPA 和 Spring Data MongoDB 共享相同的 common 基础结构。您可以从之前获取 JPA example,假设City现在是 Mongo 数据 class 而不是 JPA @Entity,它的工作方式相同,如下面的示例所示:

package com.example.myapp.domain;

import org.springframework.data.domain.*;
import org.springframework.data.repository.*;

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndStateAllIgnoringCase(String name, String state);

}

创建用户

[root@topcheer ~]#  docker exec -it mongo mongo admin
MongoDB shell version v4.2.1
connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7ff60ffe-767d-4982-bd97-6a872157cc05") }
MongoDB server version: 4.2.1
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'}]});
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}
> db.auth('admin', '123456')
1
> use test;
switched to db test
>  db.createUser({ user: 'test', pwd:'123456', roles: [ {role:"dbOwner",db:"test"}]});
Successfully added user: {
        "user" : "test",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "test"
                }
        ]
}
> exit
bye

 配置

spring:
  application:
    name: spring-boot-mongodb
  data:
    mongodb:
      uri: mongodb://test:123456@192.168.180.113:27017/test

构建项目

我们使用IDEA创建一个新的SpringBoot项目,在pom.xml配置文件内添加我们本章所需要的依赖,如下所示:

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

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

 根据mongodb的依赖我们可以看到Spring家族式的设计,把所有操作数据的依赖都进行归类到spring-boot-starter-data-xxx下,我们比较常用到的如:spring-boot-starter-data-jpaspring-boot-starter-data-redis等。

MongoRepository

spring-boot-starter-data-mongodb确实采用了跟spring-boot-starter-data-jpa同样的方式来完成接口代理类的生成,并且提供了一些常用的单个对象操作的公共方法,MongoRepository接口作用与JPARepository一致,继承了该接口的业务数据接口就可以提供一个被Spring IOC托管的代理实现类,这样我们在注入业务数据接口时就会完成代理实现类的注入。
废话不多说了,下面我们直接来创建一个名为UserRepository 的数据接口,该接口继承MongoRepository<T,PK>,如下所示:

public interface UserRepository extends MongoRepository<UserInfo,Long> {
}

MongoRepository <T,PK>同样也是采用了两个泛型参数,
T:实体类类型。
PKT实体类内的主键类型,如:Long。

自定义实体类

public class UserInfo {

    @Id
    private Long id;

    private String username;

    private String password;

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserInfo(Long id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
}

测试

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    //http://localhost:8080/save
    @GetMapping("save")
    public String save(){
        UserInfo userInfo = new UserInfo(System.currentTimeMillis(),"用户"+System.currentTimeMillis(),"123");
        userRepository.save(userInfo);
        return "success";
    }

    //http://localhost:8080/getUserList
    @GetMapping("getUserList")
    public List<UserInfo> getUserList(){
        List<UserInfo> userInfoList = userRepository.findAll();
        return userInfoList;
    }

    //http://localhost:8080/delete?id=1525503798382
    @GetMapping("delete")
    public String delete(Long id){
        userRepository.deleteById(id);
        return "success";
    }

    //http://localhost:8080/update?id=1525503912550&username=111&password=222
    @GetMapping("update")
    public String update(Long id,String username,String password){
        UserInfo userInfo = new UserInfo(id,username,password);
        userRepository.save(userInfo);
        return "success";
    }
}

SpringBoot整合MongoDB

SpringBoot整合MongoDB