Spring Boot(12)——使用MongoDB

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

使用MongoDB

需要在Spring Boot应用中使用MongoDB,可以在pom.xml中添加spring-boot-starter-data-mongodb依赖,这样Spring Boot会自动配置MongoDB的相关bean,比如MongoClient、MongoTemplate等,可以参考Spring Data MongoDB的自动配置类org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration的API文档或源码。

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

默认配置的MongoDB连接对应的主机是localhost,端口号是标准端口号27017,database是test。可以通过spring.data.mongodb打头的配置属性进行配置,对应的属性将绑定到org.springframework.boot.autoconfigure.mongo.MongoProperties对象,下面的代码重新配置了主机、端口号和database。更多配置信息可以参考MongoProperties的API文档或源代码。

spring.data.mongodb.host=10.192.48.170
spring.data.mongodb.port=27017
spring.data.mongodb.database=test_db

之后就可以直接通过MongoTemplate进行MongoDB的操作了。下面的代码中定义了一个User类,其userId属性对应MongoDB的user这个document的id属性,username属性对应于MongoDB的user这个document的user_name属性。然后在测试类中,new了一个User对象,通过MongoTemplate对象把它存入到了MongoDB中。

@Document
@Data
public class User {

    @Id
    private Long userId;
    private String name;
    @Field("user_name")
    private String username;
    
}

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MongoTest {

    @Autowired
    private MongoTemplate mongoTemplate;
    
    @Test
    public void testSave() {
        User user = new User();
        user.setUserId(2L);
        user.setName("张三");
        user.setUsername("zhangsan");
        this.mongoTemplate.save(user);
    }
    
}

也可以定义Spring Data Repository,通过Repository对MongoDB进行访问。定义的Repository,Spring Boot将自动对其进行扫描,由org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration定义,扫描路径是Spring Boot启动类所在的包。有需要也可以手动加上@EnableMongoRepositories以指定需要扫描的路径。下面的代码定义了一个UserRepository,其继承自标准的MongoRepository,同时又按照Spring Data的规范定义了一个findByName方法。

public interface UserRepository extends MongoRepository<User, Long> {

    List<User> findByName(String name);
    
}

之后可以直接在需要的地方注入UserRepository,通过UserRepository访问MongoDB,下面的代码中就分别利用注入的UserRepository进行了User对象的新增和查询操作。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MongoTest {

    @Autowired
    private UserRepository userRepository;
    
    @Test
    public void testSave() {
        User user = new User();
        user.setUserId(3L);
        user.setName("张三");
        user.setUsername("zhangsan");
        this.userRepository.save(user);
    }
    
    @Test
    public void testFindByName() {
        List<User> users = this.userRepository.findByName("张三");
        Assert.assertNotNull(users);
        Assert.assertEquals("张三", users.get(0).getName());
    }
    
}

本文旨在描述在Spring Boot应用中如何使用MongoDB,所以对Spring Data MongoDB的内容没有讲解太多。

基于Reactive编程

如果期望基于Reactive编程则可以引入spring-boot-starter-data-mongodb-reactive依赖。

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

引入该依赖后Spring Boot将自动配置一个ReactiveMongoTemplate,它默认使用Reactor实现进行Reactive编程。我们可以直接在应用中注入ReactiveMongoTemplate实例,通过它进行相关Reactive操作。下面的代码展示了通过ReactiveMongoTemplate进行User对象的保存操作。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MongoTest {

    @Autowired
    private ReactiveMongoTemplate reactiveMongoTemplate;
    
    @Test
    public void testReactive() {
        User user = new User();
        user.setUserId(4L);
        user.setName("李四");
        user.setUsername("lisi");
        Mono<User> mono = this.reactiveMongoTemplate.save(user);
        mono.block();
    }
    
    
}

Repository中的相关操作也是可以基于Reactive的,这需要我们定义的Repository继承自下面的四个接口之一,其中前面两个是基于Reactor实现,后面两个是基于RxJava2实现。以SortingRepository结尾的Repository都继承自对应的CrudRepository。

  • ReactiveCrudRepository
  • ReactiveSortingRepository
  • RxJava2CrudRepository
  • RxJava2SortingRepository

添加了spring-boot-starter-data-mongodb-reactive依赖后,会自动添加Reactor依赖,所以可以直接使用ReactiveCrudRepository和ReactiveSortingRepository。下面的代码中定义的ReactiveUserRepository就是基于ReactiveSortingRepository实现的,同时扩展了一个查询操作findByUsername,其返回结果是Reactor实现的Flux。

