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

准备好的语句

多次执行的 CQL 语句可以准备并存储在PreparedStatementobject 来提高查询性能。 驱动程序和 Cassandra 都维护了PreparedStatement查询其元数据。 您可以通过以下抽象来使用准备好的语句:spring-doc.cadn.net.cn

CqlTemplate

CqlTemplateclass(及其异步和反应式变体)提供了各种接受静态 CQL 的方法,Statementobjects 和PreparedStatementCreator. 接受不带其他参数的静态 CQL 的方法通常按原样运行 CQL 语句,而无需进一步处理。 接受静态 CQL 与参数数组(如execute(String cql, Object…​ args)queryForRows(String cql, Object…​ args)) 使用准备好的语句。 在内部,这些方法会创建一个PreparedStatementCreatorPreparedStatementBinder对象来准备语句,然后将值绑定到语句以运行它。 Spring Data Cassandra 通常对准备好的语句使用基于索引的参数绑定。spring-doc.cadn.net.cn

从 Cassandra Driver 版本 4 开始,准备好的语句缓存在驱动程序级别,这样就无需在应用程序中跟踪准备好的语句。spring-doc.cadn.net.cn

以下示例显示了如何使用参数化的准备好的语句发出查询: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);

在需要对语句准备和参数绑定进行更多控制(例如,使用命名绑定参数)的情况下,可以通过使用PreparedStatementCreatorPreparedStatementBinder参数:spring-doc.cadn.net.cn

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包:spring-doc.cadn.net.cn

  • SimplePreparedStatementCreator- 实用程序类来创建准备好的语句。spring-doc.cadn.net.cn

  • ArgumentPreparedStatementBinder- 实用程序类,用于将参数绑定到准备好的语句。spring-doc.cadn.net.cn

CassandraTemplate

CassandraTemplate类构建在CqlTemplate提供更高级别的抽象。 准备好的语句的使用可以直接在CassandraTemplate(及其异步和响应式变体)通过调用setUsePreparedStatements(false)各自setUsePreparedStatements(true). 请注意,通过CassandraTemplate默认启用。spring-doc.cadn.net.cn

以下示例显示了生成和接受 CQL 的方法的用法:spring-doc.cadn.net.cn

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);

调用实体绑定方法(如select(Query, Class<T>)update(Query, Update, Class<T>)构建 CQL 语句本身来执行预期的作。 一些CassandraTemplate方法(例如select(Statement<?>, Class<T>)) 也接受 CQLStatement对象作为其 API 的一部分。spring-doc.cadn.net.cn

在调用接受Statement替换为SimpleStatement对象。 模板 API 提取查询字符串和参数(位置参数和命名参数),并使用它们来准备、绑定和运行语句。 非-SimpleStatement对象不能与准备好的语句一起使用。spring-doc.cadn.net.cn

缓存准备好的语句

从 Cassandra 驱动程序 4.0 开始,准备好的语句由CqlSessioncache 这样就可以准备同一个字符串两次了。 以前的版本需要在驱动程序之外缓存准备好的语句。 另请参阅 Driver 文档中的 Prepared Statements 以进一步参考。spring-doc.cadn.net.cn