直接贴代码,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的用法。