Spring Boot(12)——MongoDBを使う


もっと読む
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書きました)