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

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

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

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

自动装配
Bean 查找 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<Row, Person>)注册 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);
您可以使用以下操作进行插入和保存:

void insert (Object objectToSave):在 Apache Cassandra 表中插入对象。
WriteResult 插入 (Object objectToSave, InsertOptions options):在 Apache Cassandra 表中插入对象并应用InsertOptions。
您可以使用以下更新操作:

void update (Object objectToSave):更新 Apache Cassandra 表中的对象。
WriteResult 更新 (Object objectToSave, UpdateOptions options):更新 Apache Cassandra 表中的对象并应用UpdateOptions。
您还可以使用老式的方式编写自己的 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接口中的以下方法支持此功能:

batchOps:创建一个新CassandraBatchOperations的填充批次。
CassandraBatchOperations

insert: 接受单个对象、数组 (var-args) 或Iterable要插入的对象。
update: 接受单个对象、数组 (var-args) 或Iterable要更新的对象。
delete: 接受单个对象、数组 (var-args) 或Iterable要删除的对象。
withTimestamp:对批次应用 TTL。
execute: 执行批处理。
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方法可以更新行,如下:

boolean update (Query query, Update update, Class<?> entityClass):更新 Apache Cassandra 表中的对象选择。
Update 类的方法
本Update类可以用一点点“语法糖”被使用,因为它的方法是为了链接在一起。此外,您可以使用静态Update方法public static Update update(String key, Object value)和使用静态导入来启动新实例的创建。

该Update班有以下方法:

AddToBuilder 添加到 (String columnName) AddToBuilder入口点:更新prepend(Object value):使用+更新分配将集合值预先添加到现有集合。更新prependAll(Object… values):使用+更新分配将所有集合值添加到现有集合中。更新append(Object value):使用+更新分配将集合值附加到现有集合。更新append(Object… values):使用+更新分配将所有集合值附加到现有集合。更新entry(Object key, Object value):使用+更新分配添加地图条目。更新addAll(Map<? extends Object, ? extends Object> map):使用+更新分配将所有地图条目添加到地图。
Update remove (String columnName, Object value):使用-更新分配从集合中删除值。
Update clear (String columnName) : 清除集合。
Update increment (String columnName, Number delta):使用+更新分配进行更新。
Update decrement (String columnName, Number delta):使用-更新分配进行更新。
Update set (String columnName, Object value):使用=更新分配进行更新。
SetBuilder 设置 (String columnName) SetBuilder入口点:更新atIndex(int index).to(Object value):使用=更新分配将给定索引处的集合设置为一个值。更新atKey(String object).to(Object value):将给定键处的映射条目设置为=更新分配的值。
以下清单显示了一些更新示例:

// 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.删除行的方法
您可以使用以下重载方法从数据库中删除对象:

boolean 删除 (Query query, Class<?> entityClass):删除由 选择的对象Query。
T delete (T entity) : 删除给定的对象。
T delete (T entity, QueryOptions queryOptions):删除给定的对象应用QueryOptions。
boolean deleteById (Object id, Class<?> entityClass):使用给定的 Id 删除对象。
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 类的方法
CriteriaDefinition gt (Object value):使用>运算符创建条件。
CriteriaDefinition gte (Object value):使用>=运算符创建条件。
CriteriaDefinition in (Object… values):通过IN对 varargs 参数使用运算符来创建条件。
CriteriaDefinition in (Collection<?> collection):通过使用IN集合的运算符创建条件。
CriteriaDefinition is (Object value):通过使用字段匹配 ( column = value)创建条件。
CriteriaDefinition lt (Object value):使用<运算符创建条件。
CriteriaDefinition lte (Object value):使用⇐运算符创建条件。
CriteriaDefinition like (Object value):使用LIKE运算符创建条件。
CriteriaDefinition contains (Object value):使用CONTAINS运算符创建条件。
CriteriaDefinition containsKey (Object key):使用CONTAINS KEY运算符创建条件。
Criteria 一经创建即不可变。

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

Query by (CriteriaDefinition…​ criteria):用于创建Query对象。
Query 和 (CriteriaDefinition criteria):用于向查询添加附加条件。
Query columns (Columns columns):用于定义要包含在查询结果中的列。
Query limit (long limit):用于将返回结果的大小限制为提供的限制(用于分页)。
Query pageRequest (Pageable pageRequest):用于关联Sort,PagingState以及fetchSize与查询(用于寻呼)。
Query pagingState (ByteBuffer pagingState):用于将 aByteBuffer与查询关联(用于分页)。
Query queryOptions (QueryOptions queryOptions):用于QueryOptions与查询关联。
Query sort (Sort sort):用于为结果提供排序定义。
Query withAllowFiltering ():用于呈现ALLOW FILTERING查询。
Query一经创建即不可变。调用方法会创建新的不可变(中间)Query对象。

9.10.2.查询行的方法
本Query类有以下方法,返回行:

List select (Query query, Class entityClass):T从表中查询类型的对象列表。
T selectOne (Query query, Class entityClass):T从表中查询单个类型的对象。
Slice slice (Query query, Class entityClass):通过从表中查询 a Sliceof 类型的对象来开始或继续分页T。
Stream stream (Query query, Class entityClass):T从表中查询类型对象的流。
List select (String cql, Class entityClass):T通过提供 CQL 语句对表中类型对象列表的临时查询。
T selectOne (String cql, Class entityClass):T通过提供 CQL 语句对表中的单个类型对象进行临时查询。
Stream stream (String cql, Class entityClass):T通过提供 CQL 语句对表中类型的对象流进行临时查询。
查询方法必须指定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 语句组件的最终字段和变异构造。在可能插入或删除大量对象时(例如在循环内部),您应该小心。

相关文章
|
3月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
102 5
|
3月前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
80 1
|
4月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
186 2
|
5月前
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
Spring Retry 教程
|
4月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
详细介绍实现Java Spring Boot FCM推送教程
133 0
|
6月前
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
160 0
|
6月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
64 0
|
6月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
451 0
|
2月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
377 33
The Past, Present and Future of Apache Flink
|
4月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
997 13
Apache Flink 2.0-preview released

推荐镜像

更多