閱讀454 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Spring Data 官方文檔》5.6 保存, 更新, 以及刪除數據行

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

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 11:31:53

  上一篇:go  使用Spring Data 倉庫工作 4.1-4.3
  下一篇:go  《雲數據管理:挑戰與機遇》-2.1分布式數據管理