‘CassandraTemplate’提供了一种简单的方法来保存,更新和删除域对象,并将这些对象映射到存储在Cassandra中的文档。
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; ... }Spring Data Cassandra依赖于DataStax Java驱动程序类型映射组件。这种方法确保当类型被添加或改变时,Spring Data Cassandra模块将继续运行而不需要改变。有关DataStax CQL3到Java类型映射的更多信息,请点击他们这里的 文档.
要一次插入一行,有很多选择。在这一点上,你应该已经有一个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);就像插入,你可以从中选择几种更新的方式。
使用带注解的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);就像插入,你可以从中选择几种删除的方式。
使用带注解的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);就像插入,你可以从中选择几种删除的方式。
使用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