使用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所写)
相关推荐
Spring Boot 应用程序 mvn spring-boot:run打开WebApp: 去做将 MongoDB 更新到 1.7(取决于 Spring Boot Parent)——使用 Java8 LocalDate 而不是 java.util.Date 更新客户搜索以显示搜索结果
涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...
涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...
涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...
基于springboot下对mysql,mongodb,redis支持ipv6的改造(csdn)————程序
Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis 面试题 ZooKeeper 面试题 数据结构面试题 算法面试题 Elasticsearch 面试题 Kafka 面试题 微服务 面试题 Linux面试题
11 20道顶尖的Spring Boot面试题!.pdf 12 20道面试官常问的JVM面试题!.pdf 13 22道面试常问的SpringMVC面试题!.pdf 14 24道经典的英语面试题!.pdf 15 24道消息队列RabbitMQ面试题!.pdf 16 27道顶尖的Java多线程...
这个C#实现的小游戏是一个简单的猜数字游戏,让玩家...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
【酒店管理系统】 酒店管理系统是一种用于帮助酒店...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
【酒店管理系统】 酒店管理系统是一种用于帮助酒店...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
徐雷专家专注于分布式架构,Java Spring Boot、Spring Cloud、MongoDB、Redis;拥有10年 开发经历,喜欢专研技术问题;同时还是《MongoDB实战》第2版、《24种云计算架构设计模式》的译者。 主要章节: Java为王,...
Docker —— 从入门到实践 - v1.0.pdf Dubbo部署文档.doc Dubbo面试专题.docx java后端面试题答案.pdf Java并发Fork-Join框架原理解析.docx JAVA核心知识整理.pdf JAVA核心知识点整理.pdf Java面试笔记.docx JAVA...