Prepared Statements
可以对执行多次的 CQL 语句进行准备并将其存储在 PreparedStatement
对象中,以提高查询性能。驱动程序和 Cassandra 都维护了将 PreparedStatement
查询映射到其元数据的映射。您可以通过以下抽象使用已准备好的语句:
-
CqlTemplate
,AsyncCqlTemplate
, orReactiveCqlTemplate
通过 API 的选择 -
CassandraTemplate
,AsyncCassandraTemplate
, orReactiveCassandraTemplate
通过启用已准备声明 -
Cassandra repositories 因为它们建立在模板 API 之上
Using CqlTemplate
CqlTemplate
类(及其异步和反应式变体)提供各种接受静态 CQL、Statement
对象和 PreparedStatementCreator
的方法。通常,接受静态 CQL 而没有附加参数的方法会按原样运行 CQL 语句,而不会进行进一步处理。接受静态 CQL 和参数数组相结合的方法(例如 execute(String cql, Object… args)
和 queryForRows(String cql, Object… args))
会使用已准备好的语句。在内部,这些方法会创建 PreparedStatementCreator
和 PreparedStatementBinder
对象来准备语句并稍后将值绑定到语句以运行它。Spring Data Cassandra 通常对已准备好的语句使用基于索引的参数绑定。
自 Cassandra 4 版以来,已准备好的语句已在驱动程序级别缓存,这就无需在应用程序中跟踪已准备好的语句。
以下示例演示如何使用带参数化的已准备语句发出查询:
-
Imperative
-
Reactive
link:example$CqlTemplateExamples.java[role=include]
link:example$ReactiveCqlTemplateExamples.java[role=include]
在需要对语句准备和参数绑定有更多控制的情况下(例如使用命名的绑定参数),您可以通过使用带 PreparedStatementCreator
和 PreparedStatementBinder
参数调用查询方法来完全控制已准备好的语句的创建和参数绑定:
-
Imperative
-
Reactive
link:example$CqlTemplateExamples.java[role=include]
link:example$ReactiveCqlTemplateExamples.java[role=include]
Spring Data Cassandra 随附支持该模式的类,位于 cql
包中:
-
SimplePreparedStatementCreator
- 用于创建准备好的语句的实用程序类。 -
ArgumentPreparedStatementBinder
- 用于将参数绑定到准备好的语句的实用程序类。
Using CassandraTemplate
CassandraTemplate
类建立在 CqlTemplate
之上,以提供更高级别的抽象。可以通过调用 setUsePreparedStatements(false)
或 setUsePreparedStatements(true)
直接在 CassandraTemplate
(及其异步和反应式变体)上控制已准备语句的使用。请注意,CassandraTemplate
默认启用已准备语句的使用。
以下示例演示生成并接受 CQL 的方法的使用情况:
-
Imperative
-
Reactive
link:example$CassandraTemplateExamples.java[role=include]
link:example$ReactiveCassandraTemplateExamples.java[role=include]
调用实体绑定方法(如 select(Query, Class<T>)
或 update(Query, Update, Class<T>)
)本身构建 CQL 语句来执行预期的操作。一些 CassandraTemplate
方法(如 select(Statement<?>, Class<T>))
也接受 CQL Statement
对象作为其 API 的一部分。
通过使用带有 SimpleStatement
对象的 Statement
调用接受方法时,可以参与已准备好的语句。模板 API 提取查询字符串和参数(位置参数和命名参数),并使用它们来准备、绑定和运行语句。非 SimpleStatement
对象不能用于已准备好的语句。
Caching Prepared Statements
自 Cassandra 驱动程序 4.0 以来,准备好的语句由 CqlSession
缓存,因此准备相同的字符串两次是可以的。早期版本要求在驱动程序外部缓存准备好的语句。有关更多参考,请参阅 Driver documentation on Prepared Statements。