Spring Boot(12)——使用MongoDB
使用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所写)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python 类的子类
看下面的代码,请仔细阅读,并看看是否能够发现点什么问题呢? #!/usr/bin/env python #coding:utf-8 class Person: def __init__(self, name, lang, email): self.name = name self.lang = lang self.email = email def author(self): return self.name class Programmer: def __init__(self, name, lang, email, system, website): self.name = name self.lang = lang self.email = email self.system = system self.website = website def pythoner(self): pythoner_list = [ self.name, self.lang, self.email, self.system, self.website ] return pythoner_list i...
- 下一篇
Java编程之设计模式之工厂方法模式全解
1 日志记录器的设计 Sunny软件公司欲开发一个系统运行日志记录器(Logger),该记录器可以通过多种途径保存系统的运行日志,如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,Sunny公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是Sunny公司开发人员面临的一个难题。 Sunny公司的开发人员通过对该需求进行分析,发现该日志记录器有两个设计要点: (1) 需要封装日志记录器的初始化过程,这些初始化工作较为复杂,例如需要初始化其他相关的类,还有可能需要读取配置文件(例如连接数据库或创建文件),导致代码较长,如果将它们都写在构造函数中,会导致构造函数庞大,不利于代码的修改和维护; (2) 用户可能需要更换日志记录方式,在客户端代码中需要提供一种灵活的方式来选择日志记录器,尽量在不修改源代码的基础上更换或者增加日志记录方式。 Sunny公司开发人员最初使用简单工厂模式对日志记录器进行了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Linux系统CentOS6、CentOS7手动修改IP地址
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作