Uso de Spring Data JDBC con Azure Database for MySQL
En este tutorial se muestra cómo almacenar datos en la base de datos de Azure Database for MySQL mediante Spring Data JDBC.
JDBC es la API de Java estándar para conectarse a las bases de datos relacionales tradicionales.
En este tutorial, incluimos dos métodos de autenticación: la autenticación de Microsoft Entra y la autenticación MySQL. La pestaña Sin contraseña muestra la autenticación de Microsoft Entra y la pestaña Contraseña muestra la autenticación de MySQL.
La autenticación de Microsoft Entra es un mecanismo de conexión a Azure Database for MySQL mediante identidades definidas en Microsoft Entra ID. Con la autenticación de Microsoft Entra, puede administrar las identidades de los usuarios de la base de datos y otros servicios de Microsoft en una ubicación central, lo que simplifica la administración de los 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 user
. Dado que estas contraseñas se almacenan en MySQL, debe administrar la rotación de las contraseñas usted mismo.
Requisitos previos
Una suscripción a Azure: cree una cuenta gratuita.
Kit de desarrollo de Java (JDK), versión 8 o posterior.
Si no tiene ninguna aplicación de Spring Boot, cree un proyecto de Maven con Spring Initializr. Asegúrese de seleccionar Proyecto de Maven y, en Dependencias, agregue las dependencias Web de Spring, Spring Data JDBC y Controlador MySQL y, a continuación, seleccione Java versión 8 o posterior.
- Si no tiene ninguna, cree una instancia de servidor flexible de Azure Database for MySQL llamada
mysqlflexibletest
. Para obtener instrucciones, consulte Inicio rápido: Uso de Azure Portal para crear un servidor flexible de Azure Database for MySQL. A continuación, cree una base de datos denominadademo
. Para obtener instrucciones, consulte Creación y administración de bases de datos para el servidor flexible de Azure Database for MySQL.
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-jdbc-mysql.
Configuración de una regla de firewall para el servidor de MySQL
De forma predeterminada, las instancias de Azure Database for MySQL están protegidas. 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 Administración de reglas de firewall para Azure Database for MySQL - Servidor flexible mediante Azure Portal.
Si se conecta al servidor de MySQL desde el subsistema de Windows para Linux (WSL) en un equipo Windows, debe agregar la dirección IP de host de 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 demo
.
Puede usar el método siguiente para crear un usuario que no sea administrador que use una conexión sin contraseña.
Use el siguiente comando para instalar la extensión sin contraseña de Service Connector para la CLI de Azure:
az extension add --name serviceconnector-passwordless --upgrade
Use el siguiente comando para crear el usuario no administrador de 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
Cuando finalice el comando, anote el nombre de usuario en la salida de la consola.
Almacenamiento de 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 Spring Cloud Azure Starter JDBC MySQL, agregue las siguientes dependencias al archivo pom.xml :
La lista de materiales (BOM) de Azure de 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>
Nota:
Si usa Spring Boot 2.x, asegúrese de establecer la versión de
spring-cloud-azure-dependencies
en4.19.0
. Esta lista de materiales (BOM) debe configurarse en la sección<dependencyManagement>
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 que se usa para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debo usar.El artefacto de Spring Cloud Azure Starter JDBC MySQL:
<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 4.5.0
.
Configuración de Spring Boot para el uso de Azure Database for MySQL
Para almacenar datos de Azure Database for MySQL mediante Spring Data JDBC, siga estos pasos para configurar la aplicación:
Configure las credenciales de Azure Database for MySQL agregando las siguientes propiedades al archivo de configuración 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
Advertencia
La propiedad de configuración
spring.sql.init.mode=always
significa que, cada vez que se inicie el servidor, Spring Boot generará automáticamente un esquema de base de datos con el archivo schema.sql que crearemos más adelante. Esta función es excelente para las pruebas, pero recuerde que se eliminarán los datos en cada reinicio, por lo que no debe usarse en producción.La propiedad de configuración
spring.datasource.url
tiene anexado?serverTimezone=UTC
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, y daría lugar a un error.
- Si no tiene ninguna, cree una instancia de servidor único de Azure Database for MySQL llamada
mysqlsingletest
. Para obtener instrucciones, consulte Inicio rápido: Creación de un servidor de Azure Database for MySQL con Azure Portal. A continuación, cree una base de datos denominadademo
. Para obtener instrucciones, consulte la sección Creación de una base de datos de Creación de usuarios en Azure Database for 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-jdbc-mysql.
Configuración de una regla de firewall para el servidor de MySQL
De forma predeterminada, las instancias de Azure Database for MySQL están protegidas. 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 Creación y administración de reglas de firewall de Azure Database for MySQL mediante Azure Portal.
Si se conecta al servidor de MySQL desde el subsistema de Windows para Linux (WSL) en un equipo Windows, debe agregar la dirección IP de host de 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 demo
.
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 Configuración del usuario administrador de Microsoft Entra de Uso de 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 usuario que no es administrador de 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
Sugerencia
Para usar la autenticación de Microsoft Entra 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 Uso de Microsoft Entra ID para la autenticación con MySQL.
Almacenamiento de datos de Azure Database for MySQL
Ahora que tiene una instancia de servidor único de Azure Database for MySQL, puede almacenar datos mediante Spring Cloud Azure.
Para instalar el módulo Spring Cloud Azure Starter JDBC MySQL, agregue las siguientes dependencias al archivo pom.xml :
La lista de materiales (BOM) de Azure de 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>
Nota:
Si usa Spring Boot 2.x, asegúrese de establecer la versión de
spring-cloud-azure-dependencies
en4.19.0
. Esta lista de materiales (BOM) debe configurarse en la sección<dependencyManagement>
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 que se usa para esta lista de materiales, consulte Qué versión de Spring Cloud Azure debo usar.El artefacto de Spring Cloud Azure Starter JDBC MySQL:
<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 4.5.0
.
Configuración de Spring Boot para el uso de Azure Database for MySQL
Para almacenar datos de Azure Database for MySQL mediante Spring Data JDBC, siga estos pasos para configurar la aplicación:
Configure las credenciales de Azure Database for MySQL agregando las siguientes propiedades al archivo de configuración 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
Advertencia
La propiedad de configuración
spring.sql.init.mode=always
significa que, cada vez que se inicie el servidor, Spring Boot generará automáticamente un esquema de base de datos con el archivo schema.sql que crearemos más adelante. Esta función es excelente para las pruebas, pero recuerde que se eliminarán los datos en cada reinicio, por lo que no debe usarse en producción.La propiedad de configuración
spring.datasource.url
tiene anexado?serverTimezone=UTC
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, y daría lugar a un error.
Cree el archivo de configuración src/main/resources/schema.sql para configurar el esquema de la base de datos y agregue el siguiente contenido.
DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Cree una clase nueva de Java
Todo
. Esta clase es un modelo de dominio asignado en la tablatodo
, que se creará automáticamente mediante Spring Boot. El siguiente código ignora los métodosgetters
ysetters
.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 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.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> { }
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 los servicios de Azure requiere autenticación. Para completar la autenticación, debe usar Azure Identity. Spring Cloud Azure usa
DefaultAzureCredential
, que la biblioteca de Azure Identity proporciona para ayudarle a obtener credenciales sin cambios en el código.DefaultAzureCredential
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, vea DefaultAzureCredential.Para completar la autenticación en entornos de desarrollo local, puede usar la CLI de Azure, Visual Studio Code, PowerShell u otros métodos. Para obtener más información, consulte Autenticación de Azure en entornos de desarrollo de Java. Para completar la autenticación en entornos de hospedaje de Azure, se recomienda usar la identidad administrada asignada por el usuario. Para obtener más información, consulta ¿Qué son las identidades administradas para recursos de Azure?
Inicie la aplicación. La aplicación almacena datos en la base de datos. Verá registros similares a los del siguiente ejemplo:
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
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 necesidad de realizar 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 el uso de una supervisión y un diagnóstico completos, administración de la configuración, detección de servicios, integración de CI/CD e implementaciones azul-verde, entre otros. Para implementar la aplicación en Azure Spring Apps, consulte Implementación de la primera aplicación en Azure Spring Apps.