拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 在Spring Data Cassandra 中保存日期值

在Spring Data Cassandra 中保存日期值

白鹭 - 2021-11-06 2320 0 2

1. 概述

Apache Cassandra 是一个可扩展的NoSQL 数据库。它提供 此外,Cassandra 能够以卓越的性能处理大量数据。

在本教程中,我们将了解使用Spring Data 和Docker 连接到Cassandra。此外,我们将利用Spring Data 存储库抽象来处理Cassandra 的数据层。

我们将看到如何在Cassandra 中保存不同的Java 日期值。最后,我们将研究这些日期值如何映射到Cassandra 类型。

2. Cassandra 的Spring 数据

Spring Data for Apache Cassandra 为Spring 开发人员提供了 该项目将核心Spring 概念应用于使用Cassandra 数据存储的解决方案的开发。

Spring Data 允许我们基于常见的Spring 接口创建存储库。它还允许使用 该项目提供了支持丰富对象映射的简单注释。QueryBuilders

有两个重要的辅助类:

  • CqlTemplate处理常见的数据访问操作

  • CassandraTemplate提供对象映射

该项目与Spring 的核心JDBC 支持有明显的相似之处。

3. 搭建测试环境

为了开始,我们需要建立一个到Cassandra 实例的连接。

请注意,我们也可以连接到Astra DB 数据库,这是一个基于Apache Cassandra 的基于云的数据库。

本指南将向您展示如何

3.1.卡桑德拉容器

Testcontainers库来配置和启动Cassandra。首先,我们将定义一个Cassandra 容器并将其暴露在特定端口上:

@Container
 public static final CassandraContainer cassandra = (CassandraContainer) new CassandraContainer("cassandra:3.11.2")
 .withExposedPorts(9042);

接下来,我们需要覆盖Spring Data 所需的测试属性,以便能够与Cassandra 容器建立连接:

TestPropertyValues.of( "spring.data.cassandra.keyspace-name=" + KEYSPACE_NAME, "spring.data.cassandra.contact-points=" + cassandra.getContainerIpAddress(), "spring.data.cassandra.port=" + cassandra.getMappedPort(9042)
 ).applyTo(configurableApplicationContext.getEnvironment());

最后,在创建任何对象/表之前,我们需要创建一个键空间:

session.execute("CREATE KEYSPACE IF NOT EXISTS " + KEYSPACE_NAME + " WITH replication = {'class':'SimpleStrategy','replication_factor':'1'};");

密钥空间只是Cassandra 中的一个数据容器。实际上,它与RDBMS 中的数据库非常相似。

3.2. Cassandra 存储库

Spring Data 的 让我们从创建一个简单的DAO 开始。

org.springframework.data.cassandra.core.mapping包中提供的@Table

@Table
 public class Person {
 @PrimaryKey
 private UUID id; private String firstName; private String lastName;
 public Person(UUID id, String firstName, String lastName) { this.id = id; this.firstName = firstName; this.lastName = lastName;
 }
 //getters, setters, equals and hash code
 }

CassandraRepository接口为我们的DAO 定义一个Spring Data 存储库:

@Repository
 public interface PersonRepository extends CassandraRepository<Person, UUID> {}

最后,在开始编写集成测试之前,我们需要定义两个额外的属性:

spring.data.cassandra.schema-action=create_if_not_exists
 spring.data.cassandra.local-datacenter=datacenter1

第一个属性将确保Spring Data 自动为我们创建带注释的表。

我们应该注意,

4. 使用日期值

在用于Apache Cassandra 的Spring Data 的现代版本中,处理日期值非常简单。Spring Data 将自动确保Java 日期类型

4.1.本地日期类型

让我们向PersonLocalDatebirthDate

@Test
 public void givenValidPersonUsingLocalDate_whenSavingIt_thenDataIsPersisted() {
 UUID personId = UUIDs.timeBased();
 Person newPerson = new Person(personId, "Luka", "Modric");
 newPerson.setBirthDate(LocalDate.of(1985, 9, 9));
 personRepository.save(newPerson);
 List<Person> savedPersons = personRepository.findAllById(List.of(personId));
 assertThat(savedPersons.get(0)).isEqualTo(newPerson);
 }

Spring Data 自动将Java 的 从Cassandra 保存和获取记录后,DAO 中的LocalDatedateLocalDate

4.2.本地日期时间类型

让我们向Person LocalDateTime

@Test
 public void givenValidPersonUsingLocalDateTime_whenSavingIt_thenDataIsPersisted() {
 UUID personId = UUIDs.timeBased();
 Person newPerson = new Person(personId, "Luka", "Modric");
 newPerson.setLastVisitedDate(LocalDateTime.of(2021, 7, 13, 11, 30));
 personRepository.save(newPerson);
 List<Person> savedPersons = personRepository.findAllById(List.of(personId));
 assertThat(savedPersons.get(0)).isEqualTo(newPerson);
 }

Spring Data 自动将Java 的 从Cassandra 保存和获取记录后,DAO 中的LocalDateTimeLocalDateTime

4.3.旧日期类型

最后,让我们将遗留类型Person

@Test
 public void givenValidPersonUsingLegacyDate_whenSavingIt_thenDataIsPersisted() {
 UUID personId = UUIDs.timeBased();
 Person newPerson = new Person(personId, "Luka", "Modric");
 newPerson.setLastPurchasedDate(new Date(LocalDate.of(2021, 7, 13).toEpochDay()));
 personRepository.save(newPerson);
 List<Person> savedPersons = personRepository.findAllById(List.of(personId));
 assertThat(savedPersons.get(0)).isEqualTo(newPerson);
 }

LocalDateTime,

4.4.映射的Cassandra 类型

让我们使用CQLSH 检查保存在Cassandra 中的数据。它是一个

为了在测试执行期间检查Cassandra 容器中存储了哪些数据,我们可以简单地在我们的测试中放置一个断点。在暂停的测试执行期间,我们可以通过Docker 桌面应用程序连接到Docker 容器CLI:

在

连接到Docker 容器CLI 后,我们应该首先选择键空间,然后选择表:

# cqlsh
 Connected to Test Cluster at 127.0.0.1:9042.
 [cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
 Use HELP for help.
 cqlsh> USE test;
 cqlsh:test> select * from person;

因此,CQLSH 将向我们显示保存在表中的数据的格式化输出:

 id | birthdate | firstname | lastname | lastpurchaseddate | lastvisiteddate
 --------------------------------------+------------+-----------+----------+-------------------+-----------------
 9abef910-e3fd-11eb-9829-c5149ac796de | 1985-09-09 | Luka | Modric | null | null

但是,我们还想检查用于特定日期列的数据类型:

cqlsh:test> DESC TABLE person;

输出返回用于创建表的CQL 命令。因此,它包含所有数据类型定义:

CREATE TABLE test.person (
 id uuid PRIMARY KEY,
 birthdate date,
 firstname text,
 lastname text,
 lastpurchaseddate timestamp,
 lastvisiteddate timestamp
 )

5. 结论

在本文中,我们探讨了如何在Spring Data for Apache Cassandra 中使用不同的日期值。

在示例中,我们介绍了如何使用 我们看到了如何连接到使用 最后,我们使用Spring Data 存储库抽象来操作存储在Cassandra 中的数据。LocalDateLocalDateTime,DateTestcontainers


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *