天天看點

cassandra入門(二):自定義類型使用和ORM

直接貼代碼,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&lt;frozen&lt;phone&gt;&gt;</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&lt;address&gt;</code>

自定義類型:phone和address。

表:accounts 。

maven依賴:

<code>&lt;</code><code>dependency</code><code>&gt;</code>

<code></code><code>&lt;</code><code>groupid</code><code>&gt;com.datastax.cassandra&lt;/</code><code>groupid</code><code>&gt;</code>

<code></code><code>&lt;</code><code>artifactid</code><code>&gt;cassandra-driver-core&lt;/</code><code>artifactid</code><code>&gt;</code>

<code></code><code>&lt;</code><code>version</code><code>&gt;2.1.5&lt;/</code><code>version</code><code>&gt;</code>

<code>&lt;/</code><code>dependency</code><code>&gt;</code>

<code></code><code>&lt;</code><code>artifactid</code><code>&gt;cassandra-driver-mapping&lt;/</code><code>artifactid</code><code>&gt;</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&lt;frozen&lt;phone&gt;&gt;"</code><code>)</code>

<code></code><code>private</code> <code>list&lt;phone&gt; 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&lt;phone&gt; 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&lt;phone&gt; getphones() {</code>

<code></code><code>return</code> <code>phones;</code>

<code></code><code>public</code> <code>void</code> <code>setphones(list&lt;phone&gt; 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) &amp;&amp; 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&lt;account&gt; 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&lt;phone&gt; phones =</code><code>new</code> <code>arraylist&lt;phone&gt;();</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&lt;account&gt; 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的用法。