博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot(12)——使用MongoDB
阅读量:6711 次
发布时间:2019-06-25

本文共 6179 字,大约阅读时间需要 20 分钟。

使用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文档或源码。

org.springframework.boot
spring-boot-starter-data-mongodb

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

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

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

@Document@Datapublic 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
{ List
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
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依赖。

org.springframework.boot
spring-boot-starter-data-mongodb-reactive

引入该依赖后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
mono = this.reactiveMongoTemplate.save(user); mono.block(); } }

Repository中的相关操作也是可以基于Reactive的,这需要我们定义的Repository继承自下面的四个接口之一,其中前面两个是基于实现,后面两个是基于实现。以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
{ Flux
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
mono = this.reactiveUserRepository.save(user); mono.subscribe(u -> System.out.println("saved success : " + u)); //get users by username Flux
flux = this.reactiveUserRepository.findByUsername("lisi"); flux.subscribe(System.out::println); TimeUnit.SECONDS.sleep(1); } }

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

io.reactivex.rxjava2
rxjava

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

public interface RxJava2UserRepository extends RxJava2SortingRepository
{ Flowable
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
single = this.rxJava2UserRepository.save(user); System.out.println("saved success : " + single.blockingGet()); //get users by username Flowable
flowable = this.rxJava2UserRepository.findByUsername("lisi"); flowable.subscribe(System.out::println); TimeUnit.SECONDS.sleep(1); } }

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

转载地址:http://tzolo.baihongyu.com/

你可能感兴趣的文章
ecshop标签
查看>>
阅读书籍---程序员必读系列
查看>>
C++中的单例模式
查看>>
数据库时间戳设计
查看>>
Retrofit2.0- 源码分析
查看>>
webpack笔记
查看>>
Android常用技能
查看>>
Spring Data JPA REST Query Criteria
查看>>
In FontFamilyFont, unable to find attribute android:font的报错处理
查看>>
网络编程-I/O基础
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
【跃迁之路】【721天】程序员高效学习方法论探索系列(实验阶段478-2019.2.11)...
查看>>
区块链之比特币的潜在激励
查看>>
Learning Python, 5th Edition 读书笔记 1
查看>>
【译】理解回调和Promise
查看>>
市场变冷,不要灰心。更应该延长你的黄金岁月
查看>>
又一轮子?Typescript+React+Redux,放弃saga,支持服务器渲染同构
查看>>
一起再看执行上下文/作用域链/原型链
查看>>
区块链是一种用一种不可变的形式存储数字信息
查看>>
【须弥SUMERU】宜信分布式安全服务编排实践
查看>>