《Spring Data 官方文档》5.6 保存, 更新, 以及删除数据行

原文链接 译者:flystarfly

5.6. 保存, 更新, 以及删除数据行

‘CassandraTemplate’提供了一种简单的方法来保存,更新和删除域对象,并将这些对象映射到存储在Cassandra中的文档。

5.6.1. 如何在映射层中处理复合主键字段

Cassandra要求您至少具有一个CQL表的分区键字段。或者,您可以有一个或多个Clustering键字段。 当您的CQL表具有复合主键字段时,您必须创建一个@PrimaryKeyClass以定义复合主键的结构。 在这个上下文中,复合主键意味着一个或多个分区列,或1个分区列加上一个或多个聚集列。

最简单的复合键

最简单的复合键的具有一个分区键和一个聚集键。下面是一个CQL表,以及表示表及其组合键的相应POJO的示例。

在Cassandra中定义CQL Table

create table login_event(
  person_id text,
  event_time timestamp,
  event_code int,
  ip_address text,
  primary key (person_id, event_time))
  with CLUSTERING ORDER BY (event_time DESC)
;

定义复合主键类。

就像示例这样,PrimaryKeyClass必须实现’Serializable’类以及重载’hashCode()’和’equals()’方法.
package org.spring.cassandra.example;

import java.io.Serializable;
import java.util.Date;

import org.springframework.cassandra.core.Ordering;
import org.springframework.cassandra.core.PrimaryKeyType;
import org.springframework.data.cassandra.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.mapping.PrimaryKeyColumn;

@PrimaryKeyClass
public class LoginEventKey implements Serializable {

