直接贴代码,cql和代码有些地方与分享电子书里的javaDriver21.pdf有些出入,请以博文为准,cql和代码都是实测跑通的。
cql脚本(在cqlsh.bat窗口里跑):
CREATE KEYSPACE complex
WITH replication = {'class' : 'SimpleStrategy', 'replication_factor' :
3};
CREATE TYPE complex.phone (
alias text,
number text
);
CREATE TYPE complex.address (
street text,
city text,
zip_code int,
phones list<frozen<phone>>
);
CREATE TABLE complex.accounts (
email text PRIMARY KEY,
name text,
addr frozen<address>
);
自定义类型:phone和address。
表:accounts 。
maven依赖:
<dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-mapping</artifactId> <version>2.1.5</version> </dependency>
Phone类:
import com.datastax.driver.mapping.annotations.UDT;
@UDT(keyspace = "complex", name = "phone")
public class Phone {
private String alias;
private String number;
public Phone() {
}
public Phone(String alias, String number) {
this.alias = alias;
this.number = number;
}
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
Address类:
import java.util.List;
import com.datastax.driver.mapping.annotations.Field;
import com.datastax.driver.mapping.annotations.Frozen;
import com.datastax.driver.mapping.annotations.UDT;
@UDT(keyspace = "complex", name = "address")
public class Address {
private String street;
private String city;
@Field(name = "zip_code")
private int zipCode;
@Frozen("list<frozen<phone>>")
private List<Phone> phones;
public Address() {
}
public Address(String street, String city, int zipCode, List<Phone> phones) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
this.phones = phones;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getZipCode() {
return zipCode;
}
public void setZipCode(int zipCode) {
this.zipCode = zipCode;
}
public List<Phone> getPhones() {
return phones;
}
public void setPhones(List<Phone> phones) {
this.phones = phones;
}
}
Account类:
import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.Frozen;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import com.google.common.base.Objects;
@Table(keyspace = "complex", name = "accounts")
public class Account {
@PartitionKey
private String email;
private String name;
@Column(name = "addr")
@Frozen
private Address address;
public Account() {
}
public Account(String name, String email, Address address) {
this.name = name;
this.email = email;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public boolean equals(Object other) {
if (other instanceof Account) {
Account that = (Account) other;
return Objects.equal(this.name, that.name) && Objects.equal(this.email, that.email);
}
return false;
}
@Override
public int hashCode() {
return Objects.hashCode(name, email);
}
}
ORMClient类:
import java.util.ArrayList;
import java.util.List;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Host;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.Session;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import com.google.common.util.concurrent.ListenableFuture;
public class ORMClient {
private Cluster cluster;
private Session session;
Mapper<Account> mapper;
public Session getSession() {
return this.session;
}
/**
* 连接集群,创建执行cql的session对象。
*
* @param node
*/
public void connect(String node) {
cluster = Cluster.builder().addContactPoint(node).build();
Metadata metadata = cluster.getMetadata();
System.out.printf("Connected to cluster: %s\n", metadata.getClusterName());
for (Host host : metadata.getAllHosts()) {
System.out.printf("Datacenter: %s; Host: %s; Rack: %s\n", host.getDatacenter(),
host.getAddress(), host.getRack());
}
session = cluster.connect();
System.out.println();
mapper = new MappingManager(getSession()).mapper(Account.class);
}
public void insert() {
Phone phone = new Phone("home", "707-555-3537");
List<Phone> phones = new ArrayList<Phone>();
phones.add(phone);
Address address = new Address("25800 Arnold Drive", "Sonoma", 95476, phones);
Account account = new Account("John Doe", "jd@example.com", address);
mapper.save(account);
}
public void select() {
Account whose = mapper.get("jd@example.com");
if (whose == null) {
System.out.println("Account is null");
return;
}
System.out.println("Account name: " + whose.getName());
// 异步查询
ListenableFuture<Account> future = mapper.getAsync("jd@example.com");
try {
whose = future.get();
System.out.println("getAsync, Account name: " + whose.getName());
}
catch (Exception e) {
e.printStackTrace();
}
}
public void delete() {
Account account = new Account("John Doe", "jd@example.com", null);
mapper.delete(account);
}
public void update() {
// 没有看到mapper对象关于update的api
}
public void close() {
session.close();
cluster.close();
}
public void dropSchema() {
session.execute("DROP KEYSPACE complex;");
}
public static void main(String[] args) {
ORMClient client = new ORMClient();
try {
client.connect("127.0.0.1");
client.insert();
client.select();
client.delete();
client.select();
client.dropSchema();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
client.close();
}
}
}
运行打印:
Connected to cluster: Test Cluster
Datacenter: datacenter1; Host: /127.0.0.1; Rack: rack1
Account name: John Doe
getAsync, Account name: John Doe
Account is null
看到文档最后,还有一个通过注解@Accessor来做查询的,好像更便利,like this:
@Accessor
public interface UserAccessor {
@Query("SELECT * FROM complex.users WHERE id = ?")
User getOnePosition(UUID userId);
......
}
下篇文章说这个注解@Accessor的用法。
