入门指南
Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本以及 Datastax Java Driver 4.0 或更高版本。快速设置并启动一个工作环境的一个简单方法是,在 Spring Tools 中创建一个基于 Spring 的项目,或使用 start.spring.io。
示例库
为了更好地了解这个库是如何工作的,你可以下载并尝试 一些示例。
Hello World
首先,您需要设置一个运行中的 Apache Cassandra 服务器。请参阅 Apache Cassandra 快速入门指南 以了解如何启动 Apache Cassandra。安装完成后,启动 Cassandra 通常只需执行以下命令:CASSANDRA_HOME/bin/cassandra -f
。
要在 STS 中创建一个 Spring 项目,请转到 文件 → 新建 → Spring 模板项目 → 简单 Spring 实用程序项目,并在提示时按 Yes。然后输入一个项目名称和一个包名称,例如 org.spring.data.cassandra.example
。
然后,您可以将以下依赖声明添加到您的 pom.xml 文件的 dependencies
部分。
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>4.4.3</version>
</dependency>
</dependencies>
此外,您应该将 pom.xml 文件中的 Spring 版本更改为如下所示:
<spring.version>6.2.3</spring.version>
如果使用里程碑版本而不是 GA 版本,您还需要在 pom.xml 文件中添加 Spring Milestone 仓库的位置,以便它与 <dependencies/>
元素处于同一层级,如下所示:
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Maven MILESTONE Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
该代码库也可以在 这里浏览。
你也可以在这里浏览所有 Spring 仓库。
现在,您可以创建一个简单的 Java 应用程序,用于将域对象存储到 Cassandra 中并从 Cassandra 中读取。
要做到这一点,首先创建一个简单的域对象类以进行持久化,如下例所示:
package org.springframework.data.cassandra.example;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;
@Table
public class Person {
@PrimaryKey private final String id;
private final String name;
private final int age;
public Person(String id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
private String getName() {
return name;
}
private int getAge() {
return age;
}
@Override
public String toString() {
return String.format("{ @type = %1$s, id = %2$s, name = %3$s, age = %4$d }", getClass().getName(), getId(),
getName(), getAge());
}
}
接下来,创建主要的应用程序以运行,如下例所示:
- Imperative
- Reactive
package org.springframework.data.cassandra.example;
import java.util.UUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;
import com.datastax.oss.driver.api.core.CqlSession;
public class CassandraApplication {
private static final Log LOG = LogFactory.getLog(CassandraApplication.class);
private static Person newPerson(String name, int age) {
return new Person(UUID.randomUUID().toString(), name, age);
}
public static void main(String[] args) {
CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();
CassandraOperations template = new CassandraTemplate(cqlSession);
Person jonDoe = template.insert(newPerson("Jon Doe", 40));
LOG.info(template.selectOne(Query.query(Criteria.where("id").is(jonDoe.getId())), Person.class).getId());
template.truncate(Person.class);
cqlSession.close();
}
}
package org.springframework.data.cassandra.example;
import reactor.core.publisher.Mono;
import java.util.UUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.data.cassandra.core.ReactiveCassandraOperations;
import org.springframework.data.cassandra.core.ReactiveCassandraTemplate;
import org.springframework.data.cassandra.core.cql.session.DefaultBridgedReactiveSession;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;
import com.datastax.oss.driver.api.core.CqlSession;
public class ReactiveCassandraApplication {
private static final Log LOG = LogFactory.getLog(ReactiveCassandraApplication.class);
private static Person newPerson(String name, int age) {
return new Person(UUID.randomUUID().toString(), name, age);
}
public static void main(String[] args) {
CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();
ReactiveCassandraOperations template = new ReactiveCassandraTemplate(new DefaultBridgedReactiveSession(cqlSession));
Mono<Person> jonDoe = template.insert(newPerson("Jon Doe", 40));
jonDoe.flatMap(it -> template.selectOne(Query.query(Criteria.where("id").is(it.getId())), Person.class))
.doOnNext(it -> LOG.info(it.toString()))
.then(template.truncate(Person.class))
.block();
cqlSession.close();
}
}
即使在这个简单的示例中,仍然有一些值得注意的地方:
-
你可以使用 Cassandra
CqlSession
创建一个 CassandraTemplate(或用于反应式编程的 ReactiveCassandraTemplate)。 -
你必须将你的 POJO 注解为 Cassandra
@Table
实体,并且还要注解@PrimaryKey
。你还可以选择覆盖这些映射名称,以匹配你的 Cassandra 数据库表和列的名称。 -
你可以使用原生 CQL 或 Driver 的
QueryBuilder
API 来构建查询。