Share via


Usar o Spring Data JPA com o Banco de Dados do Azure para MySQL

Este tutorial demonstra como armazenar dados no Banco de Dados do Azure para banco de dados MySQL usando o Spring Data JPA.

A Java Persistence API (JPA) é a API Java padrão para mapeamento objeto-relacional.

Neste tutorial, incluímos dois métodos de autenticação: autenticação Microsoft Entra e autenticação 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 se conectar ao Banco de Dados do Azure para MySQL usando identidades definidas na ID do Microsoft Entra. Com a autenticação do Microsoft Entra, você pode gerenciar identidades de usuário de banco de dados e outros serviços da Microsoft em um local central, o que simplifica o gerenciamento de permissões.

A autenticação MySQL usa contas armazenadas no MySQL. Se você optar por usar senhas como credenciais para as contas, essas credenciais serão armazenadas na user tabela. Como essas senhas são armazenadas no MySQL, você precisa gerenciar a rotação das senhas por conta própria.

Pré-requisitos

  • Cliente de linha de comando MySQL.

  • Se você não tiver um aplicativo Spring Boot, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Projeto Maven e, em Dependências, adicione as dependências Spring Web, Spring Data JPA e MySQL Driver e, em seguida, selecione Java versão 8 ou superior.

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 instruções, consulte a seção Configurar o Microsoft Entra Admin de Configurar a autenticação do Microsoft Entra para o Banco de Dados do Azure para MySQL - Servidor Flexível.

Veja o aplicativo de exemplo

Neste tutorial, você codificará um aplicativo de exemplo. Se você quiser ir mais rápido, este aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jpa-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. O serviço tem uma firewall que não permite ligações 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, consulte Gerenciar regras de firewall para o Banco de Dados do Azure para MySQL - Servidor flexível usando o portal do Azure.

Se você estiver se conectando ao seu servidor MySQL a partir do Windows Subsystem for Linux (WSL) em um computador Windows, você precisará adicionar o endereço IP do host WSL ao seu firewall.

Crie um usuário não-administrador do MySQL e conceda permissão

Esta etapa criará um usuário não administrador e concederá todas as permissões no demo banco de dados 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.

  1. Use o seguinte comando para instalar a extensão sem senha do Service Connector para a CLI do Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. 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 flexível do Banco de Dados do Azure para MySQL, pode armazenar dados usando o Spring Cloud Azure.

Para instalar o módulo Spring Cloud Azure Starter JDBC MySQL, adicione as seguintes dependências ao seu 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.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota

    Se estiver a utilizar o Spring Boot 2.x, certifique-se de que define a spring-cloud-azure-dependencies versão como 4.18.0. Esta lista de materiais (BOM) deve ser configurada na <dependencyManagement> seção do seu arquivo de pom.xml . Isso garante que todas as dependências do Spring Cloud Azure estejam usando a mesma versão. Para obter mais informações sobre a versão usada para essa lista técnica, consulte Qual versão do Spring Cloud Azure devo usar.

  • O artefato Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Nota

Conexões sem senha são suportadas desde a versão 4.5.0.

Configurar o Spring Boot para utilizar a Base de Dados do Azure para MySQL

Para armazenar dados do Banco de Dados do Azure para MySQL usando o Spring Data JPA, siga estas etapas para configurar o aplicativo:

  1. Configure o Banco de Dados do Azure para credenciais MySQL adicionando as seguintes propriedades ao seu arquivo de configuração application.properties .

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Aviso

    A propriedade spring.datasource.url configuration foi ?serverTimezone=UTC acrescentada para informar ao driver JDBC para usar o formato de data UTC (ou Tempo Universal Coordenado) ao se conectar ao banco de dados. Sem esse parâmetro, seu servidor Java não usaria o mesmo formato de data do banco de dados, o que resultaria em um erro.

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 instruções, consulte a seção Definindo o usuário Microsoft Entra Admin de Usar o Microsoft Entra ID para autenticação com MySQL.

Veja o aplicativo de exemplo

Neste artigo, você codificará um aplicativo de exemplo. Se você quiser ir mais rápido, este aplicativo já está codificado e disponível em https://github.com/Azure-Samples/quickstart-spring-data-jpa-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. O serviço tem uma firewall que não permite ligações 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, consulte Criar e gerenciar o Banco de Dados do Azure para regras de firewall do MySQL usando o portal do Azure.

