直接貼代碼,cql和代碼有些地方與分享電子書裡的javadriver21.pdf有些出入,請以博文為準,cql和代碼都是實測跑通的。
cql腳本(在cqlsh.bat視窗裡跑):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<code>create</code> <code>keyspace complex</code>
<code>with</code> <code>replication = {</code><code>'class'</code> <code>:</code><code>'simplestrategy'</code><code>,</code><code>'replication_factor'</code> <code>:</code>
<code>3};</code>
<code>create</code> <code>type complex.phone (</code>
<code>alias text,</code>
<code>number text</code>
<code>);</code>
<code>create</code> <code>type complex.address (</code>
<code>street text,</code>
<code>city text,</code>
<code>zip_code</code><code>int</code><code>,</code>
<code>phones list<frozen<phone>></code>
<code>create</code> <code>table</code> <code>complex.accounts (</code>
<code>email text</code><code>primary</code> <code>key</code><code>,</code>
<code>name</code> <code>text,</code>
<code>addr frozen<address></code>
自定義類型:phone和address。
表:accounts 。
maven依賴:
<code><</code><code>dependency</code><code>></code>
<code></code><code><</code><code>groupid</code><code>>com.datastax.cassandra</</code><code>groupid</code><code>></code>
<code></code><code><</code><code>artifactid</code><code>>cassandra-driver-core</</code><code>artifactid</code><code>></code>
<code></code><code><</code><code>version</code><code>>2.1.5</</code><code>version</code><code>></code>
<code></</code><code>dependency</code><code>></code>
<code></code><code><</code><code>artifactid</code><code>>cassandra-driver-mapping</</code><code>artifactid</code><code>></code>
phone類:
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<code>import</code> <code>com.datastax.driver.mapping.annotations.udt;</code>
<code>@udt</code><code>(keyspace =</code><code>"complex"</code><code>, name =</code><code>"phone"</code><code>)</code>
<code>public</code> <code>class</code> <code>phone {</code>
<code></code><code>private</code> <code>string alias;</code>
<code></code><code>private</code> <code>string number;</code>
<code></code><code>public</code> <code>phone() {</code>
<code></code><code>}</code>
<code></code><code>public</code> <code>phone(string alias, string number) {</code>
<code></code><code>this</code><code>.alias = alias;</code>
<code></code><code>this</code><code>.number = number;</code>
<code></code><code>public</code> <code>string getalias() {</code>
<code></code><code>return</code> <code>alias;</code>
<code></code><code>public</code> <code>void</code> <code>setalias(string alias) {</code>
<code></code><code>public</code> <code>string getnumber() {</code>
<code></code><code>return</code> <code>number;</code>
<code></code><code>public</code> <code>void</code> <code>setnumber(string number) {</code>
<code>}</code>
address類:
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<code>import</code> <code>java.util.list;</code>
<code>import</code> <code>com.datastax.driver.mapping.annotations.field;</code>
<code>import</code> <code>com.datastax.driver.mapping.annotations.frozen;</code>
<code>@udt</code><code>(keyspace =</code><code>"complex"</code><code>, name =</code><code>"address"</code><code>)</code>
<code>public</code> <code>class</code> <code>address {</code>
<code></code><code>private</code> <code>string street;</code>
<code></code>
<code></code><code>private</code> <code>string city;</code>
<code></code><code>@field</code><code>(name =</code><code>"zip_code"</code><code>)</code>
<code></code><code>private</code> <code>int</code> <code>zipcode;</code>
<code></code><code>@frozen</code><code>(</code><code>"list<frozen<phone>>"</code><code>)</code>
<code></code><code>private</code> <code>list<phone> phones;</code>
<code></code><code>public</code> <code>address() {</code>
<code></code><code>public</code> <code>address(string street, string city,</code><code>int</code> <code>zipcode, list<phone> phones) {</code>
<code></code><code>this</code><code>.street = street;</code>
<code></code><code>this</code><code>.city = city;</code>
<code></code><code>this</code><code>.zipcode = zipcode;</code>
<code></code><code>this</code><code>.phones = phones;</code>
<code></code><code>public</code> <code>string getstreet() {</code>
<code></code><code>return</code> <code>street;</code>
<code></code><code>public</code> <code>void</code> <code>setstreet(string street) {</code>
<code></code><code>public</code> <code>string getcity() {</code>
<code></code><code>return</code> <code>city;</code>
<code></code><code>public</code> <code>void</code> <code>setcity(string city) {</code>
<code></code><code>public</code> <code>int</code> <code>getzipcode() {</code>
<code></code><code>return</code> <code>zipcode;</code>
<code></code><code>public</code> <code>void</code> <code>setzipcode(</code><code>int</code> <code>zipcode) {</code>
<code></code><code>public</code> <code>list<phone> getphones() {</code>
<code></code><code>return</code> <code>phones;</code>
<code></code><code>public</code> <code>void</code> <code>setphones(list<phone> phones) {</code>
account類:
72
73
74
75
<code>import</code> <code>com.datastax.driver.mapping.annotations.column;</code>
<code>import</code> <code>com.datastax.driver.mapping.annotations.partitionkey;</code>
<code>import</code> <code>com.datastax.driver.mapping.annotations.table;</code>
<code>import</code> <code>com.google.common.base.objects;</code>
<code>@table</code><code>(keyspace =</code><code>"complex"</code><code>, name =</code><code>"accounts"</code><code>)</code>
<code>public</code> <code>class</code> <code>account {</code>
<code></code><code>@partitionkey</code>
<code></code><code>private</code> <code>string email;</code>
<code></code><code>private</code> <code>string name;</code>
<code></code><code>@column</code><code>(name =</code><code>"addr"</code><code>)</code>
<code></code><code>@frozen</code>
<code></code><code>private</code> <code>address address;</code>
<code></code><code>public</code> <code>account() {</code>
<code></code><code>public</code> <code>account(string name, string email, address address) {</code>
<code></code><code>this</code><code>.name = name;</code>
<code></code><code>this</code><code>.email = email;</code>
<code></code><code>this</code><code>.address = address;</code>
<code></code><code>public</code> <code>string getname() {</code>
<code></code><code>return</code> <code>name;</code>
<code></code><code>public</code> <code>void</code> <code>setname(string name) {</code>
<code></code><code>public</code> <code>string getemail() {</code>
<code></code><code>return</code> <code>email;</code>
<code></code><code>public</code> <code>void</code> <code>setemail(string email) {</code>
<code></code><code>public</code> <code>address getaddress() {</code>
<code></code><code>return</code> <code>address;</code>
<code></code><code>public</code> <code>void</code> <code>setaddress(address address) {</code>
<code></code><code>@override</code>
<code></code><code>public</code> <code>boolean</code> <code>equals(object other) {</code>
<code></code><code>if</code> <code>(other</code><code>instanceof</code> <code>account) {</code>
<code></code><code>account that = (account) other;</code>
<code></code><code>return</code> <code>objects.equal(</code><code>this</code><code>.name, that.name) && objects.equal(</code><code>this</code><code>.email, that.email);</code>
<code></code><code>return</code> <code>false</code><code>;</code>
<code></code><code>public</code> <code>int</code> <code>hashcode() {</code>
<code></code><code>return</code> <code>objects.hashcode(name, email);</code>
ormclient類:
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<code>import</code> <code>java.util.arraylist;</code>
<code>import</code> <code>com.datastax.driver.core.cluster;</code>
<code>import</code> <code>com.datastax.driver.core.host;</code>
<code>import</code> <code>com.datastax.driver.core.metadata;</code>
<code>import</code> <code>com.datastax.driver.core.session;</code>
<code>import</code> <code>com.datastax.driver.mapping.mapper;</code>
<code>import</code> <code>com.datastax.driver.mapping.mappingmanager;</code>
<code>import</code> <code>com.google.common.util.concurrent.listenablefuture;</code>
<code>public</code> <code>class</code> <code>ormclient {</code>
<code></code><code>private</code> <code>cluster cluster;</code>
<code></code><code>private</code> <code>session session;</code>
<code></code><code>mapper<account> mapper;</code>
<code></code><code>public</code> <code>session getsession() {</code>
<code></code><code>return</code> <code>this</code><code>.session;</code>
<code></code><code>/**</code>
<code></code><code>* 連接配接叢集,建立執行cql的session對象。</code>
<code></code><code>*</code>
<code></code><code>* @param node</code>
<code></code><code>*/</code>
<code></code><code>public</code> <code>void</code> <code>connect(string node) {</code>
<code></code><code>cluster = cluster.builder().addcontactpoint(node).build();</code>
<code></code><code>metadata metadata = cluster.getmetadata();</code>
<code></code><code>system.out.printf(</code><code>"connected to cluster: %s\n"</code><code>, metadata.getclustername());</code>
<code></code><code>for</code> <code>(host host : metadata.getallhosts()) {</code>
<code></code><code>system.out.printf(</code><code>"datacenter: %s; host: %s; rack: %s\n"</code><code>, host.getdatacenter(),</code>
<code></code><code>host.getaddress(), host.getrack());</code>
<code></code><code>session = cluster.connect();</code>
<code></code><code>system.out.println();</code>
<code></code><code>mapper =</code><code>new</code> <code>mappingmanager(getsession()).mapper(account.</code><code>class</code><code>);</code>
<code></code><code>public</code> <code>void</code> <code>insert() {</code>
<code></code><code>phone phone =</code><code>new</code> <code>phone(</code><code>"home"</code><code>,</code><code>"707-555-3537"</code><code>);</code>
<code></code><code>list<phone> phones =</code><code>new</code> <code>arraylist<phone>();</code>
<code></code><code>phones.add(phone);</code>
<code></code><code>address address =</code><code>new</code> <code>address(</code><code>"25800 arnold drive"</code><code>,</code><code>"sonoma"</code><code>,</code><code>95476</code><code>, phones);</code>
<code></code><code>account account =</code><code>new</code> <code>account(</code><code>"john doe"</code><code>,</code><code>"[email protected]"</code><code>, address);</code>
<code></code><code>mapper.save(account);</code>
<code></code><code>public</code> <code>void</code> <code>select() {</code>
<code></code><code>account whose = mapper.get(</code><code>"[email protected]"</code><code>);</code>
<code></code><code>if</code> <code>(whose ==</code><code>null</code><code>) {</code>
<code></code><code>system.out.println(</code><code>"account is null"</code><code>);</code>
<code></code><code>return</code><code>;</code>
<code></code><code>system.out.println(</code><code>"account name: "</code> <code>+ whose.getname());</code>
<code></code><code>// 異步查詢</code>
<code></code><code>listenablefuture<account> future = mapper.getasync(</code><code>"[email protected]"</code><code>);</code>
<code></code><code>try</code> <code>{</code>
<code></code><code>whose = future.get();</code>
<code></code><code>system.out.println(</code><code>"getasync, account name: "</code> <code>+ whose.getname());</code>
<code></code><code>catch</code> <code>(exception e) {</code>
<code></code><code>e.printstacktrace();</code>
<code></code><code>public</code> <code>void</code> <code>delete() {</code>
<code></code><code>account account =</code><code>new</code> <code>account(</code><code>"john doe"</code><code>,</code><code>"[email protected]"</code><code>,</code><code>null</code><code>);</code>
<code></code><code>mapper.delete(account);</code>
<code></code><code>public</code> <code>void</code> <code>update() {</code>
<code></code><code>// 沒有看到mapper對象關于update的api</code>
<code></code><code>public</code> <code>void</code> <code>close() {</code>
<code></code><code>session.close();</code>
<code></code><code>cluster.close();</code>
<code></code><code>public</code> <code>void</code> <code>dropschema() {</code>
<code></code><code>session.execute(</code><code>"drop keyspace complex;"</code><code>);</code>
<code></code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>
<code></code><code>ormclient client =</code><code>new</code> <code>ormclient();</code>
<code></code><code>client.connect(</code><code>"127.0.0.1"</code><code>);</code>
<code></code><code>client.insert();</code>
<code></code><code>client.select();</code>
<code></code><code>client.delete();</code>
<code></code><code>client.dropschema();</code>
<code></code><code>finally</code> <code>{</code>
<code></code><code>client.close();</code>
運作列印:
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:
<code>@accessor</code>
<code>public</code> <code>interface</code> <code>useraccessor {</code>
<code></code><code>@query</code><code>(</code><code>"select * from complex.users where id = ?"</code><code>)</code>
<code></code><code>user getoneposition(uuid userid);</code>
<code></code><code>......</code>
下篇文章說這個注解@accessor的用法。