对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1! |
对于最新的稳定版本,请使用 Spring Data Cassandra 4.3.1! |
可以准备多次执行的 CQL 语句并将其存储在对象中,以提高查询性能。
驱动程序和 Cassandra 都维护查询到其元数据的映射。
您可以通过以下抽象来使用预处理语句:PreparedStatement
PreparedStatement
-
CassandraTemplate
、AsyncCassandraTemplate
或ReactiveCassandraTemplate
通过启用预准备语句 -
Cassandra 存储库,因为它们构建在模板 API 之上
用CqlTemplate
该类(及其异步和反应式变体)提供了各种接受静态 CQL、对象和 .
接受不带其他参数的静态 CQL 的方法通常按原样运行 CQL 语句,而无需进一步处理。
接受静态 CQL 与参数数组(如 和 )结合使用预准备语句的方法。
在内部,这些方法创建一个 and 对象来准备语句,然后将值绑定到语句以运行它。
Spring Data Cassandra 通常对预准备语句使用基于索引的参数绑定。CqlTemplate
Statement
PreparedStatementCreator
execute(String cql, Object… args)
queryForRows(String cql, Object… args)
PreparedStatementCreator
PreparedStatementBinder
从 Cassandra 驱动程序版本 4 开始,预准备语句缓存在驱动程序级别,无需在应用程序中跟踪预准备语句。
下面的示例演示如何使用参数化的预处理语句发出查询:
-
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);
如果需要对语句准备和参数绑定进行更多控制(例如,使用命名绑定参数),则可以通过使用 和 参数调用查询方法来完全控制预处理语句的创建和参数绑定:PreparedStatementCreator
PreparedStatementBinder
-
Imperative
-
Reactive
List<String> lastNames = cqlTemplate.query(
session -> session.prepare("SELECT last_name FROM t_actor WHERE id = ?"),
ps -> ps.bind(1212L),
(row, rowNum) -> row.getString(0));
Flux<String> lastNames = reactiveCqlTemplate.query(
session -> session.prepare("SELECT last_name FROM t_actor WHERE id = ?"),
ps -> ps.bind(1212L),
(row, rowNum) -> row.getString(0));
Spring Data Cassandra 在包中附带了支持该模式的类:cql
-
SimplePreparedStatementCreator
- 用于创建预处理语句的实用程序类。 -
ArgumentPreparedStatementBinder
- 实用程序类,用于将参数绑定到准备好的语句。
用CassandraTemplate
该类构建在 之上,以提供更高级别的抽象。
预处理语句的使用可以通过调用相应的 来直接控制(及其异步和反应式变体)。
请注意,默认情况下,预处理语句的使用是启用的。CassandraTemplate
CqlTemplate
CassandraTemplate
setUsePreparedStatements(false)
setUsePreparedStatements(true)
CassandraTemplate
以下示例演示了生成和接受 CQL 的方法的使用:
-
Imperative
-
Reactive
template.setUsePreparedStatements(true);
Actor actorByQuery = template.selectOne(query(where("id").is(42)), Actor.class);
Actor actorByStatement = template.selectOne(
SimpleStatement.newInstance("SELECT id, name FROM actor WHERE id = ?", 42),
Actor.class);
template.setUsePreparedStatements(true);
Mono<Actor> actorByQuery = template.selectOne(query(where("id").is(42)), Actor.class);
Mono<Actor> actorByStatement = template.selectOne(
SimpleStatement.newInstance("SELECT id, name FROM actor WHERE id = ?", 42),
Actor.class);
调用实体绑定方法(如 或 生成 CQL 语句本身)来执行预期的操作。
某些方法(如 )也接受 CQL 对象作为其 API 的一部分。select(Query, Class<T>)
update(Query, Update, Class<T>)
CassandraTemplate
select(Statement<?>, Class<T>)
Statement
在调用接受带有对象的方法时,可以参与预准备语句。
模板 API 提取查询字符串和参数(位置参数和命名参数),并使用它们来准备、绑定和运行语句。
非对象不能与预准备语句一起使用。Statement
SimpleStatement
SimpleStatement
缓存预准备语句
从 Cassandra 驱动程序 4.0 开始,准备好的语句由缓存缓存,因此可以准备两次相同的字符串。
以前的版本要求在驱动程序外部缓存准备好的语句。
另请参阅有关预准备语句的驱动程序文档,以供进一步参考。CqlSession