Se você estiver se conectando ao seu servidor MySQL a partir do Windows Subsystem for Linux (WSL) em um computador Windows, você precisará adicionar o endereço IP do host WSL ao seu firewall.

Crie um usuário não-administrador do MySQL e conceda permissão

Esta etapa criará um usuário não administrador e concederá todas as permissões no demo banco de dados 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 Definindo o usuário administrador do Microsoft Entra em Usar o Microsoft Entra ID para autenticação com 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 para 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

Gorjeta

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 senha. Para obter mais informações, consulte Usar o Microsoft Entra ID para autenticação com MySQL.

Armazenar dados do Banco de Dados do Azure para MySQL

Agora que você tem um Banco de Dados do Azure para instância do Servidor Único MySQL, pode armazenar dados usando o Spring Cloud Azure.

Para instalar o módulo Spring Cloud Azure Starter JDBC MySQL, adicione as seguintes dependências ao seu 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.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota

    Se estiver a utilizar o Spring Boot 2.x, certifique-se de que define a spring-cloud-azure-dependencies versão como 4.18.0. Esta lista de materiais (BOM) deve ser configurada na <dependencyManagement> seção do seu arquivo de pom.xml . Isso garante que todas as dependências do Spring Cloud Azure estejam usando a mesma versão. Para obter mais informações sobre a versão usada para essa lista técnica, consulte Qual versão do Spring Cloud Azure devo usar.

  • O artefato Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Nota

Conexões sem senha são suportadas desde a versão 4.5.0.

Configurar o Spring Boot para utilizar a Base de Dados do Azure para MySQL

Para armazenar dados do Banco de Dados do Azure para MySQL usando o Spring Data JPA, siga estas etapas para configurar o aplicativo:

  1. Configure o Banco de Dados do Azure para credenciais MySQL adicionando as seguintes propriedades ao seu arquivo de configuração application.properties .

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    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.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Aviso

    A propriedade spring.datasource.url configuration foi ?serverTimezone=UTC acrescentada para informar ao driver JDBC para usar o formato de data UTC (ou Tempo Universal Coordenado) ao se conectar ao banco de dados. Sem esse parâmetro, seu servidor Java não usaria o mesmo formato de data do banco de dados, o que resultaria em um erro.

  1. Crie uma nova Todo classe Java. Esta classe é um modelo de domínio mapeado todo na tabela que será criado automaticamente pela JPA. O código a seguir ignora os getters métodos e setters .

    package com.example.demo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Edite o arquivo de classe de inicialização para mostrar o seguinte conteúdo.

    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.jpa.repository.JpaRepository;
    
    import java.util.stream.Collectors;
    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)).collect(Collectors.toList()))
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    

    Gorjeta

    Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, conectar-se aos serviços do Azure requer autenticação. Para concluir a autenticação, você precisa usar a Identidade do Azure. O Spring Cloud Azure usa DefaultAzureCredentialo , que a biblioteca de Identidades do Azure fornece para ajudá-lo a obter credenciais sem alterações de código.

    DefaultAzureCredential Suporta vários métodos de autenticação e determina qual método usar em tempo de execução. Essa abordagem permite que seu aplicativo use diferentes métodos de autenticação em ambientes diferentes (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 local, 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 da identidade gerenciada atribuída pelo usuário. Para obter mais informações, consulte O que são identidades gerenciadas para recursos do Azure?

  3. Inicie a aplicação. Você verá logs semelhantes ao exemplo a seguir:

    2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.example.demo.Todo@1f
    

Implantar no Azure Spring Apps

Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para a produção. O Azure Spring Apps facilita a implantação de aplicativos Spring Boot no Azure sem alterações de código. O serviço gerencia a infraestrutura dos aplicativos Spring para que os desenvolvedores possam se concentrar em seu código. O Azure Spring Apps fornece gerenciamento do ciclo de vida usando monitoramento e diagnóstico abrangentes, gerenciamento de configuração, descoberta de serviços, integração de CI/CD, implantações azul-verde e muito mais. Para implantar seu aplicativo no Azure Spring Apps, consulte Implantar seu primeiro aplicativo no Azure Spring Apps.

Próximos passos