Spring Boot(12)——MongoDBを使う
もっと読む
MongoDBを使う
Spring BootアプリケーションでMongoDBを使用する必要があります.pom.xmlに
Reactiveによるプログラミング
Reactiveベースプログラミングが望ましいなら、
ReactiveCrudRepository ReactiveSortingRepository RxJava 2.rudRepository RxJava 2 SortingRepository
MongoDBを使う
Spring BootアプリケーションでMongoDBを使用する必要があります.pom.xmlに
spring-boot-starter-data-mongodb
の依存を追加できます.このようにSpring BootはMongoDBの関連beanを自動的に配置します.例えば、MongoClient、Mongo Templateなど、Spring Data MongoDBの自動配置クラスorg.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
のAPIドキュメントやソースを参照することができます.<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
デフォルト設定のMongoDB接続に対応するホストはlocal host、ポート番号は標準ポート番号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オブジェクトを、Mongo Templateオブジェクトを介して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.bootgroupId>
<artifactId>spring-boot-starter-data-mongodb-reactiveartifactId>
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が次の4つのインターフェースの一つから継承する必要があります.その中の前の二つはReactorに基づいて実現されます.後の二つはRxJava 2に基づいて実現されます.SortingRepositoryで終わるRepositoryは、対応するCrudRepositoryから引き継がれます.ReactiveCrudRepository ReactiveSortingRepository RxJava 2.rudRepository RxJava 2 SortingRepository
spring-boot-starter-data-mongodb-reactive
の依存性を追加すると自動的にReactor依存性が追加されますので、ReactiveCrude Repositoryと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);
}
}
RxJava 2.rudRepositoryとRxJava 2 SortingRepositoryを使用する必要があるなら、RxJava 2の依存性を導入する必要があります.<dependency>
<groupId>io.reactivex.rxjava2groupId>
<artifactId>rxjavaartifactId>
dependency>
その後、それらはReactiveCrudipositoryのように使用することができます.以下のコードはRxJava 2に基づくRepositoryを定義し、同時にfindByUsername
クエリを拡張し、RxJava 2によって実現されるFloweableに戻るタイプです.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書きました)