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.本地日期类型
让我们向Person
LocalDate
birthDate
@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 中的LocalDate
date
LocalDate
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 中的LocalDateTime
LocalDateTime
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 中的数据。LocalDate
LocalDateTime,
Date
Testcontainers
0 评论