Usar o Spring Data JDBC com o Banco de Dados do Azure para MySQL
Este tutorial demonstra como armazenar dados em um banco de dados do Banco de Dados do Azure para MySQL usando o Spring Data JDBC.
O JDBC é a API Java padrão para se conectar a bancos de dados relacionais tradicionais.
Neste tutorial, incluímos dois métodos de autenticação: autenticação do Microsoft Entra e autenticação do MySQL. A guia Sem senha mostra a autenticação do Microsoft Entra e a guia Senha mostra a autenticação do MySQL.
A autenticação do Microsoft Entra é um mecanismo para conexão ao Banco de Dados do Azure para MySQL que usa as identidades definidas no Microsoft Entra ID. Com a autenticação do Microsoft Entra, você pode gerenciar as identidades de usuários do banco de dados e outros serviços da Microsoft em uma só localização central, o que simplifica o gerenciamento de permissões.
A autenticação do MySQL usa as contas armazenadas no MySQL. Se você optar por usar senhas como credenciais para as contas, essas credenciais serão armazenadas na tabela user
. Como essas senhas são armazenadas no MySQL, você precisa gerenciar a rotação das senhas por conta própria.
Pré-requisitos
Uma assinatura do Azure – crie uma gratuitamente.
Java Development Kit (JDK), versão 8 ou superior.
Se você não tiver um aplicativo do Spring Boot, crie um projeto do Maven com o Spring Initializr. Certifique-se de selecionar Projeto Maven e, em Dependências, adicione as dependências Spring Web, Spring Data JDBC e driver MySQL, e, em seguida, selecione Java versão 8 ou superior.
- Se você não tiver uma, crie uma instância do Servidor Flexível do Banco de Dados do Azure para MySQL nomeada
mysqlflexibletest
. Para obter instruções, consulte Início Rápido: usar o portal do Azure para criar um servidor flexível do Banco de Dados do Azure para MySQL. Em seguida, crie um banco de dados chamadodemo
. Para obter instruções, consulte Criar e gerenciar bancos de dados para o Servidor Flexível do Banco de Dados do Azure para MySQL.
Consulte o aplicativo de exemplo
Neste tutorial, você codificará um aplicativo de exemplo. Caso você queira adiantar o processo, esse aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Configurar uma regra de firewall para o servidor MySQL
As instâncias do Banco de Dados do Azure para MySQL são protegidas por padrão. Elas têm um firewall que não permite nenhuma conexão de entrada.
Para poder usar seu banco de dados, abra o firewall do servidor para permitir que o endereço IP local acesse o servidor de banco de dados. Para obter mais informações, confira Gerenciar regras de firewall para o Banco de Dados do Azure para MySQL, Servidor Flexível usando o portal do Azure.
Se estiver se conectando ao servidor MySQL a partir do Subsistema Windows para Linux (WSL) em um computador Windows, será necessário adicionar o endereço IP do host do WSL ao firewall.
Criar um usuário não administrador do MySQL e conceder permissão
Esta etapa criará um usuário não administrador e concederá todas as permissões no banco de dados demo
a ele.
Você pode usar o método a seguir para criar um usuário não administrador que usa uma conexão sem senha.
Use o seguinte comando para instalar a extensão sem senha do Conector do Serviço para a CLI do Azure:
az extension add --name serviceconnector-passwordless --upgrade
Use o seguinte comando para criar o usuário não administrador do Microsoft Entra:
az connection create mysql-flexible \ --resource-group <your_resource_group_name> \ --connection mysql_conn \ --target-resource-group <your_resource_group_name> \ --server mysqlflexibletest \ --database demo \ --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \ --query authInfo.userName \ --output tsv
Quando o comando for concluído, anote o nome de usuário na saída do console.
Armazenar dados do Banco de Dados do Azure para MySQL
Agora que você tem uma instância de servidor do Banco de Dados do Azure para MySQL Flexível, pode armazenar dados usando o Azure Spring Cloud.
Para instalar o módulo do Iniciador do Azure Spring Cloud JDBC MySQL, adicione a seguinte dependência ao arquivo pom.xml:
A lista de materiais (BOM) do Azure Spring Cloud:
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.19.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Observação
Se você estiver usando o Spring Boot 2.x, certifique-se de definir a
spring-cloud-azure-dependencies
versão como4.19.0
. Esta lista de materiais (BOM) deve ser configurada na<dependencyManagement>
seção do arquivo pom.xml. Isso garante que todas as dependências do Azure Spring Cloud estejam usando a mesma versão. Para obter mais informações sobre a versão usada para esta BOM, consulte Qual versão do Azure Spring Cloud devo usar.O artefato do Iniciador do Azure Spring Cloud JDBC MySQL:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Observação
As conexões sem senha são suportadas desde a versão 4.5.0
.
Configurar o Spring Boot para usar o Banco de Dados do Azure para MySQL
Para armazenar dados do Banco de Dados do Azure para MySQL usando o Spring Data JDBC, siga estas etapas para configurar o aplicativo:
Configure as credenciais do Banco de Dados do Azure para MySQL adicionando as seguintes propriedades ao arquivo de configuração application.properties.
logging.level.org.springframework.jdbc.core=DEBUG spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC spring.datasource.username=<your_mysql_ad_non_admin_username> spring.datasource.azure.passwordless-enabled=true spring.sql.init.mode=always
Aviso
A propriedade de configuração
spring.sql.init.mode=always
significa que o Spring Boot vai gerar um esquema de banco de dados automaticamente, usando o arquivo schema.sql que você criará a seguir, toda vez que o servidor for iniciado. Esse recurso é ótimo para testes, mas lembre-se de que ele excluirá seus dados a cada reinicialização, portanto, não deve ser usado na produção.A propriedade de configuração
spring.datasource.url
foi acrescentada a?serverTimezone=UTC
para instruir o driver JDBC a usar o formato de data UTC (Tempo Universal Coordenado) ao conectar-se ao banco de dados. Sem esse parâmetro, seu servidor Java não usaria o mesmo formato de data que o banco de dados, o que resultaria em um erro.
- Se você não tiver uma, crie uma instância do Servidor Único do Banco de Dados do Azure para MySQL nomeada
mysqlsingletest
. Para obter instruções, consulte Início Rápido: criar um Servidor do Banco de Dados do Azure para MySQL ao usar o portal do Azure. Em seguida, crie um banco de dados chamadodemo
. Para obter instruções, consulte a seção Criar um banco de dados de Criar usuários no Banco de Dados do Azure para MySQL..
Consulte o aplicativo de exemplo
Neste artigo, você codificará um aplicativo de exemplo. Caso você queira adiantar o processo, esse aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.
Configurar uma regra de firewall para o servidor MySQL
As instâncias do Banco de Dados do Azure para MySQL são protegidas por padrão. Elas têm um firewall que não permite nenhuma conexão de entrada.
Para poder usar seu banco de dados, abra o firewall do servidor para permitir que o endereço IP local acesse o servidor de banco de dados. Para mais informação, consulte Criar e gerenciar regras de firewall do Banco de Dados do Azure para MySQL usando o portal do Azure.
Se estiver se conectando ao servidor MySQL a partir do Subsistema Windows para Linux (WSL) em um computador Windows, será necessário adicionar o endereço IP do host do WSL ao firewall.
Criar um usuário não administrador do MySQL e conceder permissão
Esta etapa criará um usuário não administrador e concederá todas as permissões no banco de dados demo
a ele.
Importante
Para usar conexões sem senha, crie um usuário administrador do Microsoft Entra para sua instância do Banco de Dados do Azure para MySQL. Para obter mais informações, consulte a seção Configuração do usuário administrador do Microsoft Entra do Microsoft Entra para autenticação com o MySQL.
Crie um script SQL chamado create_ad_user.sql para criar um usuário não administrador. Adicione o seguinte conteúdo e salve-o localmente:
export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)
cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF
Em seguida, use o seguinte comando para executar o script SQL, a fim de criar o usuário não administrador do Microsoft Entra:
mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql
Dica
Para usar a autenticação do Microsoft Entra para se conectar ao Banco de Dados do Azure para MySQL, você precisa entrar com o usuário administrador do Microsoft Entra configurado e, em seguida, obter o token de acesso como a senha. Para obter mais informações, consulte Use o Microsoft Entra ID para autenticação com o MySQL.
Armazenar dados do Banco de Dados do Azure para MySQL
Agora que você tem um banco de dados do Azure para MySQL Servidor Único, pode armazenar dados usando o Azure Spring Cloud.
Para instalar o módulo do Iniciador do Azure Spring Cloud JDBC MySQL, adicione a seguinte dependência ao arquivo pom.xml:
A lista de materiais (BOM) do Azure Spring Cloud:
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.19.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Observação
Se você estiver usando o Spring Boot 2.x, certifique-se de definir a
spring-cloud-azure-dependencies
versão como4.19.0
. Esta lista de materiais (BOM) deve ser configurada na<dependencyManagement>
seção do arquivo pom.xml. Isso garante que todas as dependências do Azure Spring Cloud estejam usando a mesma versão. Para obter mais informações sobre a versão usada para esta BOM, consulte Qual versão do Azure Spring Cloud devo usar.O artefato do Iniciador do Azure Spring Cloud JDBC MySQL:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId> </dependency>
Observação
As conexões sem senha são suportadas desde a versão 4.5.0
.
Configurar o Spring Boot para usar o Banco de Dados do Azure para MySQL
Para armazenar dados do Banco de Dados do Azure para MySQL usando o Spring Data JDBC, siga estas etapas para configurar o aplicativo:
Configure as credenciais do Banco de Dados do Azure para MySQL adicionando as seguintes propriedades ao arquivo de configuração application.properties.
logging.level.org.springframework.jdbc.core=DEBUG spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest spring.datasource.azure.passwordless-enabled=true spring.sql.init.mode=always
Aviso
A propriedade de configuração
spring.sql.init.mode=always
significa que o Spring Boot vai gerar um esquema de banco de dados automaticamente, usando o arquivo schema.sql que você criará a seguir, toda vez que o servidor for iniciado. Esse recurso é ótimo para testes, mas lembre-se de que ele excluirá seus dados a cada reinicialização, portanto, não deve ser usado na produção.A propriedade de configuração
spring.datasource.url
foi acrescentada a?serverTimezone=UTC
para instruir o driver JDBC a usar o formato de data UTC (Tempo Universal Coordenado) ao conectar-se ao banco de dados. Sem esse parâmetro, seu servidor Java não usaria o mesmo formato de data que o banco de dados, o que resultaria em um erro.
Crie o arquivo de configuração src/main/resources/schema.sql para configurar o esquema do banco de dados e adicione o conteúdo a seguir.
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Crie uma nova classe Java
Todo
. Essa classe é um modelo de domínio mapeado para a tabelatodo
que será criado automaticamente pelo Spring Boot. O código a seguir ignora os métodosgetters
esetters
.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; }
Edite o arquivo de classe de inicialização para mostrar o conteúdo a seguir.
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> { }
Dica
Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a conexão com os serviços do Azure requer autenticação. Para concluir a autenticação, você precisa usar a Identidade do Azure. O Azure Spring Cloud usa
DefaultAzureCredential
, que a biblioteca Azure Identity fornece para ajudá-lo a obter credenciais sem nenhuma alteração de código.DefaultAzureCredential
dá suporte a vários métodos de autenticação e determina qual método usar no runtime. Essa abordagem habilita seu aplicativo a usar diferentes métodos de autenticação em diferentes ambientes, como ambientes locais e de produção, sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.Para concluir a autenticação em ambientes de desenvolvimento locais, você pode usar a CLI do Azure, o Visual Studio Code, o PowerShell ou outros métodos. Para obter mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para concluir a autenticação em ambientes de hospedagem do Azure, recomendamos o uso de identidade gerenciada atribuída pelo usuário. Para obter mais informações, confira O que são as identidades gerenciadas para recursos do Azure?
Inicie o aplicativo. O aplicativo armazena dados no banco de dados. Você verá logs semelhantes ao seguinte exemplo:
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
Implantar no Azure Spring Apps
Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para produção. Os Aplicativos Spring do Azure facilita a implantação de aplicativos Spring Boot no Azure sem nenhuma alteração no código. O serviço gerencia a infraestrutura dos aplicativos do Spring para que os desenvolvedores possam se concentrar no código. O Azure Spring Apps fornece gerenciamento de ciclo de vida usando monitoramento e diagnóstico abrangentes, gerenciamento de configuração, descoberta de serviços, integração de CI/CD, implantações em “blue-green” e muito mais. Para implantar seu aplicativo nos Aplicativos Spring do Azure, consulte Implantar seu primeiro aplicativo nos Aplicativos Spring do Azure.