|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Data Cassandra 5.0.4! |
快速开始
Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本,以及 Datastax Java Driver 4.0 或更高版本。 快速设置并引导一个可运行环境的简便方法是在 Spring Tools 中创建一个基于 Spring 的项目,或使用 start.spring.io。
示例仓库
为了了解该库的工作原理,您可以下载并试用几个示例。
你好,世界
首先,你需要设置一个正在运行的 Apache Cassandra 服务器。
请参阅
Apache Cassandra 快速入门指南
了解如何启动 Apache Cassandra。
安装完成后,通常只需执行以下命令即可启动 Cassandra:CASSANDRA_HOME/bin/cassandra -f。
要在 STS 中创建一个 Spring 项目,请依次选择 File(文件)→ New(新建)→ Spring Template Project(Spring 模板项目)→ Simple Spring Utility Project(简单的 Spring 工具项目),并在提示时点击 Yes(是)。
然后输入项目名称和包名,例如 org.spring.data.cassandra.example。
然后,您可以将以下依赖声明添加到您 pom.xml 文件的 dependencies 部分。
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>4.5.11-SNAPSHOT</version>
</dependency>
</dependencies>
此外,您还应将 pom.xml 文件中的 Spring 版本修改如下:
<spring.version>6.2.17</spring.version>
如果使用的是里程碑版本(milestone release)而非正式发布版本(GA release),您还需要在 Maven 的 pom.xml 文件中添加 Spring 里程碑仓库的位置,使其与您的 <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 并从中读取。
为此,首先创建一个简单的领域对象类用于持久化,如下例所示:
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
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();
}
}
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 的
QueryBuilderAPI 来构建查询。