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

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依赖:

1

2

3

4

5

6

7

8

9

10

<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类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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

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类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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

72

73

74

75

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类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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

72

73

74

75

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

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:

1

2

3

4

5

6

7

8

@Accessor

public interface UserAccessor {

@Query("SELECT * FROM complex.users WHERE id = ?")

User getOnePosition(UUID userId);

......

}

下篇文章说这个注解@Accessor的用法。


相关文章
|
8月前
|
Java 流计算
Flink类型与Java基本类型关系映射表
Flink类型与Java基本类型关系映射表
52 0
|
10月前
|
存储 缓存 关系型数据库
《高性能Mysql》读书笔记之Schema与数据类型优化
《高性能Mysql》读书笔记之Schema与数据类型优化
|
11月前
|
存储 SQL HIVE
数据仓库的Hive的数据类型的复杂数据类型的struct
在数据仓库领域,Hive是一个常用的工具。它提供了一种简单的方式来查询和分析大量数据。
98 0
|
存储 关系型数据库 MySQL
MySQL数据库支持的数据类型有哪些?底层原理是什么?
MySQL数据库支持的数据类型有哪些?底层原理是什么?
140 0
|
SQL 存储 JSON
Cassandra CQL语法 以及功能介绍
内容摘要: 一、Cassandra简单介绍 ·Cassandra的历史和基本架构 二、Cassandra CQL介绍 ·如何使用CQL语言操作Cassandra
3810 0
Cassandra CQL语法 以及功能介绍
|
机器学习/深度学习 消息中间件 NoSQL
Cassandra 最佳实践系列(1) - CQL 基本数据类型
Cassandra cql基本数据类型介绍
2028 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.7. 枚举类型
8.7. 枚举类型 8.7.1. 枚举类型的声明 8.7.2. 排序 8.7.3. 类型安全性 8.7.4. 实现细节 枚举(enum)类型是由一个静态、值的有序集合构成的数据类型。它们等效于很多编程语言所支持的enum类型。
1231 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.16. 复合类型
8.16. 复合类型 8.16.1. 复合类型的声明 8.16.2. 构造组合值 8.16.3. 访问复合类型 8.16.4. 修改复合类型 8.16.5. 在查询中使用复合类型 8.16.6. 复合类型输入和输出语法 一个复合类型表示一行或一个记录的结构,它本质上就是一个域名和它们数据类型的列表。
1005 0
|
存储 SQL 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 10 章 类型转换_10.1. 概述
10.1. 概述 SQL是一种强类型语言。也就是说,每个数据项都有一个相关的数据类型,数据类型决定其行为和允许的用法。 PostgreSQL有一个可扩展的类型系统,该系统比其它SQL实现更具通用和灵活。
1309 0
|
存储 JSON 数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.14. JSON 类型
8.14. JSON 类型 8.14.1. JSON 输入和输出语法 8.14.2. 有效地设计 JSON 文档 8.14.3. jsonb 包含和存在 8.14.4. jsonb 索引 根据RFC 7159 中的说明,JSON 数据类型是用来存储 JSON(JavaScript Object Notation) 数据的。
1254 0