Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

9.8.1.实例化 CassandraTemplate

CassandraTemplate应该始终配置为 Spring bean,尽管我们之前展示了一个示例,您可以在其中直接实例化它。但是,因为我们假设了创建 Spring 模块的上下文,所以我们假设存在 Spring 容器。

有两种方法可以获取 a CassandraTemplate,具体取决于您加载 Spring 的方式ApplicationContext:

自动装配

您可以将 a 自动装配CassandraOperations到您的项目中,如以下示例所示:

@Autowired
private CassandraOperations cassandraOperations;

同所有的Spring自动装配,这是假定只有一种类型的豆CassandraOperations中ApplicationContext。如果您有多个CassandraTemplatebean(如果您在同一个项目中使用多个键空间就是这种情况),那么您可以使用@Qualifier注释来指定要自动装配的 bean。

@Autowired
@Qualifier("keyspaceOneTemplateBeanId")
private CassandraOperations cassandraOperations;

Bean 查找ApplicationContext

您还可以CassandraTemplate从 中查找bean ApplicationContext,如以下示例所示:

CassandraOperations cassandraOperations = applicationContext.getBean("cassandraTemplate", CassandraOperations.class);

9.9.保存、更新和删除行

CassandraTemplate 为您提供了一种简单的方法来保存、更新和删除域对象并将这些对象映射到 Cassandra 中管理的表。

9.9.1.类型映射

Spring Data for Apache Cassandra 依赖于 DataStax Java 驱动程序CodecRegistry来确保类型支持。随着类型的添加或更改,Apache Cassandra 模块的 Spring Data 继续运行而无需更改。有关当前类型映射矩阵,请参阅CQL 数据类型 和“数据映射和类型转换”。

9.9.2.插入和更新行的方法

CassandraTemplate有几种方便的方法来保存和插入您的对象。要对转换过程进行更细粒度的控制,您可以Converter使用MappingCassandraConverter (例如,Converter)注册 Spring实例。

插入和更新操作的区别在于INSERT操作不插入null值。

使用该INSERT操作的简单案例是保存一个 POJO。在这种情况下,表名由简单的类名(而不是完全限定的类名)确定。可以使用映射元数据覆盖存储对象的表。

插入或更新时,id必须设置该属性。Apache Cassandra 无法生成 ID。

以下示例使用保存操作并检索其内容:

示例 64. 使用 CassandraTemplate

import static org.springframework.data.cassandra.core.query.Criteria.where;
import static org.springframework.data.cassandra.core.query.Query.query;
…

Person bob = new Person("Bob", 33);
cassandraTemplate.insert(bob);

Person queriedBob = cassandraTemplate.selectOneById(query(where("age").is(33)), Person.class);

您可以使用以下操作进行插入和保存:

您可以使用以下更新操作:

您还可以使用老式的方式编写自己的 CQL 语句,如下例所示:

String cql = "INSERT INTO person (age, name) VALUES (39, 'Bob')";

cassandraTemplate().getCqlOperations().execute(cql);

您还可以在使用InsertOptions和时配置其他选项,例如 TTL、一致性级别和轻量级事务UpdateOptions。

我的行插入到哪个表中?

您可以通过两种方式管理用于对表进行操作的表名。默认表名是更改为以小写字母开头的简单类名。因此,com.example.Person类的一个实例将存储在person表中。第二种方式是在@Table注解中指定表名。

批量插入、更新和删除单个对象

Cassandra 协议支持使用批处理在一个操作中插入一组行。

CassandraTemplate接口中的以下方法支持此功能:

CassandraBatchOperations

9.9.3.更新表中的行

对于更新,您可以选择更新多行。

以下示例显示了通过向具有+分配的余额添加一次性 50.00 美元奖金来更新单个帐户对象:

示例 65. 使用更新行 CasandraTemplate

import static org.springframework.data.cassandra.core.query.Criteria.where;
import org.springframework.data.cassandra.core.query.Query;
import org.springframework.data.cassandra.core.query.Update;

…

boolean applied = cassandraTemplate.update(Query.query(where("id").is("foo")),
  Update.create().increment("balance", 50.00), Account.class);

除了Query前面讨论的之外,我们还通过使用Update对象来提供更新定义。该Update班有匹配可用的Apache Cassandra的更新任务,从而方法。

大多数方法返回Update对象以提供用于代码样式目的的流畅 API。

对行执行更新的方法

update方法可以更新行,如下:

Update 类的方法

本Update类可以用一点点“语法糖”被使用,因为它的方法是为了链接在一起。此外,您可以使用静态Update方法public static Update update(String key, Object value)和使用静态导入来启动新实例的创建。

该Update班有以下方法:

以下清单显示了一些更新示例:

// UPDATE … SET key = 'Spring Data';
Update.update("key", "Spring Data")

// UPDATE … SET key[5] = 'Spring Data';
Update.empty().set("key").atIndex(5).to("Spring Data");

// UPDATE … SET key = key + ['Spring', 'DATA'];
Update.empty().addTo("key").appendAll("Spring", "Data");

请注意,Update一旦创建,它就是不可变的。调用方法会创建新的不可变(中间)Update对象。

9.9.4.删除行的方法

您可以使用以下重载方法从数据库中删除对象:

9.9.5.乐观锁定