public interface ReactiveUserRepository extends ReactiveSortingRepository<User, Long> {

    Flux<User> findByUsername(String username);
    
}

上面定义的ReactiveUserRepository也会被自动扫描到,并被注册为Spring bean,在程序中可以直接注入ReactiveUserRepository对象进行使用,比如下面代码这样。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MongoTest {

    @Autowired
    private ReactiveUserRepository reactiveUserRepository;
    
    @Test
    public void testReactiveUserRepository() throws Exception {
        User user = new User();
        user.setUserId(System.currentTimeMillis());
        user.setName("李四");
        user.setUsername("lisi");
        Mono<User> mono = this.reactiveUserRepository.save(user);
        mono.subscribe(u -> System.out.println("saved success : " + u));
        
        //get users by username
        Flux<User> flux = this.reactiveUserRepository.findByUsername("lisi");
        flux.subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(1);
    }
    
}

如果需要使用RxJava2CrudRepository和RxJava2SortingRepository,则需要引入RxJava2的依赖。

<dependency>
    <groupId>io.reactivex.rxjava2</groupId>
    <artifactId>rxjava</artifactId>
</dependency>

之后可以像使用ReactiveCrudRepository一样使用它们。下面的代码定义了一个基于RxJava2的Repository,同时扩展了一个findByUsername查询,返回类型是RxJava2实现的Flowable。

public interface RxJava2UserRepository extends RxJava2SortingRepository<User, Long> {

    Flowable<User> findByUsername(String username);
    
}

它也可以直接被扫描和定义为一个Spring bean,所以也可以直接在程序中进行注入。

@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class MongoTest {
    
    @Autowired
    private RxJava2UserRepository rxJava2UserRepository;
    
    @Test
    public void testRxJava2UserRepository() throws Exception {
        User user = new User();
        user.setUserId(System.currentTimeMillis());
        user.setName("李四");
        user.setUsername("lisi");
        Single<User> single = this.rxJava2UserRepository.save(user);
        System.out.println("saved success : " + single.blockingGet());
        
        //get users by username
        Flowable<User> flowable = this.rxJava2UserRepository.findByUsername("lisi");
        flowable.subscribe(System.out::println);
        TimeUnit.SECONDS.sleep(1);
    }
    
}

(注:本文是基于Spring Boot 2.0.3所写)

目录
相关文章
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些高级用法
本文探讨了在Spring Boot项目中使用MongoDB的多种方式及其高级用法。MongoDB作为一种NoSQL数据库,在某些场景下相较于SQL数据库有着独特的优势。文中详细介绍了在Spring Boot中使用MongoDB的三种主要方式:直接使用官方SDK、使用Spring JPA以及使用MongoTemplate,并对比分析了它们之间的差异。此外,文章深入讲解了Spring Data MongoDB提供的各种注解(如@Id, @Document, @Field等)以简化操作流程,并探讨了MongoTemplate监听器的应用,如设置主键值、记录日志等。
916 2
|
10月前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
2562 17
Spring Boot 两种部署到服务器的方式
|
8月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
351 0
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
515 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
SQL NoSQL Java
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
本文介绍了如何在Spring Boot中操作NoSQL数据库MongoDB,包括在MongoDB官网创建服务器、配置Spring Boot项目、创建实体类、仓库类、服务类和控制器类,以及如何进行测试。
245 1
springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
715 2
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
462 2
|
NoSQL Java MongoDB
SpringBoot中MongoDB的那些骚操作用法
MongoDB作为一种NoSQL数据库,在不需要传统SQL数据库的表格结构的情况下,提供了灵活的数据存储方案。在Spring Boot中可以通过官方SDK、Spring JPA或MongoTemplate等方式集成MongoDB。文章重点介绍了Spring Data MongoDB提供的注解功能,例如`@Id`、`@Document`和`@Field`等,这些注解简化了Java对象到MongoDB文档的映射。此外,文中还讨论了MongoTemplate监听器的使用,包括设置主键值和日志记录等高级特性。
561 0
SpringBoot中MongoDB的那些骚操作用法
|
NoSQL Java API
Spring Data MongoDB 使用
Spring Data MongoDB 使用
701 1

推荐镜像

更多