cassandra入门(三):便捷的@Accessor注解

简介:

如果说,入门二的用法是hibernate,那么这篇入门三的用法就更像ibatis。

完整的代码请参考:https://github.com/yankai913/cassandra-java-userguide。

由于本文复用了入门二的部分代码,所以这里只贴新增的。

新增表:

1

2

3

4

5

CREATE TABLE complex.users (

id uuid PRIMARY KEY,

name text,

addresses map<text,frozen<address>>

);

UserAccessor类:

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

import java.util.Map;

import java.util.UUID;

import com.datastax.driver.core.ResultSet;

import com.datastax.driver.mapping.Result;

import com.datastax.driver.mapping.annotations.Accessor;

import com.datastax.driver.mapping.annotations.Param;

import com.datastax.driver.mapping.annotations.Query;

import com.google.common.util.concurrent.ListenableFuture;

import com.zoo.Address;

@Accessor

public interface UserAccessor {

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

User getOnePosition(UUID userId);

@Query("SELECT * FROM complex.users")

Result<User> getAll();

@Query("SELECT * FROM complex.users")

ListenableFuture<Result<User>> getAllAsync();

@Query("insert into complex.users(id, name, addresses) values (:id, :name, :addresses)")

ResultSet insertUser(@Param("id") UUID id, @Param("name") String name,

@Param("addresses") Map<String, Address> addresses);

@Query("UPDATE complex.users SET name= :name WHERE id= :id")

ResultSet updateName(@Param("id") UUID id, @Param("name") String name);

@Query("UPDATE complex.users SET addresses[:name]=:address WHERE id= :id")

ResultSet updateAddress(@Param("id") UUID id, @Param("name") String addressName,

@Param("address") Address address);

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

ResultSet deleteOne(UUID userId);

}

User类:

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

import java.util.Map;

import java.util.UUID;

import com.datastax.driver.mapping.annotations.Column;

import com.datastax.driver.mapping.annotations.Frozen;

import com.datastax.driver.mapping.annotations.Table;

import com.zoo.Address;

import com.zoo.BaseEntity;

@Table(keyspace = "complex", name = "users")

public class User extends BaseEntity {

private UUID id;

private String name;

@Column(name = "addresses")

@Frozen("map<text,frozen<address>>")

private Map<String, Address> address;

public UUID getId() {

return id;

}

public void setId(UUID id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Map<String, Address> getAddress() {

return address;

}

public void setAddress(Map<String, Address> address) {

this.address = address;

}

}

BaseEntity类,就是做了toString()重写:

1

2

3

4

5

6

7

8

9

10

import com.alibaba.fastjson.JSON;

public class BaseEntity {

@Override

public String toString() {

return JSON.toJSONString(this);

}

}

测试类AccessorClient:

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

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.UUID;

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.MappingManager;

import com.datastax.driver.mapping.Result;

import com.google.common.util.concurrent.ListenableFuture;

import com.zoo.Address;

import com.zoo.Phone;

/**

*

* @author yankai913@gmail.com

* @date 2015-11-4

*

*/

public class AccessorClient {

private Cluster cluster;

private Session session;

// 放一个公共userId

private UUID userId = UUID.fromString("fbdf82ed-0063-4796-9c7c-a3d4f47b4b25");

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();

}

public void insert() {

MappingManager manager = new MappingManager(getSession());

UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);

Map<String, Address> addresses = new HashMap<String, Address>();

Address address = new Address();

address.setCity("Honolulu");

address.setStreet("123 Arnold Drive");

address.setZipCode(95476);

List<Phone> phones = new ArrayList<Phone>();

Phone phone1 = new Phone("job1", "10086");

Phone phone2 = new Phone("job2", "10000");

phones.add(phone1);

phones.add(phone2);

address.setPhones(phones);

addresses.put("Work", address);

userAccessor.insertUser(userId, "tom", addresses);

}

public void select() {

// getAll

MappingManager manager = new MappingManager(getSession());

UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);

Result<User> users = userAccessor.getAll();

for (User user : users) {

System.out.println("getAll:" + user);

}

// getOne

User user = userAccessor.getOnePosition(userId);

System.out.println("getOne:" + user);

// getAllAsync

ListenableFuture<Result<User>> future = userAccessor.getAllAsync();