  @PrimaryKeyColumn(name = "person_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
  private String personId;

  @PrimaryKeyColumn(name = "event_time", ordinal = 1, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
  private Date eventTime;

  public String getPersonId() {
    return personId;
  }

  public void setPersonId(String personId) {
    this.personId = personId;
  }

  public Date getEventTime() {
    return eventTime;
  }

  public void setEventTime(Date eventTime) {
    this.eventTime = eventTime;
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((eventTime == null) ? 0 : eventTime.hashCode());
    result = prime * result + ((personId == null) ? 0 : personId.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    LoginEventKey other = (LoginEventKey) obj;
    if (eventTime == null) {
      if (other.eventTime != null)
        return false;
    } else if (!eventTime.equals(other.eventTime))
      return false;
    if (personId == null) {
      if (other.personId != null)
        return false;
    } else if (!personId.equals(other.personId))
      return false;
    return true;
  }
}

定义CQL表的类,具有复合主键作为属性,并注解为“PrimaryKey”。

package org.spring.cassandra.example;

import org.springframework.data.cassandra.mapping.Column;
import org.springframework.data.cassandra.mapping.PrimaryKey;
import org.springframework.data.cassandra.mapping.Table;

@Table(value = "login_event")
public class LoginEvent {

  @PrimaryKey
  private LoginEventKey pk;

  @Column(value = "event_code")
  private int eventCode;

  @Column(value = "ip_address")
  private String ipAddress;

  public LoginEventKey getPk() {
    return pk;
  }

  public void setPk(LoginEventKey pk) {
    this.pk = pk;
  }

  public int getEventCode() {
    return eventCode;
  }

  public void setEventCode(int eventCode) {
    this.eventCode = eventCode;
  }

  public String getIpAddress() {
    return ipAddress;
  }

  public void setIpAddress(String ipAddress) {
    this.ipAddress = ipAddress;
  }

}
复杂复合主键

Spring Data Cassandra提供的注解可以处理Cassandra中可用的任何键组合。这个示例是一个具有5列的复合主键,其中2列是复合分区键,其余3列是有序聚集键。为了简洁,省略了getter / setter,hashCode和equals方法

package org.spring.cassandra.example;

import java.io.Serializable;
import java.util.Date;

import org.springframework.cassandra.core.Ordering;
import org.springframework.cassandra.core.PrimaryKeyType;
import org.springframework.data.cassandra.mapping.PrimaryKeyClass;
import org.springframework.data.cassandra.mapping.PrimaryKeyColumn;

@PrimaryKeyClass
public class DetailedLoginEventKey implements Serializable {

  @PrimaryKeyColumn(name = "person_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
  private String personId;

  @PrimaryKeyColumn(name = "wks_id", ordinal = 1, type = PrimaryKeyType.PARTITIONED)
  private String workstationId;

  @PrimaryKeyColumn(ordinal = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.ASCENDING)
  private Date application;

  @PrimaryKeyColumn(name = "event_code", ordinal = 3, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.ASCENDING)
  private Date eventCode;

  @PrimaryKeyColumn(name = "event_time", ordinal = 4, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
  private Date eventTime;

  ...

}

5.6.2. 类型映射

Spring Data Cassandra依赖于DataStax Java驱动程序类型映射组件。这种方法确保当类型被添加或改变时,Spring Data Cassandra模块将继续运行而不需要改变。有关DataStax CQL3到Java类型映射的更多信息,请点击他们这里的 文档.

5.6.3.保存和插入行的方法

插入单条记录

要一次插入一行,有很多选择。在这一点上,你应该已经有一个cassandraTemplate可用,所以我们将每个部分的相关代码省略了模板设置。

插入带有注解的POJO的记录。

cassandraOperations.insert(new Person("123123123", "Alison", 39));

使用DataStax Java驱动程序中的QueryBuilder.Insert对象来插入行。

Insert insert = QueryBuilder.insertInto("person");
insert.setConsistencyLevel(ConsistencyLevel.ONE);
insert.value("id", "123123123");
insert.value("name", "Alison");
insert.value("age", 39);

cassandraOperations.execute(insert);

这些方法总会过时。 您可以编写自己的CQL语句。

String cql = "insert into person (id, name, age) values ('123123123', 'Alison', 39)";

cassandraOperations.execute(cql);
高速摄取的多重插入

CQLOperations是CassandraOperations的扩展,它是一个较低级别的模板,由此你可以使用它来完成需要Cassandra完成的任何事情。 CqlOperations包括几个“ingest()”的重载方法。

使用这些方法传递带有绑定标记的CQL字符串,以及您首选的数据集风格(Object[][] and List<List<T>>).

摄取方法利用了静态了PreparedStatements,这样仅有一次使用的性能。 数据列表中的每个记录都绑定到同一PreparedStatement,然后异步执行以获得高性能。

String cqlIngest = "insert into person (id, name, age) values (?, ?, ?)";

List<Object> person1 = new ArrayList<Object>();
person1.add("10000");
person1.add("David");
person1.add(40);

List<Object> person2 = new ArrayList<Object>();
person2.add("10001");
person2.add("Roger");
person2.add(65);

List<List<?>> people = new ArrayList<List<?>>();
people.add(person1);
people.add(person2);

cassandraOperations.ingest(cqlIngest, people);

5.6.4. 更新CQL表中的行

就像插入,你可以从中选择几种更新的方式。

使用带注解的POJO更新记录。

cassandraOperations.update(new Person("123123123", "Alison", 35));

使用DataStax Java驱动程序中的QueryBuilder.Update对象来更新行。

Update update = QueryBuilder.update("person");
update.setConsistencyLevel(ConsistencyLevel.ONE);
update.with(QueryBuilder.set("age", 35));
update.where(QueryBuilder.eq("id", "123123123"));

cassandraOperations.execute(update);

这些方法总会过时。 您可以编写自己的CQL语句。

String cql = "update person set age = 35 where id = '123123123'";

cassandraOperations.execute(cql);

5.6.5. 删除行的方法

就像插入,你可以从中选择几种删除的方式。

使用带注解的POJO删除记录。

cassandraOperations.delete(new Person("123123123", null, 0));

使用DataStax Java驱动程序中的QueryBuilder.Delete对象来删除行。

Delete delete = QueryBuilder.delete().from("person");
delete.where(QueryBuilder.eq("id", "123123123"));

cassandraOperations.execute(delete);

这些方法总会过时。 您可以编写自己的CQL语句。

String cql = "delete from person where id = '123123123'";

cassandraOperations.execute(cql);

5.6.6. 删除表的方法

就像插入,你可以从中选择几种删除的方式。

使用truncate()方法来删除表。

cassandraOperations.truncate("person");

使用DataStax Java驱动程序中的QueryBuilder.Truncate对象来删除表。

Truncate truncate = QueryBuilder.truncate("person");

cassandraOperations.execute(truncate);

这些方法总会过时。 您可以编写自己的CQL语句。

String cql = "truncate person";

cassandraOperations.execute(cql);

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/113894.html

(0)
上一篇 2021年8月27日
下一篇 2021年8月27日

相关推荐

发表回复

登录后才能评论