1. 序章

Spring Data Key Valueフレームワークを使用すると、キー値ストアを使用するSpringアプリケーションを簡単に作成できます。

これにより、ストアとの対話に必要な冗長なタスクとボイラープレートコードが最小限に抑えられます。 このフレームワークは、RedisやRiakなどのKey-Valueストアでうまく機能します。

このチュートリアルでは、デフォルトのjava.util.Mapベースの実装でSpring DataKeyValueを使用する方法について説明します。

2. 要件

Spring Data Key Value 1.xバイナリには、JDKレベル6.0以降、およびSpringFramework3.0.x以降が必要です。

3. Mavenの依存関係

Spring Data Key Valueを使用するには、次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-keyvalue</artifactId>
    <version>2.0.6.RELEASE</version>
</dependency>

最新バージョンはここにあります。

4. エンティティの作成

Employeeエンティティを作成しましょう。

@KeySpace("employees")
public class Employee {

    @Id
    private Integer id;

    private String name;

    private String department;

    private String salary;

    // constructors/ standard getters and setters

}

キースペースは、エンティティを保持するデータ構造の部分を定義します。この概念は、MongoDBおよびElasticsearchのコレクション、Solrのコア、およびJPAのテーブルと非常によく似ています。

デフォルトでは、エンティティのキースペースはそのタイプから抽出されます。

5. リポジトリ

他のSpringDataフレームワークと同様に、@EnableMapRepositoriesアノテーションを使用してSpringDataリポジトリをアクティブ化する必要があります

デフォルトでは、リポジトリはConcurrentHashMap-ベースの実装を使用します。

@SpringBootApplication
@EnableMapRepositories
public class SpringDataKeyValueApplication {
}

デフォルトのConcurrentHashMap実装を変更し、他の java.util.Map実装を使用することができます。

@EnableMapRepositories(mapType = WeakHashMap.class)

Spring Data Key Valueを使用したリポジトリの作成は、他のSpringDataフレームワークと同じように機能します。

@Repository
public interface EmployeeRepository
  extends CrudRepository<Employee, Integer> {
}

Spring Dataリポジトリの詳細については、この記事をご覧ください。

6. リポジトリの使用

EmployeeRepositoryCrudRepositoryを拡張することにより、CRUD機能を実行する永続化メソッドの完全なセットを取得します。

ここで、使用可能な永続化メソッドのいくつかをどのように使用できるかを見ていきます。

6.1. オブジェクトの保存

リポジトリを使用して、新しいEmployeeオブジェクトをデータストアに保存しましょう。

Employee employee = new Employee(1, "Mike", "IT", "5000");
employeeRepository.save(employee);

6.2. 既存のオブジェクトの取得

前のセクションで従業員をフェッチすることにより、従業員が正しく保存されていることを確認できます。

Optional<Employee> savedEmployee = employeeRepository.findById(1);

6.3. 既存のオブジェクトの更新

CrudRepository は、オブジェクトを更新するための専用のメソッドを提供していません。

代わりに、 save()メソッドを使用できます。

employee.setName("Jack");
employeeRepository.save(employee);

6.4. 既存のオブジェクトの削除

リポジトリを使用して、挿入されたオブジェクトを削除できます。

employeeRepository.deleteById(1);

6.5. すべてのオブジェクトをフェッチ

保存されたすべてのオブジェクトをフェッチできます。

Iterable<Employee> employees = employeeRepository.findAll();

7. KeyValueTemplate

データ構造に対して操作を実行する別の方法は、KeyValueTemplateを使用することです。

非常に基本的な用語では、 KeyValueTemplate は、 java.util.Map実装をラップするMapAdapterを使用して、クエリと並べ替えを実行します。

@Bean
public KeyValueOperations keyValueTemplate() {
    return new KeyValueTemplate(keyValueAdapter());
}

@Bean
public KeyValueAdapter keyValueAdapter() {
    return new MapKeyValueAdapter(WeakHashMap.class);
}

@EnableMapRepositories を使用した場合は、KeyValueTemplateを指定する必要がないことに注意してください。フレームワーク自体によって作成されます。

8. KeyValueTemplateを使用する

KeyValueTemplate を使用すると、リポジトリで行ったのと同じ操作を実行できます。

8.1. オブジェクトの保存

テンプレートを使用して、新しいEmployeeオブジェクトをデータストアに保存する方法を見てみましょう。

Employee employee = new Employee(1, "Mile", "IT", "5000");
keyValueTemplate.insert(employee);

8.2. 既存のオブジェクトの取得

テンプレートを使用して構造からオブジェクトをフェッチすることにより、オブジェクトの挿入を確認できます。

Optional<Employee> savedEmployee = keyValueTemplate
  .findById(id, Employee.class);

8.3. 既存のオブジェクトの更新

CrudRepository とは異なり、テンプレートはオブジェクトを更新するための専用メソッドを提供します。

employee.setName("Jacek");
keyValueTemplate.update(employee);

8.4. 既存のオブジェクトの削除

テンプレートを使用してオブジェクトを削除できます。

keyValueTemplate.delete(id, Employee.class);

8.5. すべてのオブジェクトをフェッチ

テンプレートを使用して、保存されたすべてのオブジェクトをフェッチできます。

Iterable<Employee> employees = keyValueTemplate
  .findAll(Employee.class);

8.6. オブジェクトの並べ替え

基本的な機能に加えて、テンプレートはカスタムクエリを作成するためのKeyValueQueryもサポートしています。

たとえば、クエリを使用して、給与に基づいて従業員のソートされたリストを取得できます。

KeyValueQuery<Employee> query = new KeyValueQuery<Employee>();
query.setSort(new Sort(Sort.Direction.DESC, "salary"));
Iterable<Employee> employees 
  = keyValueTemplate.find(query, Employee.class);

9. 結論

この記事では、RepositoryまたはKeyValueTemplateを使用したデフォルトのMap実装でSpringDataKeyValueフレームワークを使用する方法を紹介しました。

Spring DataKeyValueの上に記述されたSpringDataRedisのようなSpringDataFrameworkは他にもあります。 Spring Data Redisの概要については、この記事を参照してください。

そして、いつものように、ここに示されているすべてのコードサンプルはGitHub利用できます。