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的用法。

时间: 2024-09-22 05:05:15

cassandra入门(二):自定义类型使用和ORM的相关文章

Struts2类型转换(一) 常规类型,自定义类型,错误处理

Struts2的类型转换是基于OGNL表达式的.有良好的扩展性. WEB应用接收到表单提交的数据都 是String类型的,Struts2可方便的转换为 常规类型(数值,日期)/ 自定义类型(User,Point类). 如果转换中出现异常,conversionError拦截器会自动处理该异常. 一, 常规类型的转换: 比如表单提交的信息有 用户名,生日, 年龄, Action中对应的数据类型分别是 String, Date, int.没什么好说的, Struts2会自动完成. Struts2内建了

NoSQL之Redis(二)---Java操作Redis存储自定义类型数据

NoSQL之Redis(二)---Java操作Redis存储自定义类型数据            Redis简介            Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案.            Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使用磁盘仅用于持久性. 相比许多键值数据存储,Redis拥有一套较为丰富的数据类型. Redis可以将数据复制到任意数量的从服务器.           

cassandra入门(一):jdbc连接cassandra作增删改查

先分享一个最新的cassandra-java-driver文档,点击电子书分享里的链接,找到javaDriver21.pdf. 该文档内容比较全,包含:jdbc连接cassandra集群,执行cql增删改查,批量查询,异步查询,cql的类型和java类型的映射关系及用户自定义类型使用,ORM等. Cassandra是一个NoSql数据库,纯java编写,apache的顶级项目,主页:http://cassandra.apache.org/(简介不多说网上有). 入门步骤:(我的jdk版本是1.7

grunt从入门到自定义项目模板

文章还可在我的github上找到,排版更友好一点:grunt从入门到自定义项目模板 一.Grunt入门介绍 1. Grunt是神马 基于任务的命令行构建工具(针对JavaScript项目) 链接:http://gruntjs.com/ 2. 使用Grunt的理由 前端的工具算得上是五花八门,在介绍如何Grunt之前,首先我们得反问自己: Grunt能够帮我们解决什么问题? 是否有其他更合适的替代方案? 3. Grunt能够帮我们解决什么问题? 作为一名开发人员,我们见过了不少功能胡里花哨但并不实

Kinect for Windows SDK开发入门(二)基础知识 上

上篇文章介绍了Kinect开发的环境配置,这篇文章和下一篇文章将介绍Kinect开发的基本知识,为深入研究Kinect for Windows SDK做好基础. 每一个Kinect应用都有一些基本元素.应用程序必须探测和发现链接到设备上的Kinect传感器.在使用这些传感器之前,必须进行初始化,一旦初始化成功后,就能产生数据,我们的程序就能处理这些数据.最后当应用程序关闭是,必须合理的释放这些传感器. 本文第一部分将会介绍如何探测初始化几释放传感器,这是非常基础的话题,但是对于基于Kinect开

Windows 8风格应用开发入门 二十五 数据绑定

数据绑定是一种简单方式来显示数据,UI元素与数据对象之间的连接或绑定是允许数据在两者之间 流动的.另外建立了绑定且数据发生变化时,相应的UI元素会自动显示变化. 如何将UI元素与 数据进行绑定 开发入门 二十五 数据绑定-windows开发入门"> 从上面图可以知道,每个绑定必须指定一个源和一个目标. 其中源对象可以是任何CLR对象,包括目标元素自身和其他UI元素.目标可以是 FrameworkElement的任何DependencyProperty(依赖属性). 数据绑定引擎从Bindi

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面也讲了许多,也提到了多级指针的概念,那具体我们怎么去操作呢 #include <stdio.h> #include <stdlib.h> main(){ int i = 3; //一级 int* p = &i; //二级,保存一级指针 int** w = &p; //三

Swift入门篇-基本类型(3)

原文:Swift入门篇-基本类型(3)     一:元组 格式 变量或常量关键字 元组变量 = ( 变量,变量, -) 说明: 1: 元组变量还是一个变量,只不过表现方式和其他变量不一样2:()括号里面可以放入N个变量组成 例子: import Foundation /* A是元组变量,()里面放着 整形 和字符串 元组类型为 整形和字符串 组成 */ var A = (1,"swift")//元组变量A 由 整形和字符串 组成 println(A) 运行结果 (1, swift)  

java 排序-Java list排序 list的元素类型为包含数字和字符串的自定义类型

问题描述 Java list排序 list的元素类型为包含数字和字符串的自定义类型 Java中自定义了一个数据结构:linkType{string str; int weight} 包含一个字符串,还有该字符串的权重 现在有List list = new ArrayList 希望能将list中的linkType按照字符串的权重重新排序 解决方案 楼上说的对. 使用java原生的API很方便的可以排序. 第一步对你的自定义类要实现Comparable接口,实现它的compareTo方法,在这个方法