此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Cassandra 4.4.0spring-doc.cadn.net.cn

CQL 模板 API

CqlTemplateclass 及其响应式变体ReactiveCqlTemplate) 是核心 CQL 包中的中心类。 它处理资源的创建和释放。 它执行核心 CQL 工作流的基本任务,例如语句创建和执行,并让应用程序代码提供 CQL 和提取结果。 这CqlTemplate类执行 CQL 查询和更新语句,执行迭代ResultSet实例和返回参数值的提取。 它还捕获 CQL 异常,并将它们转换为org.springframework.dao包。spring-doc.cadn.net.cn

当您使用CqlTemplate对于您的代码,您只需实现回调接口,这些接口具有明确定义的协定。 给定一个CqlSessionPreparedStatementCreatorcallback interface 使用提供的 CQL 和任何必要的参数参数创建准备好的语句。 这RowCallbackHandlerinterface 从ResultSet.spring-doc.cadn.net.cn

CqlTemplate可以通过直接实例化在 DAO 实现中使用SessionFactory引用或在 Spring 容器中进行配置,并作为 bean 引用提供给 DAO。CqlTemplateCassandraTemplate.spring-doc.cadn.net.cn

此类发出的所有 CQL 都记录在DEBUGlevel 在与模板实例的完全限定类名相对应的类别下(通常为CqlTemplate,但如果您使用CqlTemplate类)。spring-doc.cadn.net.cn

您可以通过在 CQL API 实例上配置以下参数来控制获取大小、一致性级别和重试策略默认值:CqlTemplate,AsyncCqlTemplateReactiveCqlTemplate. 如果未设置特定查询选项,则默认值适用。spring-doc.cadn.net.cn

CqlTemplate具有不同的执行模型风格。 基本的CqlTemplate使用阻塞执行模型。 您可以使用AsyncCqlTemplate用于异步执行和同步ListenableFutureinstances 或ReactiveCqlTemplate进行响应式执行。

示例CqlTemplate类用法

本节提供了CqlTemplate课堂在行动。 这些示例并不是CqlTemplate. 请参阅 Javadoc 了解这一点。spring-doc.cadn.net.cn

查询 (SELECT)CqlTemplate

以下查询获取表中的行数:spring-doc.cadn.net.cn

int rowCount = cqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);
Mono<Integer> rowCount = reactiveCqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);

以下查询使用 bind 变量:spring-doc.cadn.net.cn

int countOfActorsNamedJoe = cqlTemplate.queryForObject(
		"SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");
Mono<Integer> countOfActorsNamedJoe = reactiveCqlTemplate.queryForObject(
	"SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");

以下示例查询String:spring-doc.cadn.net.cn

String lastName = cqlTemplate.queryForObject(
		"SELECT last_name FROM t_actor WHERE id = ?",
		String.class, 1212L);
Mono<String> lastName = reactiveCqlTemplate.queryForObject(
	"SELECT last_name FROM t_actor WHERE id = ?",
	String.class, 1212L);

以下示例查询并填充单个域对象:spring-doc.cadn.net.cn

Actor actor = cqlTemplate.queryForObject("SELECT first_name, last_name FROM t_actor WHERE id = ?",
		new RowMapper<Actor>() {
			public Actor mapRow(Row row, int rowNum) {
				Actor actor = new Actor();
				actor.setFirstName(row.getString("first_name"));
				actor.setLastName(row.getString("last_name"));
				return actor;
			}
		}, 1212L);
Mono<Actor> actor = reactiveCqlTemplate.queryForObject(
	"SELECT first_name, last_name FROM t_actor WHERE id = ?",
	new RowMapper<Actor>() {
		public Actor mapRow(Row row, int rowNum) {
			Actor actor = new Actor();
			actor.setFirstName(row.getString("first_name"));
			actor.setLastName(row.getString("last_name"));
			return actor;
		}},
	1212L);

以下示例查询并填充多个域对象:spring-doc.cadn.net.cn

List<Actor> actors = cqlTemplate.query(
		"SELECT first_name, last_name FROM t_actor",
		new RowMapper<Actor>() {
			public Actor mapRow(Row row, int rowNum) {
				Actor actor = new Actor();
				actor.setFirstName(row.getString("first_name"));
				actor.setLastName(row.getString("last_name"));
				return actor;
			}
		});
Flux<Actor> actors = reactiveCqlTemplate.query(
"SELECT first_name, last_name FROM t_actor",
	new RowMapper<Actor>() {
		public Actor mapRow(Row row, int rowNum) {
			Actor actor = new Actor();
			actor.setFirstName(row.getString("first_name"));
			actor.setLastName(row.getString("last_name"));
			return actor;
		}
});

如果最后两个代码片段实际存在于同一个应用程序中,则删除这两个代码片段中存在的重复代码是有意义的RowMapper匿名内部类,并将它们提取到单个类(通常为staticnested 类),然后可以由 DAO 方法引用。spring-doc.cadn.net.cn

例如,最好按如下方式编写最后一个代码片段:spring-doc.cadn.net.cn

