Compartir vía


Uso de Spring Data JPA con Azure Database for MySQL

En este tutorial se muestra cómo almacenar datos en Azure Database for MySQL base de datos mediante Spring Data JPA.

La API de persistencia de Java (JPA) es la API Java estándar para la asignación relacional de objetos.

En este tutorial, se incluyen dos métodos de autenticación: Microsoft Entra autenticación y autenticación mySQL. La pestaña Passwordless muestra la autenticación Microsoft Entra y la pestaña Password muestra la autenticación de MySQL.

La autenticación de Microsoft Entra es un mecanismo para conectarse a Azure Database para MySQL mediante identidades definidas en ID de Microsoft Entra. Con Microsoft Entra autenticación, puede administrar identidades de usuario de base de datos y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de permisos.

La autenticación de MySQL usa cuentas almacenadas en MySQL. Si decide usar contraseñas como credenciales para las cuentas, estas credenciales se almacenarán en la tabla . Dado que estas contraseñas se almacenan en MySQL, debe administrar la rotación de las contraseñas usted mismo.

Requisitos previos

  • Cliente de línea de comandos de MySQL.

  • Si no tiene una aplicación de Spring Boot, cree un proyecto de Maven con Spring Initializr. Asegúrese de seleccionar Maven Project y, en Dependencies, agregue el Spring Web, Spring Data JPA y MySQL Driver y seleccione Java versión 8 o superior.

Importante

Para usar conexiones sin contraseña, cree un usuario administrador de Microsoft Entra para la instancia de Azure Database for MySQL. Para obtener instrucciones, consulte la sección Configure the Microsoft Entra Admin de Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server.

Consulte la aplicación de ejemplo

En este tutorial, codificará una aplicación de ejemplo. Si desea ir más rápido, esta aplicación ya está codificada y disponible en https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Configuración de una regla de firewall para el servidor de MySQL

las instancias de Azure Database for MySQL están protegidas de forma predeterminada. Tienen un firewall que no permite ninguna conexión entrante.

Para poder usar la base de datos, abra el firewall del servidor para permitir que la dirección IP local acceda al servidor de base de datos. Para obtener más información, consulte Administrar reglas de firewall para Azure Database for MySQL: servidor flexible mediante el portal de Azure.

Si se conecta al servidor MySQL desde Subsistema de Windows para Linux (WSL) en un equipo de Windows, debe agregar la dirección IP del host WSL al firewall.

Creación de un usuario que no sea administrador de MySQL y concesión de permisos

Este paso creará un usuario que no sea administrador y le concederá todos los permisos de la base de datos .

  • Sin contraseña (recomendado)
  • Contraseña

Puede usar el método siguiente para crear un usuario que no sea administrador que use una conexión sin contraseña.

  • Service Connector (recomendado)
  • Configuración manual
  1. Use el comando siguiente para instalar la extensión sin contraseña Service Connector sin contraseña para el CLI de Azure:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Use el comando siguiente para crear el Microsoft Entra usuario que no es administrador:

      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
    

    Cuando finalice el comando, anote el nombre de usuario en la salida de la consola.

Almacenar datos de Azure Database for MySQL

Ahora que tiene una instancia de servidor flexible de Azure Database for MySQL, puede almacenar datos mediante Spring Cloud Azure.

Para instalar el módulo JDBC MySQL de Spring Cloud Azure Starter, agregue las siguientes dependencias al archivo pom.xml:

  • La Lista de Materiales (BOM) de Spring Cloud Azure:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.0.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota:

    Si usa Spring Boot 4.0.x, asegúrese de establecer la versión en .

    Si está usando Spring Boot 3.5.x, asegúrese de establecer la versión en .

    Si usa Spring Boot 3.1.x-3.5.x, asegúrese de establecer la versión en .

    Si usa Spring Boot 2.x, asegúrese de establecer la versión de en .

    Esta lista de materiales (BOM) debe configurarse en la sección del archivo pom.xml . Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión.

    Para obtener más información sobre la versión usada para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debería usar.

  • El artefacto JDBC MySQL de Spring Cloud Azure Starter:

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

Nota:

Se admiten conexiones sin contraseña desde la versión .

Configuración de Spring Boot para usar Azure Database for MySQL

Para almacenar datos de Azure Database for MySQL mediante Spring Data JPA, siga estos pasos para configurar la aplicación:

  1. Configure las credenciales de Azure Database for MySQL agregando las siguientes propiedades al archivo de configuración application.properties.

    • Sin contraseña (recomendado)
    • Contraseña
    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
    

    Advertencia

    La propiedad de configuración tiene anexado para indicar al controlador de JDBC que use el formato de fecha UTC (hora universal coordinada) al conectarse a la base de datos. Sin este parámetro, el servidor Java no usaría el mismo formato de fecha que la base de datos, lo que provocaría un error.

Importante

Para usar conexiones sin contraseña, cree un usuario administrador de Microsoft Entra para la instancia de Azure Database for MySQL. Para obtener instrucciones, consulte la sección Setting the Microsoft Entra Admin user de Use Microsoft Entra ID para la autenticación con MySQL.

Consulte la aplicación de ejemplo

En este artículo, se codificará una aplicación de ejemplo. Si desea ir más rápido, esta aplicación ya está codificada y disponible en https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

Configuración de una regla de firewall para el servidor de MySQL

las instancias de Azure Database for MySQL están protegidas de forma predeterminada. Tienen un firewall que no permite ninguna conexión entrante.

