本教程演示如何使用
JDBC是连接到传统关系数据库的标准Java API。
在本教程中,我们包括两种身份验证方法:Microsoft Entra身份验证和 SQL 数据库身份验证。 “无密码”选项卡显示Microsoft Entra身份验证,“密码”选项卡显示 SQL 数据库身份验证。
Microsoft Entra身份验证是一种使用Microsoft Entra ID中定义的标识连接到 Azure Database for SQL 数据库的机制。 使用Microsoft Entra身份验证,可以在中心位置管理数据库用户标识和其他Microsoft 服务,从而简化权限管理。
SQL 数据库身份验证使用存储在 SQL 数据库中的帐户。 如果你选择使用密码作为帐户的凭据,则这些凭据将存储在用户表中。 由于这些密码存储在 SQL 数据库中,因此你需要自己管理密码的轮换。
先决条件
Azure订阅 - 免费创建一个订阅。
Java开发工具包(JDK)版本 8 或更高版本。
ODBC 驱动程序 17 或 18。
如果没有,请创建名为
sqlservertest的 Azure SQL Server 实例和名为demo的数据库。 有关说明,请参阅 Quickstart:创建单一数据库 - Azure SQL 数据库。如果你没有 Spring Boot 应用程序,请使用 Spring Initializr 创建一个 Maven 项目。 请务必选择
Maven Project ,并在Dependencies 添加Spring Web 、Spring Data JDBC 和MS SQL Server Driver 依赖项,然后选择Java版本 8 或更高版本。
请参阅示例应用程序
在本教程中,你将编写一个示例应用程序。 若要更快地运行,此应用程序已编码并可在 https://github.com/Azure-Samples/quickstart-spring-data-jdbc-sql-server 中使用。
为Azure SQL 数据库服务器配置防火墙规则
默认情况下,Azure SQL 数据库实例受到保护。 它们有不允许任何传入连接的防火墙。
为了能够使用你的数据库,请打开服务器的防火墙,以允许本地 IP 地址访问数据库服务器。 有关详细信息,请参阅 Tutorial:保护 Azure SQL 数据库 中的数据库。
如果要从 Windows 计算机上的 适用于 Linux 的 Windows 子系统 (WSL) 连接到 Azure SQL 数据库 服务器,则需要将 WSL 主机 ID 添加到防火墙。
创建 SQL 数据库非管理员用户并授予权限
此步骤将创建一个非管理员用户,并向其授予对 demo 数据库的所有权限。
若要使用无密码连接,请参阅
首先,安装 Service Connector Azure CLI 的无密码扩展:
az extension add --name serviceconnector-passwordless --upgrade然后,使用以下命令创建Microsoft Entra非管理员用户:
az connection create sql \ --resource-group <your-resource-group-name> \ --connection sql_conn \ --target-resource-group <your-resource-group-name> \ --server sqlservertest \ --database demo \ --user-account \ --query authInfo.userName \ --output tsv
创建的Microsoft Entra管理员是 SQL 数据库管理员用户,因此无需创建新用户。
重要
Azure SQL数据库无密码连接需要将 MS SQL Server Driver 升级到版本 12.1.0 或更高版本。 连接选项在版本 authentication=DefaultAzureCredential 中为 12.1.0,在版本 authentication=ActiveDirectoryDefault 中为 12.2.0。
存储来自Azure SQL 数据库的数据
使用 Azure SQL 数据库 实例,可以使用 Spring Cloud Azure来存储数据。
若要安装 Spring Cloud Azure Starter 模块,请将以下依赖项添加到 pom.xml 文件中:
Spring Cloud Azure 材料清单(BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>7.2.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>注意
如果使用 Spring Boot 4.0.x,请确保将
spring-cloud-azure-dependencies版本设置为7.2.0。如果使用 Spring Boot 3.5.x,请确保将
spring-cloud-azure-dependencies版本设置为6.2.0。如果使用 Spring Boot 3.1.x-3.5.x,请确保将
spring-cloud-azure-dependencies版本设置为5.25.0。如果使用 Spring Boot 2.x,请确保将
spring-cloud-azure-dependencies版本设置为4.20.0。应在
<dependencyManagement>文件的 部分中配置此材料清单(BOM)。 这可确保所有 Spring Cloud Azure依赖项都使用相同的版本。有关用于此 BOM 的版本的详细信息,请参阅 我应该使用哪个 Spring Cloud Azure 版本。
Spring Cloud Azure Starter 构件:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter</artifactId> </dependency>注意
由于这是依赖项,因此应将其添加到
<dependencies>的 pom.xml 部分中。 此处未配置其版本,因为它由我们之前添加的 BOM 管理。
将 Spring Boot 配置为使用 Azure SQL 数据库
若要使用 Spring Data JDBC 存储来自Azure SQL 数据库的数据,请执行以下步骤来配置应用程序:
在 application.properties 配置文件中配置Azure SQL 数据库凭据。
logging.level.org.springframework.jdbc.core=DEBUG spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential; spring.sql.init.mode=always警告
配置属性
spring.sql.init.mode=always意味着 Spring Boot 将在每次服务器启动时使用我们接下来将创建的 schema.sql 文件来自动生成数据库架构。 这非常适合测试,但请记住,这会在每次重启时删除数据,因此你不应在生产中使用。
创建 src/main/resources/schema.sql 配置文件以配置数据库架构,然后添加以下内容。
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id INT IDENTITY PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);
创建新的
TodoJava 类。 此类是映射到 Spring Boot 自动创建的todo表上的域模型。 下面的代码忽略getters和setters方法。import org.springframework.data.annotation.Id; public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id private Long id; private String description; private String details; private boolean done; }编辑启动类文件以显示以下内容。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.data.repository.CrudRepository; import java.util.stream.Stream; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) { return event->repository .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).toList()) .forEach(System.out::println); } } interface TodoRepository extends CrudRepository<Todo, Long> { }提示
在本教程中,配置或代码中没有身份验证操作。 但是,连接到Azure服务需要身份验证。 若要完成身份验证,需要使用Azure标识。 Spring Cloud Azure使用Azure标识库提供的
DefaultAzureCredential,帮助你获取凭据,无须进行任何代码更改。DefaultAzureCredential支持多种身份验证方法,并确定应在运行时使用哪种方法。 通过这种方法,你的应用可在不同环境(例如本地与生产环境)中使用不同的身份验证方法,而无需实现特定于环境的代码。 有关详细信息,请参阅 DefaultAzureCredential。若要在本地开发环境中完成身份验证,可以使用 Azure CLI、Visual Studio Code、PowerShell 或其他方法。 有关详细信息,请参阅Java开发环境中Azure身份验证。 若要在Azure托管环境中完成身份验证,建议使用用户分配的托管标识。 有关详细信息,请参阅 Azure 资源的托管标识是什么?
启动应用程序。 应用程序将数据存储到数据库中。 将会看到类似于以下示例的日志:
2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)] com.example.demo.Todo@4bdb04c8
部署到Azure Spring Apps
现在,你已在本地运行 Spring Boot 应用程序,是时候将其转移到生产环境了。 Azure Spring Apps可以轻松地将 Spring Boot 应用程序部署到Azure,而无需更改任何代码。 该服务管理 Spring 应用程序的基础结构,让开发人员可以专注于代码。 Azure Spring Apps使用全面的监视和诊断、配置管理、服务发现、CI/CD 集成、蓝绿部署等提供生命周期管理。 若要将应用程序部署到 Azure Spring Apps,请参阅 将第一个应用程序部署到 Azure Spring Apps。
后续步骤
适用于 Spring 开发人员的 Azure