Spring起動時のSpringデータMongoDBの例

この記事では、Gradleビルドツールを使用してSpringブート+ SpringデータMongoDBアプリケーションを作成する方法を説明します。

  1. 春のブート1.5.1.RELEASE

  2. MongoDB

  3. 受け台

  4. Java 8

1.プロジェクトの構成

標準的なプロジェクト構造。

プロジェクトディレクトリ

プロジェクトの依存関係

2.1 Gradleビルドファイル。

build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.5.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'spring-data-mongodb-example'
    version =  '1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-data-mongodb'
}

2.2 spring-boot-startter-data-mongodb を宣言し、数多くのライブラリを取得し、以下の依存関係を見直します:

コンソール

$ gradle dependencies --configuration runtime
:dependencies

------------------------------------------------------------

ルートプロジェクト
-------------------------------------------------- ----------

runtime  - ソースセット 'main'のランタイムクラスパス。
\ --- org.springframework.boot:spring-boot-startter-data-mongodb: - > 1.5.1.RELEASE
     + --- org.springframework.boot:spring-boot-starter:1.5.1.RELEASE
     | + --- org.springframework.boot:spring-boot:1.5.1.RELEASE
     | | + --- org.springframework:spring-core:4.3.6.RELEASE
     | | \ --- org.springframework:スプリングコンテキスト:4.3.6.RELEASE
     | | + --- org.springframework:spring-aop:4.3.6.RELEASE
     | | | + --- org.springframework:spring-beans:4.3.6.RELEASE
     | | | | \ --- org.springframework:spring-core:4.3.6.RELEASE
     | | | \ --- org.springframework:spring-core:4.3.6.RELEASE
     | | + --- org.springframework:spring-beans:4.3.6.RELEASE(** )
     | | + --- org.springframework:spring-core:4.3.6.RELEASE
     | | \ --- org.springframework:スプリング式:4.3.6.RELEASE
     | | \ --- org.springframework:spring-core:4.3.6.RELEASE
     | + --- org.springframework.boot:spring-boot-autoconfigure:1.5.1.RELEASE
     | | \ --- org.springframework.boot:spring-boot:1.5.1.RELEASE(** )
     | + --- org.springframework.boot:spring-boot-starter-logging:1.5.1.RELEASE
     | | + --- ch.qos.logback:logback-classic:1.1.9
     | | | + --- ch.qos.logback:logback-core:1.1.9
     | | | \ --- org.slf4j:slf4j-api:1.7.22
     | | + --- org.slf4j:jcl-over-slf4j:1.7.22
     | | | \ --- org.slf4j:slf4j-api:1.7.22
     | | + --- org.slf4j:jul-to-slf4j:1.7.22
     | | | \ --- org.slf4j:slf4j-api:1.7.22
     | | \ --- org.slf4j:log4j-over-slf4j:1.7.22
     | | \ --- org.slf4j:slf4j-api:1.7.22
     | + --- org.springframework:spring-core:4.3.6.RELEASE
     | \ --- org.yaml:snakeyaml:1.17
     + --- org.mongodb:mongodb-driver:3.4.1
     | + --- org.mongodb:mongodb-driver-core:3.4.1
     | | \ --- org.mongodb:bson:3.4.1
     | \ --- org.mongodb:bson:3.4.1
     \ --- org.springframework.data:spring-data-mongodb:1.10.0.RELEASE
          + --- org.springframework:spring-tx:4.3.6.RELEASE
          | + --- org.springframework:spring-beans:4.3.6.RELEASE(** )
          | \ --- org.springframework:spring-core:4.3.6.RELEASE
          + --- org.springframework:スプリングコンテキスト:4.3.6.RELEASE(** )
          + --- org.springframework:spring-beans:4.3.6.RELEASE(** )
          + --- org.springframework:spring-core:4.3.6.RELEASE
          + --- org.springframework:スプリング式:4.3.6.RELEASE(** )
          + --- org.springframework.data:spring-data-commons:1.13.0.RELEASE
          | + --- org.springframework:spring-core:4.3.6.RELEASE
          | + --- org.springframework:spring-beans:4.3.6.RELEASE(** )
          | + --- org.slf4j:slf4j-api:1.7.22
          | \ --- org.slf4j:jcl-over-slf4j:1.7.22(** )
          + --- org.slf4j:slf4j-api:1.7.22
          \ --- org.slf4j:jcl-over-slf4j:1.7.22(** )

3. MongoDBの設定

application.properties

#mongodb
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=app1

#logging
logging.level.org.springframework.data=debug
logging.level.=error

4.春データ - MongoRepository

4.1 Springデータアノテーションを持つシンプルなモデル。

Domain.java

package com.mkyong.domain;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "domain")
public class Domain {

    @Id
    private long id;

    @Indexed(unique = true)
    private String domain;

