《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);
最後更新:2017-05-19 11:31:53
上一篇:
使用Spring Data 倉庫工作 4.1-4.3
下一篇:
《雲數據管理:挑戰與機遇》-2.1分布式數據管理
阿裏巴巴iDST:計算機視覺和機器學習在消費級視頻中的應用
svn:could not open the requested svn f 解決
如何在線生成Word文檔?一種極簡,極強大的方法,支持圖片表格等各種格式
負麵信息怎麼刪?百度360相關搜索詞負麵詞語處理方法!
DbDataAdapter.Fill 方法
MaxCompute 2.0: Evolution of Alibaba's Big Data Service
馬雲阿根廷講跨境貿易:沒有什麼是事前準備好的
解決maven web項目倒入eclipse不出現Maven Dependencies 和 Java System Library的問題
驅動天文科普,雲計算成“仰望星空”的橋梁
利用ASP.NET技術動態生成HTML頁麵