$ brew install mongodb
MongoDB でデータアクセス
このガイドでは、Spring Data MongoDB を使用して、ドキュメントベースのデータベースである MongoDB (英語) にデータを保存および取得するアプリケーションを構築するプロセスを順を追って説明します。
構築するもの
Spring Data MongoDB を使用して、Customer
POJO(プレーンオールド Java オブジェクト)を MongoDB データベースに保存します。
必要なもの
約 15 分
Eclipse STS や IntelliJ IDEA のような任意の IDE または VSCode のようなテキストエディター
Java 17 以降
コードを直接 IDE にインポートすることもできます。
本ガイドの完成までの流れ
ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。
最初から始めるには、Spring Initializr から開始に進みます。
基本をスキップするには、次の手順を実行します。
このガイドを Eclipse で「Spring 入門コンテンツのインポート」するか、ソースリポジトリをダウンロードして解凍、または、Git (英語) を使用してクローンを作成します。
git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git
gs-accessing-data-mongodb/initial
に cdMongoDB のインストールと起動にジャンプしてください。
完了したときは、gs-accessing-data-mongodb/complete
のコードに対して結果を確認できます。
Spring Initializr から開始
IDE を使用する場合はプロジェクト作成ウィザードを使用します。IDE を使用せずにコマンドラインなどで開発する場合は、この事前に初期化されたプロジェクトからプロジェクトを ZIP ファイルとしてダウンロードできます。このプロジェクトは、このチュートリアルの例に合うように構成されています。
プロジェクトを手動で初期化するには:
IDE のメニューまたはブラウザーから Spring Initializr を開きます。アプリケーションに必要なすべての依存関係を取り込み、ほとんどのセットアップを行います。
Gradle または Maven のいずれかと、使用する言語を選択します。このガイドは、Java を選択したことを前提としています。
依存関係をクリックして、Spring Data MongoDB を選択します。
生成をクリックします。
結果の ZIP ファイルをダウンロードします。これは、選択して構成された Web アプリケーションのアーカイブです。
Eclipse や IntelliJ のような IDE は新規プロジェクト作成ウィザードから Spring Initializr の機能が使用できるため、手動での ZIP ファイルのダウンロードやインポートは不要です。 |
プロジェクトを Github からフォークして、IDE または他のエディターで開くこともできます。 |
MongoDB のインストールと起動
プロジェクトをセットアップしたら、MongoDB データベースをインストールして起動できます。
Mac を Homebrew とともに使用する場合、次のコマンドを実行できます。
MacPorts を使用すると、次のコマンドを実行できます。
$ port install mongodb
Redhat、Ubuntu、Debian、CentOS、Windows など、パッケージ管理を備えた他のシステムについては、https://docs.mongodb.org/manual/installation/ (英語) の手順を参照してください。
MongoDB をインストールしたら、次のコマンド(サーバープロセスも起動します)を実行して、コンソールウィンドウで起動できます。
$ mongod
次のような出力が表示されます。
all output going to: /usr/local/var/log/mongodb/mongo.log
単純なエンティティを定義する
MongoDB は NoSQL ドキュメントストアです。この例では、Customer
オブジェクトを保存します。次のリストは、Customer クラス(src/main/java/com/example/accessingdatamongodb/Customer.java
内)を示しています。
package com.example.accessingdatamongodb;
import org.springframework.data.annotation.Id;
public class Customer {
@Id
public String id;
public String firstName;
public String lastName;
public Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%s, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
}
ここに、id
、firstName
、lastName
という 3 つの属性を持つ Customer
クラスがあります。id
は、主に MongoDB による内部使用のためのものです。また、新しいインスタンスを作成するときにエンティティにデータを設定する単一のコンストラクターもあります。
このガイドでは、一般的な getter と setter は簡潔にするために省略されています。 |
id
は MongoDBID の標準名に適合しているため、Spring Data MongoDB のタグを付けるために特別なアノテーションは必要ありません。
他の 2 つのプロパティ firstName
と lastName
にはアノテーションが付けられていません。これらは、プロパティ自体と同じ名前を共有するフィールドにマップされると想定されています。
便利な toString()
メソッドは、顧客に関する詳細を出力します。
MongoDB はデータをコレクションに保存します。Spring Data MongoDB は、Customer クラスを customer と呼ばれるコレクションにマップします。コレクションの名前を変更する場合は、クラスで Spring Data MongoDB の @Document (Javadoc) アノテーションを使用できます。 |
単純なクエリを作成する
Spring Data MongoDB は、MongoDB へのデータの保存に重点を置いています。また、クエリを派生させる機能など、Spring Data Commons プロジェクトから機能を継承します。基本的に、MongoDB のクエリ言語を学ぶ必要はありません。いくつかのメソッドを書くことができ、クエリはあなたのために書かれます。
これがどのように機能するかを確認するには、次のリスト(src/main/java/com/example/accessingdatamongodb/CustomerRepository.java
内)が示すように、Customer
ドキュメントを照会するリポジトリインターフェースを作成します。
package com.example.accessingdatamongodb;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface CustomerRepository extends MongoRepository<Customer, String> {
public Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
CustomerRepository
は MongoRepository
インターフェースを継承し、動作する値の型と ID をそれぞれ Customer
と String
に差し込みます。このインターフェースには、標準の CRUD 操作(作成、読み取り、更新、削除)を含む多くの操作が付属しています。
他のクエリを定義するには、メソッドシグネチャーを宣言します。この場合、findByFirstName
を追加します。これは、本質的に型 Customer
のドキュメントを検索し、firstName
で一致するドキュメントを検索します。
findByLastName
もあります。これは、姓で人のリストを検索します。
典型的な Java アプリケーションでは、CustomerRepository
を実装するクラスを作成し、自分でクエリを作成します。Spring Data MongoDB を非常に便利にしているのは、この実装を作成する必要がないという事実です。Spring Data MongoDB は、アプリケーションを実行すると、その場で作成します。
これで、このアプリケーションを接続して、その外観を確認できます!
アプリケーションクラスを作成する
Spring Initializr は、アプリケーションの単純なクラスを作成します。次のリストは、Initializr がこの例(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java
内)で作成したクラスを示しています。
package com.example.accessingdatamongodb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMongodbApplication {
public static void main(String[] args) {
SpringApplication.run(AccessingDataMongodbApplication.class, args);
}
}
@SpringBootApplication
は、次のすべてを追加する便利なアノテーションです。
@Configuration
: アプリケーションコンテキストの Bean 定義のソースとしてクラスにタグを付けます。@EnableAutoConfiguration
: クラスパス設定、他の Bean、さまざまなプロパティ設定に基づいて Bean の追加を開始するよう Spring Boot に指示します。例:spring-webmvc
がクラスパスにある場合、このアノテーションはアプリケーションに Web アプリケーションとしてフラグを立て、DispatcherServlet
のセットアップなどの主要な動作をアクティブにします。@ComponentScan
: Spring に、com/example
パッケージ内の他のコンポーネント、構成、サービスを探して、コントローラーを検出させるように指示します。
main()
メソッドは、Spring Boot の SpringApplication.run()
メソッドを使用してアプリケーションを起動します。XML が 1 行もないことに気付きましたか? web.xml
ファイルもありません。この Web アプリケーションは 100% 純粋な Java であり、接続機能やインフラストラクチャの構成に対処する必要はありませんでした。
Spring Boot は、@SpringBootApplication
クラスの同じパッケージ(またはサブパッケージ)に含まれている限り、これらのリポジトリを自動的に処理します。登録プロセスをさらに制御するには、@EnableMongoRepositories
アノテーションを使用できます。
デフォルトでは、@EnableMongoRepositories は現在のパッケージをスキャンして、Spring Data のリポジトリインターフェースの 1 つを継承するインターフェースを探します。プロジェクトレイアウトに複数のプロジェクトがあり、リポジトリが見つからない場合は、basePackageClasses=MyRepository.class を使用して、型ごとに異なるルートパッケージをスキャンするように Spring Data MongoDB に安全に指示できます。 |
Spring Data MongoDB は、MongoTemplate
を使用して、find*
メソッドの背後にあるクエリを実行します。テンプレートを自分で使用してより複雑なクエリを実行することもできますが、このガイドではそれについては説明していません。(Spring Data MongoDB リファレンスガイドを参照)
ここで、Initializr が作成した単純なクラスを変更する必要があります。データを設定し、それを使用して出力を生成する必要があります。次のリストは、完成した AccessingDataMongodbApplication
クラス(src/main/java/com/example/accessingdatamongodb/AccessingDataMongodbApplication.java
内)を示しています。
package com.example.accessingdatamongodb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AccessingDataMongodbApplication implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
public static void main(String[] args) {
SpringApplication.run(AccessingDataMongodbApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
repository.deleteAll();
// save a couple of customers
repository.save(new Customer("Alice", "Smith"));
repository.save(new Customer("Bob", "Smith"));
// fetch all customers
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : repository.findAll()) {
System.out.println(customer);
}
System.out.println();
// fetch an individual customer
System.out.println("Customer found with findByFirstName('Alice'):");
System.out.println("--------------------------------");
System.out.println(repository.findByFirstName("Alice"));
System.out.println("Customers found with findByLastName('Smith'):");
System.out.println("--------------------------------");
for (Customer customer : repository.findByLastName("Smith")) {
System.out.println(customer);
}
}
}
AccessingDataMongodbApplication
には、CustomerRepository
のインスタンスをオートワイヤーする main()
メソッドが含まれています。Spring Data MongoDB は動的にプロキシを作成し、そこに挿入します。いくつかのテストを通じて CustomerRepository
を使用します。まず、いくつかの Customer
オブジェクトを保存し、save()
メソッドを示し、使用するデータを設定します。次に、findAll()
を呼び出して、データベースからすべての Customer
オブジェクトをフェッチします。次に、findByFirstName()
を呼び出して、彼女の名で 1 つの Customer
をフェッチします。最後に、findByLastName()
を呼び出して、姓が Smith
であるすべての顧客を検索します。
デフォルトでは、Spring Boot はローカルでホストされている MongoDB のインスタンスへの接続を試みます。他の場所でホストされている MongoDB のインスタンスをアプリケーションにポイントする方法の詳細については、リファレンスドキュメントを参照してください。 |
実行可能 JAR を構築する
コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、リソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、デプロイできます。
Gradle を使用する場合、./gradlew bootRun
を使用してアプリケーションを実行できます。または、次のように、./gradlew build
を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。
Maven を使用する場合、./mvnw spring-boot:run
を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package
で JAR ファイルをビルドしてから、JAR ファイルを実行できます。
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。 |
AccessingDataMongodbApplication
は CommandLineRunner
を実装するため、Spring Boot の開始時に run
メソッドが自動的に呼び出されます。次のようなものが表示されます(クエリなどの他の出力もあります)。
== Customers found with findAll(): Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith'] Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith'] == Customer found with findByFirstName('Alice'): Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith'] == Customers found with findByLastName('Smith'): Customer[id=51df1b0a3004cb49c50210f8, firstName='Alice', lastName='Smith'] Customer[id=51df1b0a3004cb49c50210f9, firstName='Bob', lastName='Smith']
要約
おめでとう! MongoDB サーバーをセットアップし、Spring Data MongoDB を使用してオブジェクトをデータベースに保存したり、データベースからフェッチしたりする簡単なアプリケーションを作成しました。すべて、具体的なリポジトリの実装を作成する必要はありません。
少ない労力でハイパーメディアベースの RESTful フロントエンドで MongoDB リポジトリを公開する場合は、Spring Data REST API の自動生成 (MongoDB) を参照してください。 |
関連事項
次のガイドも役立ちます。
新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください [GitHub] (英語) 。
すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives creative commons ライセンス (英語) でリリースされています。 |