try {

for (User _user : future.get()) {

System.out.println("getAsync:" + _user);

}

}

catch (Exception e) {

e.printStackTrace();

}

}

public void update() {

MappingManager manager = new MappingManager(getSession());

UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);

userAccessor.updateName(userId, "jack");

}

public void update2() {

MappingManager manager = new MappingManager(getSession());

UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);

Address address = new Address();

List<Phone> phones = new ArrayList<Phone>();

Phone phone2 = new Phone("job2", "10010");

phones.add(phone2);

address.setPhones(phones);

userAccessor.updateAddress(userId, "Work", address);

}

public void delete() {

MappingManager manager = new MappingManager(getSession());

UserAccessor userAccessor = manager.createAccessor(UserAccessor.class);

userAccessor.deleteOne(userId);

}

public void dropSchema() {

session.execute("DROP KEYSPACE complex;");

}

public void close() {

session.close();

cluster.close();

}

public static void main(String[] args) {

AccessorClient client = new AccessorClient();

try {

client.connect("127.0.0.1");

client.select();

client.insert();

client.select();

client.update();

client.select();

client.update2();

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

getOne:null

getOne:{“address”:{“Work”:{“city”:”Honolulu”,”phones”:[{"alias":"job1","number":"10086"},{"alias":"job2","number":"10000"}],”street”:”123 Arnold Drive”,”zipCode”:95476}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”tom”}

getOne:{“address”:{“Work”:{“city”:”Honolulu”,”phones”:[{"alias":"job1","number":"10086"},{"alias":"job2","number":"10000"}],”street”:”123 Arnold Drive”,”zipCode”:95476}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”jack”}

getOne:{“address”:{“Work”:{“phones”:[{"alias":"job2","number":"10010"}],”zipCode”:0}},”id”:”fbdf82ed-0063-4796-9c7c-a3d4f47b4b25″,”name”:”jack”}

getOne:null


相关文章
|
20天前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
30 0
|
1月前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
258 2
|
1月前
|
NoSQL Java 关系型数据库
MongoDB保姆级指南(下):无缝集成SpringData框架,一篇最全面的Java接入指南!
前面的两篇文章已经将MongoDB大多数知识进行了阐述,不过其中的所有内容,都基于原生的MongoDB语法在操作。可是,在实际的日常开发过程中,我们并不会直接去接触MongoDB,毕竟MongoDB只能算作是系统内的一个组件,无法仅依靠它来搭建出一整套系统。
|
3月前
|
缓存 Java 数据库连接
Java开发者必备:Hibernate与JPA在企业级应用中的最佳实践
【6月更文挑战第25天】Java企业开发常用Hibernate和JPA,两者通过ORM简化数据库操作,提升开发效率。它们支持复杂查询,具有良好的可扩展性。最佳实践中,应注意映射配置的合理性,优化查询性能,利用缓存提升性能,以及妥善管理事务。示例代码展示了使用JPA进行分页查询的方法。
29 0
|
4月前
|
druid 数据库 Nacos
平台设计-多数据源支持
平台倡导分布数据库,最简单的分库逻辑是按业务领域
|
4月前
|
SQL Java 数据库连接
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
299 1
|
4月前
|
消息中间件 Java Kafka
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
|
canal 存储 关系型数据库
Spring Boot业务系统如何实现海量数据高效实时搜索
我们都知道随着业务系统的发展和使用,数据库存储的业务数据量会越来越大,逐渐成为了业务系统的瓶颈。在阿里巴巴开发手册中也建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时就分库分表。数据库最终都是存储在磁盘上,随着数据量变大,会导致数据操作变得缓慢,无论是计算还是IO,但是话又说回来,单表数据量大就一定要进行分库分表操作吗?答案是否定的,因为分库分表本身是一个“很重”的操作,这里就不卖关子了,直接来看看分库分表带来的以下问题和挑战
466 1
Spring Boot业务系统如何实现海量数据高效实时搜索
|
10月前
|
存储 NoSQL Java
微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
微服务技术系列教程(46)-SpringBoot整合MongoDB(文章评论案例)
229 0
|
Java 数据库 Docker
后端开发2.mongdb的集成
后端开发2.mongdb的集成
53 0
后端开发2.mongdb的集成