此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Cassandra 4.4.0! |
CQL 模板 API
这CqlTemplate
class 及其响应式变体ReactiveCqlTemplate
) 是核心 CQL 包中的中心类。
它处理资源的创建和释放。
它执行核心 CQL 工作流的基本任务,例如语句创建和执行,并让应用程序代码提供 CQL 和提取结果。
这CqlTemplate
类执行 CQL 查询和更新语句,执行迭代ResultSet
实例和返回参数值的提取。
它还捕获 CQL 异常,并将它们转换为org.springframework.dao
包。
当您使用CqlTemplate
对于您的代码,您只需实现回调接口,这些接口具有明确定义的协定。
给定一个CqlSession
这PreparedStatementCreator
callback interface 使用提供的 CQL 和任何必要的参数参数创建准备好的语句。
这RowCallbackHandler
interface 从ResultSet
.
这CqlTemplate
可以通过直接实例化在 DAO 实现中使用SessionFactory
引用或在 Spring 容器中进行配置,并作为 bean 引用提供给 DAO。CqlTemplate
是CassandraTemplate
.
此类发出的所有 CQL 都记录在DEBUG
level 在与模板实例的完全限定类名相对应的类别下(通常为CqlTemplate
,但如果您使用CqlTemplate
类)。
您可以通过在 CQL API 实例上配置以下参数来控制获取大小、一致性级别和重试策略默认值:CqlTemplate
,AsyncCqlTemplate
和ReactiveCqlTemplate
.
如果未设置特定查询选项,则默认值适用。
CqlTemplate 具有不同的执行模型风格。
基本的CqlTemplate 使用阻塞执行模型。
您可以使用AsyncCqlTemplate 用于异步执行和同步ListenableFuture instances 或ReactiveCqlTemplate 进行响应式执行。 |
示例CqlTemplate
类用法
本节提供了CqlTemplate
课堂在行动。
这些示例并不是CqlTemplate
.
请参阅 Javadoc 了解这一点。
查询 (SELECT)CqlTemplate
以下查询获取表中的行数:
-
Imperative
-
Reactive
int rowCount = cqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);
Mono<Integer> rowCount = reactiveCqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);
以下查询使用 bind 变量:
-
Imperative
-
Reactive
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
:
-
Imperative
-
Reactive
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);
以下示例查询并填充单个域对象:
-
Imperative
-
Reactive
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);
以下示例查询并填充多个域对象:
-
Imperative
-
Reactive
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
匿名内部类,并将它们提取到单个类(通常为static
nested 类),然后可以由 DAO 方法引用。
例如,最好按如下方式编写最后一个代码片段:
-
Imperative
-
Reactive
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
,UPDATE
和DELETE
跟CqlTemplate
您可以使用execute(…)
要执行的方法INSERT
,UPDATE
和DELETE
操作。
参数值通常作为变量参数提供,或者作为对象数组提供。
以下示例演示如何执行INSERT
作方式CqlTemplate
:
-
Imperative
-
Reactive
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
:
-
Imperative
-
Reactive
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
:
-
Imperative
-
Reactive
cqlTemplate.execute(
"DELETE FROM t_actor WHERE id = ?",
5276L);
Mono<Boolean> applied = reactiveCqlTemplate.execute(
"DELETE FROM actor WHERE id = ?",
actorId);
其他CqlTemplate
操作
您可以使用execute(..)
方法来执行任何任意 CQL。
因此,该方法通常用于 DDL 语句。
它严重重载了采用回调接口、绑定变量数组等的变体。
以下示例演示如何使用不同的 API 对象创建和删除表,这些对象都传递给execute()
方法:
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 收购了 CassandraCqlSession
通过SessionFactory
.SessionFactory
是 Spring Data for Apache Cassandra 的一部分,是一个通用连接工厂。
它允许容器或框架在应用程序代码中隐藏连接处理和路由问题。
以下示例显示如何配置默认的SessionFactory
:
-
Imperative
-
Reactive
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
对于每个作。
由于会话的生命周期较长,因此在调用所需作后不会关闭会话。
正确处置资源的责任在于使用会话的容器或框架。
您可以找到各种SessionFactory
在org.springframework.data.cassandra.core.cql.session
包。
异常转换
Spring Framework 为各种数据库和 Map 技术提供了异常转换。
传统上,这是 JDBC 和 JPA 的专利。
Spring Data for Apache Cassandra 通过提供org.springframework.dao.support.PersistenceExceptionTranslator
接口。
映射到 Spring 的一致数据访问异常层次结构的动机是让您编写可移植的描述性异常处理代码,而无需对特定的 Cassandra 异常进行编码和处理。
Spring 的所有数据访问异常都是从DataAccessException
类,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。
ReactiveCqlTemplate
和ReactiveCassandraTemplate
尽早传播异常。
在处理反应序列期间发生的异常将作为错误信号发出。