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数据库,但连接方式有些特殊。

要操作数据库,需要先完成两个关键步骤:

  1. 在Astra平台创建数据库实例
  2. 下载安全连接包(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. 总结

本文演示了如何:

  1. 配置Spring Boot连接托管版Cassandra数据库
  2. 使用Spring Data实现购物清单的增删改查
  3. 通过Cassandra Template执行原生CQL查询

完整源码可在GitHub仓库获取。踩坑提示:确保安全连接包路径正确,否则连接会直接失败。


原始标题:Connecting to a NoSQL Database with Spring Boot