List<Actor> findAllActors() {
	return cqlTemplate.query("SELECT first_name, last_name FROM t_actor", ActorMapper.INSTANCE);
}

enum ActorMapper implements RowMapper<Actor> {

	INSTANCE;

	public Actor mapRow(Row row, int rowNum) {
		Actor actor = new Actor();
		actor.setFirstName(row.getString("first_name"));
		actor.setLastName(row.getString("last_name"));
		return actor;
	}
}
Flux<Actor> findAllActors() {
	return reactiveCqlTemplate.query("SELECT first_name, last_name FROM t_actor", ActorMapper.INSTANCE);
}

enum ActorMapper implements RowMapper<Actor> {

	INSTANCE;

	public Actor mapRow(Row row, int rowNum) {
		Actor actor = new Actor();
		actor.setFirstName(row.getString("first_name"));
		actor.setLastName(row.getString("last_name"));
		return actor;
	}
}

INSERT,UPDATEDELETECqlTemplate

您可以使用execute(…)要执行的方法INSERT,UPDATEDELETE操作。 参数值通常作为变量参数提供,或者作为对象数组提供。spring-doc.cadn.net.cn

以下示例演示如何执行INSERT作方式CqlTemplate:spring-doc.cadn.net.cn

cqlTemplate.execute(
		"INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",
		"Leonor", "Watling");
Mono<Boolean> applied = reactiveCqlTemplate.execute(
	"INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",
	"Leonor", "Watling");

以下示例演示如何执行UPDATE作方式CqlTemplate:spring-doc.cadn.net.cn

cqlTemplate.execute(
		"UPDATE t_actor SET last_name = ? WHERE id = ?",
		"Banjo", 5276L);
Mono<Boolean> applied = reactiveCqlTemplate.execute(
	"UPDATE t_actor SET last_name = ? WHERE id = ?",
	"Banjo", 5276L);

以下示例演示如何执行DELETE作方式CqlTemplate:spring-doc.cadn.net.cn

cqlTemplate.execute(
		"DELETE FROM t_actor WHERE id = ?",
		5276L);
Mono<Boolean> applied = reactiveCqlTemplate.execute(
	"DELETE FROM actor WHERE id = ?",
	actorId);

其他CqlTemplate操作

您可以使用execute(..)方法来执行任何任意 CQL。 因此,该方法通常用于 DDL 语句。 它严重重载了采用回调接口、绑定变量数组等的变体。spring-doc.cadn.net.cn

以下示例演示如何使用不同的 API 对象创建和删除表,这些对象都传递给execute()方法:spring-doc.cadn.net.cn

		cqlTemplate.execute("CREATE TABLE test_table (id uuid primary key, event text)");

		DropTableSpecification dropper = DropTableSpecification.dropTable("test_table");
		String cql = DropTableCqlGenerator.toCql(dropper);

		cqlTemplate.execute(cql);

控制 Cassandra 连接

应用程序使用 Apache CassandraCqlSession对象。 卡桑德拉CqlSession跟踪与各个节点的多个连接,并被设计为线程安全的长寿命对象。 通常,您可以使用单个CqlSession用于整个应用程序。spring-doc.cadn.net.cn

Spring 收购了 CassandraCqlSession通过SessionFactory.SessionFactory是 Spring Data for Apache Cassandra 的一部分,是一个通用连接工厂。 它允许容器或框架在应用程序代码中隐藏连接处理和路由问题。spring-doc.cadn.net.cn

以下示例显示如何配置默认的SessionFactory:spring-doc.cadn.net.cn

CqlSession session = … // get a Cassandra Session

CqlTemplate template = new CqlTemplate();

template.setSessionFactory(new DefaultSessionFactory(session));
CqlSession session = … // get a Cassandra Session

ReactiveCqlTemplate template = new ReactiveCqlTemplate(new DefaultBridgedReactiveSession(session));

CqlTemplate和其他 Template API 实现获取CqlSession对于每个作。 由于会话的生命周期较长,因此在调用所需作后不会关闭会话。 正确处置资源的责任在于使用会话的容器或框架。spring-doc.cadn.net.cn

您可以找到各种SessionFactoryorg.springframework.data.cassandra.core.cql.session包。spring-doc.cadn.net.cn

异常转换

Spring Framework 为各种数据库和 Map 技术提供了异常转换。 传统上,这是 JDBC 和 JPA 的专利。 Spring Data for Apache Cassandra 通过提供org.springframework.dao.support.PersistenceExceptionTranslator接口。spring-doc.cadn.net.cn

映射到 Spring 的一致数据访问异常层次结构的动机是让您编写可移植的描述性异常处理代码,而无需对特定的 Cassandra 异常进行编码和处理。 Spring 的所有数据访问异常都是从DataAccessException类,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。spring-doc.cadn.net.cn

ReactiveCqlTemplateReactiveCassandraTemplate尽早传播异常。 在处理反应序列期间发生的异常将作为错误信号发出。spring-doc.cadn.net.cn