> 文章列表 > SAP CAP篇二:为Service加上数据库支持

SAP CAP篇二:为Service加上数据库支持

SAP CAP篇二:为Service加上数据库支持

在篇一快速创建一个Service,基于Java的实现中,可见使用SAP CAP (Cloud Programming Model)确实可以提高开发效率。尤其是Java技术栈上,对比于之前使用Olingo框架来实现oData,使用SAP CAP真的可以做到指数级别的效率提升。

当然,篇一中介绍的Service只使用了内存来存储和读取数据。本篇将加上数据库支持。

文章目录

  • 前期准备
  • 添加一个基于数据库表的Entity
  • 在Service中引用刚刚创建的Entity
    • 修改Service Definition
  • 创建数据库
  • 修改程序,让程序使用刚刚创建的数据库文件
  • 运行程序

前期准备

根据SAP CAP的官方文档,CAP可以非常容易地添加数据库坚持。然而,所有的数据库中,支持得最好的当然是SAP自家的HANA数据库。可惜,SAP HANA数据库作为企业级数据库,无论版权、安装环境都不是本地环境能支持的。所以本篇中使用Sqlite作为数据库。

值得提醒的是,SAP CAP生成的Java项目,在没有指定数据库的情况下,默认使用H2 In-memory数据库。
H2 Inmemory
例外一个有意思的点事,SAP官方文档中提及:

The CAP Java runtime is tested with PostgreSQL 12.

但是使用PostgreSQL通常搭建一个Docker,这个虽然很容易,但是简单起见,还是使用Sqlite吧。

首先,安装sqlite数据库。在项目文件夹下运行NPM指令:

npm i -D sqlite3

其次,在Visual Studio Code中,安装额外的Plugin:

  • Sqlite Viewer
    这个Plugin允许在Visual Studio Code直接打开Sqlite文件。因为我们在这个Service中只需要对数据库进行查看,所以安装一个Viewer就足够了。

添加一个基于数据库表的Entity

创建db文件夹

在项目的根目录中,创建db文件夹。

创建schema.cds文件

创建schema.cds,并添加如下的Entity:

entity DBEntities {key ID : Integer;title  : String(111);descr  : String(1111);
}

初始化数据库表

CAP还支持对数据库的表进行初始化。这个初始化需要对应的csv文件。
首先,在db文件夹中,添加data文件夹。
其次,在data文件夹中添加文件DBEntities.csv

ID;title;descr
1;test1; Desc of test1
2;test2; Desc of test2

在Service中引用刚刚创建的Entity

修改Service Definition

修改Service Defintion的cds文件。

service DemoService {@cds.persistence.skip: trueentity DemoEntity {key ID: Integer;title: String(111);descr: String(1111);}entity DBEntities as projection on DBEntities;
}

注意,这里在上篇的DemoEntity中加上了@cds.persistence.skip: true的annotation。这里的目的确保框架不需要为该Entity创建数据库表。

创建数据库

现在,可以创建数据库了。

cds deploy --to sqlite

执行上述命令之后,会在项目的根目录下创建了db.sqlite文件。

可以在Visual Studio Code打开该文件来查看对应的数据库表是不是已经创建成功。还可以查看数据库中是否已经有初始化数据。

CDS deploy

DB表和数据

这时可以发现package.json文件已经发生修改:

  "cds": {"requires": {"db": {"kind": "sqlite","credentials": {"database": "db.sqlite"}}}}

修改程序,让程序使用刚刚创建的数据库文件

文章开头已经提及,默认Java项目会使用H2数据库。所以,要使用Sqlite,需要配置application.yml文件:

---
spring:config:activate:on-profile: sqlitedatasource:url: "jdbc:sqlite:/db.sqlite"driver-class-name: org.sqlite.JDBChikari:maximum-pool-size: 1

运行程序

通过Maven命令来运行程序,并指定使用sqlite:

mvn spring-boot:run -D"spring-boot.run.profiles"=sqlite

这时还可以使用Postman来进行测试,并确认数据库表是不是被更新。虽然一行代码没写,SAP CAP已经全部默认实现了。