该@Version注释在 Cassandra 的上下文中提供类似于 JPA 的语法,并确保更新仅应用于具有匹配版本的行。乐观锁利用 Cassandra 的轻量级事务来有条件地插入、更新和删除行。因此,INSERT语句是在IF NOT EXISTS条件下执行的。对于更新和删除,版本属性的实际值被添加到UPDATE条件中,这样如果在此期间另一个操作更改了行,则修改不会产生任何影响。在这种情况下,OptimisticLockingFailureException会抛出an 。以下示例显示了这些功能:

@Table
class Person {

  @Id String id;
  String firstname;
  String lastname;
  @Version Long version;
}

Person daenerys = template.insert(new Person("Daenerys"));                            

Person tmp = template.findOne(query(where("id").is(daenerys.getId())), Person.class); 

daenerys.setLastname("Targaryen");
template.save(daenerys);                                                              

template.save(tmp); // throws OptimisticLockingFailureException                       

最初插入文档。version设置为0。

加载刚刚插入的文档。version还在0。

用 更新文档version = 0。将lastname和设置version为1。

尝试更新先前加载的文档,但仍有version = 0. 操作失败并显示OptimisticLockingFailureException,因为当前version是1。

Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

乐观锁定仅支持单实体操作,不支持批处理操作。

9.10.查询行

你可以表达使用您的查询Query和Criteria类别,其中有反映本地卡桑德拉谓词运营商名称,如方法名lt,lte,is,等。

在Query和Criteria类遵循流畅API风格,让您可以轻松地串联多个方法标准和查询在一起,同时具有易于理解的代码。在 Java 中创建Query 和Criteria实例时使用静态导入以提高可读性。

9.10.1.查询表中的行

在前面的部分中,我们看到了如何使用selectOneByIdon 方法检索单个对象CassandraTemplate。这样做会返回单个域对象。我们还可以查询要作为域对象列表返回的行集合。假设我们有许多Person名称和年龄值作为行存储在表中的对象,并且每个人都有一个帐户余额,我们现在可以使用以下代码运行查询:

示例 66. 查询行使用 CassandraTemplate

import static org.springframework.data.cassandra.core.query.Criteria.where;
import static org.springframework.data.cassandra.core.query.Query.query;

…

List result = cassandraTemplate.select(query(where("age").is(50))
  .and(where("balance").gt(1000.00d)).withAllowFiltering(), Person.class);

的select,selectOne和stream方法采取一个Query对象作为参数。此对象定义用于执行查询的条件和选项。该标准是通过使用一个Criteria对象来指定的,该对象具有一个名为where实例化新Criteria对象的静态工厂方法。我们建议对org.springframework.data.cassandra.core.query.Criteria.whereand使用静态导入Query.query,以使查询更具可读性。

此查询应返回Person满足指定条件的对象列表。的Criteria类有下列方法,对应于运营商的Apache卡桑德拉提供:

Criteria 类的方法

Criteria 一经创建即不可变。

Query 类的方法

本Query类有一些额外的方法,你可以用它来提供的查询选项:

Query一经创建即不可变。调用方法会创建新的不可变(中间)Query对象。

9.10.2.查询行的方法

本Query类有以下方法,返回行:

查询方法必须指定T返回的目标类型。

9.10.3.流畅的模板API

CassandraOperations当涉及到与 Apache Cassandra 的更底层交互时,该接口是核心组件之一。它提供了广泛的方法。您可以为每个方法找到多个重载。它们中的大多数涵盖了 API 的可选(可为空)部分。

FluentCassandraOperations为CassandraOperations 提供更易读、更流畅的 API 的常用方法提供更窄的接口。入口点(query(…)、insert(…)、update(…)和delete(…))遵循基于要执行的操作的自然命名方案。从入口点开始,该 API 旨在仅提供依赖于上下文的方法,引导开发人员使用调用实际CassandraOperation. 以下示例显示了流畅的 API:

List all = ops.query(SWCharacter.class)
  .inTable("star_wars")                        
  .all();

如果使用类名SWCharacter定义表名@Table或使用类名作为表名没有问题,请跳过此步骤。

如果 Cassandra 中的一个表包含不同类型的实体,例如Jedi在一个 Table of 中的实体SWCharacters,则可以使用不同的类型来映射查询结果。您可以使用as(Class<?> targetType)将结果映射到不同的目标类型,同时query(Class<?> entityType)仍然适用于查询和表名。以下示例使用query和as方法:

List all = ops.query(SWCharacter.class)    
  .as(Jedi.class)                                
  .matching(query(where("jedi").is(true)))
  .all();

查询字段根据SWCharacter类型进行映射。

结果行被映射到Jedi.

您可以直接应用于预测由仅提供以产生的文件interface通过类型as(Class<?>)。

终止方法 ( first(), one(), all(), 和stream()) 处理检索单个实体和检索多个实体之间的切换List或Stream类似操作。

新流利的模板API方法(即query(..),insert(..),update(..)和delete(..))使用有效线程安全的支持对象组成的CQL语句。然而,它带来了额外的年轻代 JVM 堆开销的额外成本,因为设计基于各种 CQL 语句组件的最终字段和变异构造。在可能插入或删除大量对象时(例如在循环内部),您应该小心。

内容来源:Spring中国教育管理中心(Spring认证)

Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

2021年2月,VMware公司正式与北京中科卓望网络科技有限公司(以下简称:中科卓望)达成战略合作,授予其 Spring 中国教育管理中心,携手 VMware 全球最新 Spring技术和认证体系,帮助中国院校构建专业教学内容,全面赋能未来开发人

#spring认证##java##码农#

展开阅读全文

页面更新:2024-04-28

标签:新和   示例   中国教育   语句   实例   分配   对象   条件   类型   操作   方法   教程   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top