    private boolean displayAds;

   //getters and setters
}

4.2 `MongoRepository`を拡張すると、あなたは自動的にCRUD機能を持っています。

春のデータには多くの魔法のfindByクエリがあります。公式のhttp://docs.spring.io/spring-data/data-document/docs/current/reference/html/#mongodb.repositories.queries[Spring data MongoDB - クエリ方法]を参照してください。

DomainRepository.java

package com.mkyong.domain;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;
//No need implementation, just one interface, and you have CRUD, thanks Spring Data
public interface DomainRepository extends MongoRepository<Domain, Long> {

    Domain findFirstByDomain(String domain);

    Domain findByDomainAndDisplayAds(String domain, boolean displayAds);

   //Supports native JSON query string
    @Query("{domain:'?0'}")
    Domain findCustomByDomain(String domain);

    @Query("{domain: { $regex: ?0 } })")
    List<Domain> findCustomByRegExDomain(String domain);

}

4.3 DomainRepository`のカスタムメソッドを作成するには、別のファイルに実装を作成し、 DomainRepository`がそれを拡張するようにする必要があります。

次の例では、 `MongoRepository`にカスタムの '特定のフィールドを更新する’メソッドを追加します。

4.3.1カスタムインターフェイス

DomainRepositoryCustom.java

package com.mkyong.domain;

public interface DomainRepositoryCustom {

    int updateDomain(String domain, boolean displayAds);

}

4.3.2実装クラス名は非常に厳密で、名前は "" CoreRepositoryInterface "Impl"でなければなりません。http://docs.spring.io/spring-data/data-document/docs/current/reference/html/を読んでください。 #repositories.custom-implementedations[SpringデータMongoDBカスタム実装]

DomainRepositoryCustom.java

package com.mkyong.domain;

import com.mongodb.WriteResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
//Impl postfix of the name on it compared to the core repository interface
public class DomainRepositoryImpl implements DomainRepositoryCustom {

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public int updateDomain(String domain, boolean displayAds) {

        Query query = new Query(Criteria.where("domain").is(domain));
        Update update = new Update();
        update.set("displayAds", displayAds);

        WriteResult result = mongoTemplate.updateFirst(query, update, Domain.class);

        if(result!=null)
            return result.getN();
        else
            return 0;

    }
}

4.3.3 DomainRepository`は、カスタムインターフェース DomainRepositoryCustom`を拡張します。

DomainRepository.java

package com.mkyong.domain;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import java.util.List;

public interface DomainRepository extends MongoRepository<Domain, Long>, DomainRepositoryCustom {

   //other methods

}

5.実行

5.1 Springブートアプリケーション。

Application.java

package com.mkyong;

import com.mkyong.domain.Domain;
import com.mkyong.domain.DomainRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    public static void main(String[]args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    CommandLineRunner init(DomainRepository domainRepository) {

        return args -> {

            Domain obj = domainRepository.findOne(7L);
            System.out.println(obj);

            Domain obj2 = domainRepository.findFirstByDomain("mkyong.com");
            System.out.println(obj2);

            int n = domainRepository.updateDomain("mkyong.com", true);
            System.out.println("Number of records updated : " + n);

        };

    }

}

5.2 Gradleをビルドして実行します。

ターミナル

$ gradle build

$ java -jar build/libs/spring-data-mongodb-example-1.0.jar

  .   ________          __            ____ __ __
/\\/______'__ ____ __ __(__)__ ____  ____ __ \ \ \ \
( ( )\______ | '__ | '__| | '__ \/__` | \ \ \ \
 \\/ ______)| |__)| | | | | || (__| |  ) ) ) )
  '  |________| .____|__| |__|__| |__\____, |//// =========|__|==============|______/=/__/__/__/ :: Spring Boot ::        (v1.5.1.RELEASE)
//blah blah blah

6.よくある質問

6.1カスタム MongoTemple`を作る方法は? A:デフォルトの設定を上書きするために、新しい `MongoTemplate beanを宣言します。以下の例では、 __class`フィールドを削除するカスタム MongoTemplate`を作成します。

Application.java

package com.mkyong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@SpringBootApplication
public class Application {

    public static void main(String[]args) {
        SpringApplication.run(Application.class, args);
    }

   //remove __class
    @Bean
    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory,
                                       MongoMappingContext context) {

        MappingMongoConverter converter =
                new MappingMongoConverter(new DefaultDbRefResolver(mongoDbFactory), context);
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);

        return mongoTemplate;

    }

}

ソースコードをダウンロードする

ダウンロード: spring-boot-data-mongodb-example.zip (7 KB)

参考文献

データMongoDB - リファレンスドキュメント]。 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-nosql.html [Working

春のブート]。リンク://gradle/gradle-display-project-dependency/[Gradle - 表示

プロジェクトの依存関係]