快速上手
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 Quick Start Guide。安装完成后,启动 Cassandra 通常只需执行以下命令:CASSANDRA_HOME/bin/cassandra -f。
要在 STS 中创建 Spring 项目,请依次选择 File → New → Spring Template Project → Simple Spring Utility Project,并在提示时单击 Yes。然后输入项目名和包名,例如 org.spring.data.cassandra.example。
然后,您可以将以下依赖声明添加到 pom.xml 文件的 dependencies 部分。
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<version>5.1.1</version>
</dependency>
</dependencies>
此外,您还应将 pom.xml 文件中的 Spring 版本更改为如下所示:
<spring.version>7.0.9</spring.version>
如果使用的是里程碑版本而非 GA 版本,您还需要将 Maven 的 Spring Milestone 仓库位置添加到 pom.xml 文件中,使其与 <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,也可以使用驱动的
QueryBuilderAPI 来构造查询。