2. 依赖配置
首先在pom.xml
中添加必要的依赖。我们需要引入三个核心组件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
<version>2.6.3</version>
</dependency>
接着添加Web支持依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.3</version>
</dependency>
最后引入DataStax官方提供的Astra集成包:
<dependency>
<groupId>com.datastax.astra</groupId>
<artifactId>astra-spring-boot-starter</artifactId>
<version>0.3.0</version>
</dependency>
依赖配置完成后,就可以开始构建我们的Spring Boot应用了。
3. 数据库准备
需要明确一点:DataStax Astra是基于Apache Cassandra的云端数据库服务。这意味着我们获得的是完全托管的Cassandra数据库,但连接方式有些特殊。
要操作数据库,需要先完成两个关键步骤:
- 在Astra平台创建数据库实例
- 下载安全连接包(Secure Connect Bundle)
安全连接包包含SSL证书和连接详情,是建立安全连接的必需品。本教程假设已完成这两步准备。
4. 应用配置
创建标准的Spring Boot启动类:
@SpringBootApplication
public class AstraDbSpringApplication {
public static void main(String[] args) {
SpringApplication.run(AstraDbSpringApplication.class, args);
}
}
接下来配置application.properties
文件,这些凭证信息可直接从Astra控制台获取:
astra.api.application-token=AstraCS:xxxxxxxxx
astra.api.database-id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
astra.api.database-region=europe-west1
启用标准CQL会话并指定安全连接包路径:
astra.cql.enabled=true
astra.cql.downloadScb.path=~/.astra/secure-connect-shopping-list.zip
最后配置Spring Data相关属性:
spring.data.cassandra.keyspace=shopping_list
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS
这里指定了键空间(keyspace)并设置了自动建表策略。
5. 连接测试
现在可以测试数据库连通性了。创建一个简单的REST控制器:
@RestController
public class AstraDbApiController {
@Autowired
private AstraClient astraClient;
@GetMapping("/ping")
public String ping() {
return astraClient.apiDevopsOrganizations()
.organizationId();
}
}
这个ping接口通过AstraClient
返回组织ID,这是Astra SDK提供的包装类,用于与各种Astra API交互。
启动应用验证连接:
mvn clean install spring-boot:run
控制台应显示类似以下日志:
...
13:08:00.656 [main] INFO c.d.stargate.sdk.StargateClient - + CqlSession :[ENABLED]
13:08:00.656 [main] INFO c.d.stargate.sdk.StargateClient - + API Cql :[ENABLED]
13:08:00.657 [main] INFO c.d.stargate.sdk.rest.ApiDataClient - + API Data :[ENABLED]
13:08:00.657 [main] INFO c.d.s.sdk.doc.ApiDocumentClient - + API Document :[ENABLED]
13:08:00.658 [main] INFO c.d.s.sdk.gql.ApiGraphQLClient - + API GraphQL :[ENABLED]
13:08:00.658 [main] INFO com.datastax.astra.sdk.AstraClient
- [AstraClient] has been initialized.
13:08:01.515 [main] INFO o.b.s.a.AstraDbSpringApplication
- Started AstraDbSpringApplication in 7.653 seconds (JVM running for 8.097)
通过curl测试接口:
$ curl http://localhost:8080/ping; echo
d23bf54d-1bc2-4ab7-9bd9-2c628aa54e85
连接成功!接下来实现数据操作功能。
6. 使用Spring Data操作
Spring Data提供了多种Cassandra访问方式,这里选择最常用的Spring Data Cassandra。核心优势是能大幅减少样板代码。
定义购物清单实体类:
@Table
public class ShoppingList {
@PrimaryKey
@CassandraType(type = Name.UUID)
private UUID uid = UUID.randomUUID();
private String title;
private boolean completed = false;
@Column
private List<String> items = new ArrayList<>();
// 标准Getter和Setter方法
}
使用注解映射Cassandra表结构,uid
作为主键。
创建Repository接口:
@Repository
public interface ShoppingListRepository extends CassandraRepository<ShoppingList, String> {
ShoppingList findByTitleAllIgnoreCase(String title);
}
除了继承的findAll
等方法,额外添加了按标题查找的方法。Astra Spring Boot Starter会自动配置CqlSession
,省去手动配置的麻烦。
7. 整合实现
创建服务层封装业务逻辑:
@Service
public class ShoppingListService {
@Autowired
private ShoppingListRepository shoppingListRepository;
public List<ShoppingList> findAll() {
return shoppingListRepository.findAll(CassandraPageRequest.first(10)).toList();
}
public ShoppingList findByTitle(String title) {
return shoppingListRepository.findByTitleAllIgnoreCase(title);
}
@PostConstruct
public void insert() {
ShoppingList groceries = new ShoppingList("Groceries");
groceries.setItems(Arrays.asList("Bread", "Milk, Apples"));
ShoppingList pharmacy = new ShoppingList("Pharmacy");
pharmacy.setCompleted(true);
pharmacy.setItems(Arrays.asList("Nappies", "Suncream, Aspirin"));
shoppingListRepository.save(groceries);
shoppingListRepository.save(pharmacy);
}
}
使用@PostConstruct
初始化测试数据,避免手动插入的麻烦。
最后实现控制器:
@RestController
@RequestMapping(value = "/shopping")
public class ShoppingListController {
@Autowired
private ShoppingListService shoppingListService;
@GetMapping("/list")
public List<ShoppingList> findAll() {
return shoppingListService.findAll();
}
}
访问http://localhost:8080/shopping/list
应返回:
[
{
"uid": "363dba2e-17f3-4d01-a44f-a805f74fc43d",
"title": "Groceries",
"completed": false,
"items": [
"Bread",
"Milk, Apples"
]
},
{
"uid": "9c0f407e-5fc1-41ad-8e46-b3c115de9474",
"title": "Pharmacy",
"completed": true,
"items": [
"Nappies",
"Suncream, Aspirin"
]
}
]
应用运行正常!接下来看看更底层的操作方式。
8. 使用Cassandra Template
也可以直接使用CassandraTemplate
,这是Spring的经典CQL访问方式,至今仍广泛使用。
扩展现有控制器添加数据中心查询接口:
@Autowired
private CassandraTemplate cassandraTemplate;
@GetMapping("/datacenter")
public String datacenter() {
return cassandraTemplate
.getCqlOperations()
.queryForObject("SELECT data_center FROM system.local", String.class);
}
两种访问方式可以无缝切换,因为它们共享相同的配置属性。
9. 总结
本文演示了如何:
- 配置Spring Boot连接托管版Cassandra数据库
- 使用Spring Data实现购物清单的增删改查
- 通过Cassandra Template执行原生CQL查询
完整源码可在GitHub仓库获取。踩坑提示:确保安全连接包路径正确,否则连接会直接失败。