原文链接 译者: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/tech/pnotes/113894.html