Para poder usar la base de datos, abra el firewall del servidor para permitir que la dirección IP local acceda al servidor de base de datos. Para obtener más información, consulte Crear y gestionar las reglas de firewall de Azure Database para MySQL usando el portal de Azure.

Si se conecta al servidor MySQL desde Subsistema de Windows para Linux (WSL) en un equipo de Windows, debe agregar la dirección IP del host WSL al firewall.

Creación de un usuario que no sea administrador de MySQL y concesión de permisos

Este paso creará un usuario que no sea administrador y le concederá todos los permisos de la base de datos .

  • Sin contraseña (recomendado)
  • Contraseña

Importante

Para usar conexiones sin contraseña, cree un usuario administrador de Microsoft Entra para la instancia de Azure Database for MySQL. Para obtener más información, consulte la sección Setting the Microsoft Entra Admin user de Use Microsoft Entra ID para la autenticación con MySQL.

Cree un script SQL denominado create_ad_user.sql para crear un usuario que no sea administrador. Agregue el siguiente contenido y guárdelo de forma local:

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

A continuación, use el siguiente comando para ejecutar el script SQL para crear el Microsoft Entra usuario que no es administrador:

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

Sugerencia

Para usar Microsoft Entra autenticación para conectarse a Azure Database for MySQL, debe iniciar sesión con el usuario administrador de Microsoft Entra que configuró y, a continuación, obtener el token de acceso como contraseña. Para obtener más información, consulte Use Microsoft Entra ID para la autenticación con MySQL.

Almacenar datos de Azure Database for MySQL

Ahora que tiene una instancia de Azure Database for MySQL servidor único, puede almacenar datos mediante Spring Cloud Azure.

Para instalar el módulo JDBC MySQL de Spring Cloud Azure Starter, agregue las siguientes dependencias al archivo pom.xml:

  • La Lista de Materiales (BOM) de Spring Cloud Azure:

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.0.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota:

    Si usa Spring Boot 4.0.x, asegúrese de establecer la versión en .

    Si está usando Spring Boot 3.5.x, asegúrese de establecer la versión en .

    Si usa Spring Boot 3.1.x-3.5.x, asegúrese de establecer la versión en .

    Si usa Spring Boot 2.x, asegúrese de establecer la versión de en .

    Esta lista de materiales (BOM) debe configurarse en la sección del archivo pom.xml . Esto garantiza que todas las dependencias de Spring Cloud Azure usen la misma versión.

    Para obtener más información sobre la versión usada para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debería usar.

  • El artefacto JDBC MySQL de Spring Cloud Azure Starter:

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

Nota:

Se admiten conexiones sin contraseña desde la versión .

Configuración de Spring Boot para usar Azure Database for MySQL

Para almacenar datos de Azure Database for MySQL mediante Spring Data JPA, siga estos pasos para configurar la aplicación:

  1. Configure las credenciales de Azure Database for MySQL agregando las siguientes propiedades al archivo de configuración application.properties.

    • Sin contraseña (recomendado)
    • Contraseña
    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
    

    Advertencia

    La propiedad de configuración tiene anexado para indicar al controlador de JDBC que use el formato de fecha UTC (hora universal coordinada) al conectarse a la base de datos. Sin este parámetro, el servidor Java no usaría el mismo formato de fecha que la base de datos, lo que provocaría un error.

  1. Cree una nueva clase Todo Java. Esta clase es un modelo de dominio asignado en la tabla , que se creará automáticamente mediante JPA. El siguiente código ignora los métodos y .

    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 el archivo de clase de inicio para mostrar el siguiente contenido.

    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> {
    
    }
    

    Sugerencia

    En este tutorial, no hay ninguna operación de autenticación en las configuraciones ni en el código. Sin embargo, la conexión a Azure servicios requiere autenticación. Para completar la autenticación, debe usar Azure Identity. Spring Cloud Azure usa DefaultAzureCredential, que la biblioteca Azure Identity proporciona para ayudarle a obtener credenciales sin cambios en el código.

    admite varios métodos de autenticación y determina qué método se usa en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos, como entornos locales o de producción, sin implementar código específico del entorno. Para obtener más información, consulte DefaultAzureCredential.

    Para completar la autenticación en entornos de desarrollo local, puede usar CLI de Azure, Visual Studio Code, PowerShell u otros métodos. Para obtener más información, consulte la autenticación de Azure en entornos de desarrollo de Java. Para completar la autenticación en Azure entornos de hospedaje, se recomienda usar la identidad administrada asignada por el usuario. Para obtener más información, consulte ¿Qué son las identidades administradas para los recursos de Azure?

  3. Inicie la aplicación. Verá registros similares a los del siguiente ejemplo:

    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
    

Implementación en Azure Spring Apps

Ahora que tiene la aplicación Spring Boot que se ejecuta localmente, es el momento de moverla a producción. Azure Spring Apps facilita la implementación de aplicaciones de Spring Boot en Azure sin cambios en el código. El servicio administra la infraestructura de las aplicaciones de Spring, con el fin de que los desarrolladores puedan centrarse en el código. Azure Spring Apps proporciona administración del ciclo de vida mediante supervisión y diagnósticos completos, administración de configuración, detección de servicios, integración de CI/CD, implementaciones azul-verde, etc. Para implementar la aplicación en Azure Spring Apps, consulte Implementación de la primera aplicación en Azure Spring Apps.

Pasos siguientes