zoukankan      html  css  js  c++  java
  • 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";
        }
    }

     




  • 相关阅读:
    真的是最后一次作业了!!!!
    最后一次总结
    作业十一总结?
    作业十一总结
    实验十总结
    作业9总结
    附加作业
    补交第十次作业
    补交第九次作业
    补交第八次作业
  • 原文地址:https://www.cnblogs.com/dalianpai/p/11925496.html
Copyright © 2011-2022 走看看