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


相关文章
|
4月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
124 0
|
4月前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
523 2
|
4月前
|
缓存 Java Spring
Spring缓存实践指南:从入门到精通的全方位攻略!
【8月更文挑战第31天】在现代Web应用开发中,性能优化至关重要。Spring框架提供的缓存机制可以帮助开发者轻松实现数据缓存,提升应用响应速度并减少服务器负载。通过简单的配置和注解,如`@Cacheable`、`@CachePut`和`@CacheEvict`,可以将缓存功能无缝集成到Spring应用中。例如,在配置文件中启用缓存支持并通过`@Cacheable`注解标记方法即可实现缓存。此外,合理设计缓存策略也很重要,需考虑数据变动频率及缓存大小等因素。总之,Spring缓存机制为提升应用性能提供了一种简便快捷的方式。
56 0
|
4月前
|
NoSQL Java 关系型数据库
MongoDB保姆级指南(下):无缝集成SpringData框架,一篇最全面的Java接入指南!
前面的两篇文章已经将MongoDB大多数知识进行了阐述,不过其中的所有内容,都基于原生的MongoDB语法在操作。可是,在实际的日常开发过程中,我们并不会直接去接触MongoDB,毕竟MongoDB只能算作是系统内的一个组件,无法仅依靠它来搭建出一整套系统。
190 1
|
7月前
|
druid 数据库 Nacos
平台设计-多数据源支持
平台倡导分布数据库,最简单的分库逻辑是按业务领域
|
7月前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
97 0
|
7月前
|
SQL Java 数据库连接
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
423 1
|
7月前
|
Java 数据库连接 数据库
【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地
Mybatis是一个基于JDBC实现的,支持普通 SQL 查询、存储过程和高级映射的优秀持久层框架,去掉了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索封装。 Mybatis主要思想是将程序中大量的 SQL 语句剥离出来,配置在配置文件中,以实现 SQL 的灵活配置。在所有 ORM 框架中都有一个非常重要的媒介——PO(持久化对象),PO 的作用就是完成持久化操作,通过该对象对数据库执行增删改的操作,以面向对象的方式操作数据库。
98 1
【Spring技术专题】「实战开发系列」保姆级教你SpringBoot整合Mybatis框架实现多数据源的静态数据源和动态数据源配置落地
|
7月前
|
消息中间件 Java Kafka
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
【Spring底层原理高级进阶】Spring Kafka:实时数据流处理,让业务风起云涌!️
|
SQL 缓存 开发框架
SpringCloud微服务实战——搭建企业级开发框架(二十八):扩展MybatisPlus插件DataPermissionInterceptor实现数据权限控制
一套完整的系统权限需要支持功能权限和数据权限,前面介绍了系统通过RBAC的权限模型来实现功能的权限控制,这里我们来介绍,通过扩展Mybatis-Plus的插件DataPermissionInterceptor实现数据权限控制。   简单介绍一下,所谓功能权限,顾名思义是指用户在系统中拥有对哪些功能操作的权限控制,而数据权限是指用户在系统中能够访问哪些数据的权限控制,数据权限又分为行级数据权限和列级数据权限。
1594 27
SpringCloud微服务实战——搭建企业级开发框架(二十八):扩展MybatisPlus插件DataPermissionInterceptor实现数据权限控制