9.5.CqlTemplate
的CqlTemplate类是在芯CQL包的核心类。它处理资源的创建和释放。它执行核心 CQL 工作流的基本任务,例如语句创建和执行,并留下应用程序代码来提供 CQL 和提取结果。该CqlTemplate级执行CQL的查询和更新语句,在执行迭代ResultSet情况下,返回的参数值的提取。它还捕获 CQL 异常并将它们转换为org.springframework.dao包中定义的通用的、信息更丰富的异常层次结构。
当您将CqlTemplate用于您的代码时,您只需要实现回调接口,该接口具有明确定义的契约。给定 a Connection,PreparedStatementCreator回调接口使用提供的 CQL 和任何必要的参数参数创建一个准备好的语句。该RowCallbackHandler接口从 a 的每一行中提取值ResultSet。
CqlTemplate可以通过SessionFactory引用直接实例化在 DAO 实现中使用,也可以在 Spring 容器中配置并作为 bean 引用提供给 DAO。CqlTemplate是CassandraTemplate.
此类发布的所有 CQL 都记录在与DEBUG模板实例的完全限定类名对应的类别下的级别(通常为CqlTemplate,但如果您使用CqlTemplate该类的自定义子类,则可能会有所不同)。
您可以控制在CQL API实例配置这些参数提取大小,一致性水平,重试策略的默认值:CqlTemplate,AsyncCqlTemplate,和ReactiveCqlTemplate。如果未设置特定查询选项,则应用默认值。
CqlTemplate有不同的执行模型风格。基本CqlTemplate使用阻塞执行模型。您可以AsyncCqlTemplate用于异步执行和与ListenableFuture实例的同步或 ReactiveCqlTemplate反应式执行。
9.5.1.CqlTemplate类使用示例
本节提供了一些正在运行的CqlTemplate类的示例。这些示例并不是CqlTemplate. 请参阅Javadoc。
查询 (SELECT) 与CqlTemplate
以下查询获取表中的行数:
代码语言:javascript复制int rowCount = cqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);
以下查询使用绑定变量:
代码语言:javascript复制int countOfActorsNamedJoe = cqlTemplate.queryForObject(
"SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");
以下示例查询 a String:
代码语言:javascript复制String lastName = cqlTemplate.queryForObject(
"SELECT last_name FROM t_actor WHERE id = ?",
String.class, 1212L);
以下示例查询并填充单个域对象:
代码语言:javascript复制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);
以下示例查询并填充多个域对象:
代码语言:javascript复制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;
}
});
如果最后两个代码片段确实存在于同一个应用程序中,那么删除两个RowMapper匿名内部类中存在的重复并将它们提取到一个类(通常是static嵌套类)中,然后可以被 DAO 引用是有意义的方法。
例如,将最后一个代码片段编写如下可能会更好:
代码语言:javascript复制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;
}
}
INSERT,UPDATE以及DELETE用CqlTemplate
您可以使用该execute(…)方法来执行INSERT,UPDATE和DELETE操作。参数值通常作为可变参数提供,或者作为对象数组提供。
以下示例显示如何使用 执行INSERT操作CqlTemplate:
代码语言:javascript复制cqlTemplate.execute(
"INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",
"Leonor", "Watling");
以下示例显示如何使用 执行UPDATE操作CqlTemplate:
代码语言:javascript复制cqlTemplate.execute(
"UPDATE t_actor SET last_name = ? WHERE id = ?",
"Banjo", 5276L);
以下示例显示如何使用 执行DELETE操作CqlTemplate:
代码语言:javascript复制cqlTemplate.execute(
"DELETE FROM t_actor WHERE id = ?",
5276L);
其他CqlTemplate操作
您可以使用该execute(..)方法执行任意 CQL。因此,该方法通常用于 DDL 语句。它重载了带有回调接口、绑定变量数组等的变体。
以下示例显示了如何使用所有传递给execute()方法的不同 API 对象来创建和删除表:
代码语言:javascript复制 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);
9.6.异常翻译
Spring Framework 为各种数据库和映射技术提供异常转换。这在传统上用于 JDBC 和 JPA。Spring Data for Apache Cassandra 通过提供 org.springframework.dao.support.PersistenceExceptionTranslator接口的实现将此功能扩展到 Apache Cassandra 。
映射到 Spring 的一致数据访问异常层次结构背后的动机 是让您编写可移植和描述性的异常处理代码,而无需针对特定的 Cassandra 异常进行编码和处理。Spring 的所有数据访问异常都继承自 DataAccessException该类,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。
9.7.控制 Cassandra 连接
应用程序使用CqlSession对象连接到 Apache Cassandra 。CassandraCqlSession跟踪与单个节点的多个连接,并被设计为线程安全的、长期存在的对象。通常,您可以CqlSession对整个应用程序使用单个。
SpringCqlSession通过SessionFactory. SessionFactory是 Apache Cassandra 的 Spring Data 的一部分,是一个通用的连接工厂。它允许容器或框架对应用程序代码隐藏连接处理和路由问题。
以下示例显示了如何配置默认值SessionFactory:
代码语言:javascript复制Session session = … // get a Cassandra Session
CqlTemplate template = new CqlTemplate();
template.setSessionFactory(new DefaultSessionFactory(session));
CqlTemplate和其他模板 API 实现CqlSession为每个操作获取一个。由于其长期存在的性质,会话在调用所需操作后不会关闭。正确处理资源的责任在于使用会话的容器或框架。
您可以SessionFactory在 org.springframework.data.cassandra.core.cql.session 包中找到各种实现。
9.8.简介CassandraTemplate
该CassandraTemplate班,地处 org.springframework.data.cassandra包,是Spring的卡桑德拉支持的核心类,并提供了丰富的功能集与数据库进行交互。该模板提供了创建、更新、删除和查询 Cassandra 的便捷操作,并提供了域对象和 Cassandra 表中行之间的映射。
配置后,CassandraTemplate就是线程安全的,可以跨多个实例重复使用。
Cassandra 中的行和应用程序域类之间的映射是通过委托给CassandraConverter接口的实现来完成的。Spring 提供了默认实现,MappingCassandraConverter但您也可以编写自己的自定义转换器。有关更多详细信息,请参阅有关Cassandra 转换的部分 。
本CassandraTemplate类实现了CassandraOperations接口。上的方法尽可能CassandraOperations以 Cassandra 中可用的方法命名,以使已经熟悉 Cassandra 的开发人员熟悉 API。
例如,你可以找到方法,例如select,insert,delete,和update。设计目标是尽可能轻松地在基本 Cassandra 驱动程序和CassandraOperations. 两个 API 之间的主要区别是CassandraOperations可以传递域对象而不是 CQL 和查询对象。
引用CassandraTemplate实例上的操作的首选方法是通过 CassandraOperations接口。
使用的默认转换器实现CassandraTemplate是 MappingCassandraConverter. 虽然MappingCassandraConverter可以使用额外的元数据来指定对象到行的映射,但它也可以通过使用一些字段和表名映射的约定来转换不包含额外元数据的对象。这些约定以及映射注释的使用在“映射”一章中进行了解释。
另一个核心功能CassandraTemplate是将 Cassandra Java 驱动程序中抛出的异常异常转换为 Spring 的可移植数据访问异常层次结构。有关更多信息,请参阅异常翻译部分 。
模板 API 具有不同的执行模型风格。基本CassandraTemplate使用阻塞(命令式-同步)执行模型。您可以AsyncCassandraTemplate用于异步执行和与ListenableFuture实例的同步或ReactiveCassandraTemplate反应式执行。