Używanie języka Java i funkcji JDBC z usługą Azure SQL Database

W tym temacie przedstawiono tworzenie przykładowej aplikacji, która używa języka Java i JDBC do przechowywania i pobierania informacji w usłudze Azure SQL Database.

JDBC to standardowy interfejs API języka Java do łączenia się z tradycyjnymi relacyjnymi bazami danych.

Wymagania wstępne

Przygotowywanie środowiska roboczego

Użyjemy zmiennych środowiskowych, aby ograniczyć błędy wpisywania i ułatwić dostosowanie następującej konfiguracji pod kątem konkretnych potrzeb.

Skonfiguruj te zmienne środowiskowe przy użyciu następujących poleceń:

AZ_RESOURCE_GROUP=database-workshop
AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
AZ_LOCATION=<YOUR_AZURE_REGION>
AZ_SQL_SERVER_USERNAME=demo
AZ_SQL_SERVER_PASSWORD=<YOUR_AZURE_SQL_PASSWORD>
AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>

Zastąp symbole zastępcze następującymi wartościami, które są używane w tym artykule:

  • <YOUR_DATABASE_NAME>: nazwa serwera usługi Azure SQL Database. Powinna być ona unikatowa w obrębie platformy Azure.
  • <YOUR_AZURE_REGION>: region platformy Azure, którego będziesz używać. Możesz domyślnie zastosować region eastus, ale zalecamy skonfigurowanie regionu bliżej Twojego miejsca zamieszkania. Możesz mieć pełną listę dostępnych regionów, wprowadzając polecenie az account list-locations.
  • <AZ_SQL_SERVER_PASSWORD>: hasło serwera usługi Azure SQL Database. To hasło powinno zawierać co najmniej osiem znaków. Znaki powinny pochodzić z trzech z następujących kategorii: wielkie litery angielskie, małe litery angielskie, cyfry (0–9) i znaki inne niż alfanumeryczne (!, $, #, %itd.).
  • <YOUR_LOCAL_IP_ADDRESS>: adres IP komputera lokalnego, z którego uruchomisz aplikację Java. Jednym z wygodnych sposobów znalezienia jest skierowanie przeglądarki do whatismyip.akamai.com.

Następnie utwórz grupę zasobów przy użyciu następującego polecenia:

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
    | jq

Uwaga

Używamy narzędzia do wyświetlania jq danych JSON i zwiększenia ich czytelnego. To narzędzie jest instalowane domyślnie w usłudze Azure Cloud Shell. Jeśli nie lubisz tego narzędzia, możesz bezpiecznie usunąć część | jq ze wszystkich poleceń.

Tworzenie wystąpienia usługi Azure SQL Database

Pierwszą rzeczą, którą utworzymy, jest zarządzany serwer usługi Azure SQL Database.

Uwaga

Więcej szczegółowych informacji na temat tworzenia serwerów usługi Azure SQL Database można znaleźć w przewodniku Szybki start: Tworzenie pojedynczej bazy danych usługi Azure SQL Database.

W usłudze Azure Cloud Shell uruchom następujące polecenie:

az sql server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --admin-user $AZ_SQL_SERVER_USERNAME \
    --admin-password $AZ_SQL_SERVER_PASSWORD \
    | jq

To polecenie tworzy serwer usługi Azure SQL Database.

Konfigurowanie reguły zapory dla serwera usługi Azure SQL Database

Wystąpienia usługi Azure SQL Database są domyślnie zabezpieczone. Ma ona zaporę, która nie zezwala na żadne połączenie przychodzące. Aby móc używać bazy danych, należy dodać regułę zapory, która umożliwi lokalnemu adresowi IP dostęp do serwera bazy danych.

Ponieważ skonfigurowano lokalny adres IP na początku tego artykułu, możesz otworzyć zaporę serwera, uruchamiając następujące polecenie:

az sql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    | jq

Konfigurowanie bazy danych Azure SQL Database

Utworzony wcześniej serwer usługi Azure SQL Database jest pusty. Nie ma żadnej bazy danych, której można używać z aplikacją Java. Utwórz nową bazę danych o nazwie demo , uruchamiając następujące polecenie:

az sql db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name demo \
    --server $AZ_DATABASE_NAME \
    | jq

Tworzenie nowego projektu Java

Używając ulubionego środowiska IDE, utwórz nowy projekt Java i dodaj pom.xml plik w katalogu głównym:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>12.4.2.jre11</version>
        </dependency>
    </dependencies>
</project>

Ten plik to apache Maven , który konfiguruje projekt do użycia:

  • Java 17
  • Najnowszy sterownik programu SQL Server dla języka Java

Przygotowywanie pliku konfiguracji do nawiązania połączenia z bazą danych Azure SQL Database

Utwórz plik src/main/resources/application.properties i dodaj:

url=jdbc:sqlserver://$AZ_DATABASE_NAME.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
user=demo@$AZ_DATABASE_NAME
password=$AZ_SQL_SERVER_PASSWORD
  • Zastąp dwie $AZ_DATABASE_NAME zmienne wartością skonfigurowaną na początku tego artykułu.
  • Zastąp zmienną $AZ_SQL_SERVER_PASSWORD wartością skonfigurowaną na początku tego artykułu.

Tworzenie pliku SQL w celu wygenerowania schematu bazy danych

Użyjemy pliku src/main/resources/schema.sql w celu utworzenia schematu bazy danych. Utwórz ten plik z następującą zawartością:

DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id INT PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);

Kodowanie aplikacji

Łączenie z bazą danych

Następnie dodaj kod Java, który będzie używać narzędzia JDBC do przechowywania i pobierania danych z bazy danych Azure SQL Database.

Utwórz plik src/main/java/com/example/demo/DemoApplication.java , który zawiera:

package com.example.demo;

import java.sql.*;
import java.util.*;
import java.util.logging.Logger;

public class DemoApplication {

    private static final Logger log;

    static {
        System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n");
        log =Logger.getLogger(DemoApplication.class.getName());
    }

    public static void main(String[] args) throws Exception {
        log.info("Loading application properties");
        Properties properties = new Properties();
        properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));

        log.info("Connecting to the database");
        Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);
        log.info("Database connection test: " + connection.getCatalog());

        log.info("Create database schema");
        Scanner scanner = new Scanner(DemoApplication.class.getClassLoader().getResourceAsStream("schema.sql"));
        Statement statement = connection.createStatement();
        while (scanner.hasNextLine()) {
            statement.execute(scanner.nextLine());
        }

        /*
        Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
        insertData(todo, connection);
        todo = readData(connection);
        todo.setDetails("congratulations, you have updated data!");
        updateData(todo, connection);
        deleteData(todo, connection);
        */

        log.info("Closing database connection");
        connection.close();
    }
}

Ten kod Java będzie używać pliku application.properties i plików schema.sql , które zostały utworzone wcześniej, w celu nawiązania połączenia z bazą danych programu SQL Server i utworzenia schematu, który będzie przechowywać nasze dane.

W tym pliku widać, że skomentowaliśmy metody wstawiania, odczytywania, aktualizowania i usuwania danych: zakodujemy te metody w pozostałej części tego artykułu i będzie można usunąć komentarz po sobie.

Uwaga

Poświadczenia bazy danych są przechowywane we właściwościach użytkownika i hasła pliku application.properties. Te poświadczenia są używane podczas wykonywania DriverManager.getConnection(properties.getProperty("url"), properties);polecenia , ponieważ plik właściwości jest przekazywany jako argument.

Teraz możesz wykonać tę klasę główną za pomocą ulubionego narzędzia:

  • Za pomocą środowiska IDE powinno być możliwe kliknięcie prawym przyciskiem myszy klasy DemoApplication i wykonanie go.
  • Za pomocą narzędzia Maven możesz uruchomić aplikację, wykonując polecenie: mvn package exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Aplikacja powinna nawiązać połączenie z usługą Azure SQL Database, utworzyć schemat bazy danych, a następnie zamknąć połączenie, jak pokazano w dziennikach konsoli:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Closing database connection 

Tworzenie klasy domeny

Utwórz nową Todo klasę Java obok DemoApplication klasy i dodaj następujący kod:

package com.example.demo;

public class Todo {

    private Long id;
    private String description;
    private String details;
    private boolean done;

    public Todo() {
    }

    public Todo(Long id, String description, String details, boolean done) {
        this.id = id;
        this.description = description;
        this.details = details;
        this.done = done;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }

    @Override
    public String toString() {
        return "Todo{" +
                "id=" + id +
                ", description='" + description + '\'' +
                ", details='" + details + '\'' +
                ", done=" + done +
                '}';
    }
}

Ta klasa jest modelem domeny mapowanym na tabelę todo utworzoną podczas wykonywania skryptu schema.sql .

Wstawianie danych do bazy danych Azure SQL Database

W pliku src/main/java/DemoApplication.java po metodzie main dodaj następującą metodę, aby wstawić dane do bazy danych:

private static void insertData(Todo todo, Connection connection) throws SQLException {
    log.info("Insert data");
    PreparedStatement insertStatement = connection
            .prepareStatement("INSERT INTO todo (id, description, details, done) VALUES (?, ?, ?, ?);");

    insertStatement.setLong(1, todo.getId());
    insertStatement.setString(2, todo.getDescription());
    insertStatement.setString(3, todo.getDetails());
    insertStatement.setBoolean(4, todo.isDone());
    insertStatement.executeUpdate();
}

Teraz możesz usunąć komentarz z dwóch następujących wierszy w metodzie main :

Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
insertData(todo, connection);

Wykonanie klasy głównej powinno teraz wygenerować następujące dane wyjściowe:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Closing database connection

Odczytywanie danych z bazy danych Azure SQL Database

Przeczytajmy wcześniej wstawione dane, aby sprawdzić, czy nasz kod działa poprawnie.

W pliku src/main/java/DemoApplication.java po metodzie insertData dodaj następującą metodę, aby odczytać dane z bazy danych:

private static Todo readData(Connection connection) throws SQLException {
    log.info("Read data");
    PreparedStatement readStatement = connection.prepareStatement("SELECT * FROM todo;");
    ResultSet resultSet = readStatement.executeQuery();
    if (!resultSet.next()) {
        log.info("There is no data in the database!");
        return null;
    }
    Todo todo = new Todo();
    todo.setId(resultSet.getLong("id"));
    todo.setDescription(resultSet.getString("description"));
    todo.setDetails(resultSet.getString("details"));
    todo.setDone(resultSet.getBoolean("done"));
    log.info("Data read from the database: " + todo.toString());
    return todo;
}

Teraz możesz usunąć komentarz z następującego wiersza w metodzie main :

todo = readData(connection);

Wykonanie klasy głównej powinno teraz wygenerować następujące dane wyjściowe:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Closing database connection 

Aktualizowanie danych w usłudze Azure SQL Database

Zaktualizujmy dane, które wcześniej wstawiliśmy.

Nadal w pliku src/main/java/DemoApplication.java po metodzie readData dodaj następującą metodę, aby zaktualizować dane wewnątrz bazy danych:

private static void updateData(Todo todo, Connection connection) throws SQLException {
    log.info("Update data");
    PreparedStatement updateStatement = connection
            .prepareStatement("UPDATE todo SET description = ?, details = ?, done = ? WHERE id = ?;");

    updateStatement.setString(1, todo.getDescription());
    updateStatement.setString(2, todo.getDetails());
    updateStatement.setBoolean(3, todo.isDone());
    updateStatement.setLong(4, todo.getId());
    updateStatement.executeUpdate();
    readData(connection);
}

Teraz możesz usunąć komentarz z dwóch następujących wierszy w metodzie main :

todo.setDetails("congratulations, you have updated data!");
updateData(todo, connection);

Wykonanie klasy głównej powinno teraz wygenerować następujące dane wyjściowe:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Update data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true} 
[INFO   ] Closing database connection 

Usuwanie danych w usłudze Azure SQL Database

Na koniec usuńmy wcześniej wstawione dane.

Nadal w pliku src/main/java/DemoApplication.java po metodzie updateData dodaj następującą metodę, aby usunąć dane wewnątrz bazy danych:

private static void deleteData(Todo todo, Connection connection) throws SQLException {
    log.info("Delete data");
    PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM todo WHERE id = ?;");
    deleteStatement.setLong(1, todo.getId());
    deleteStatement.executeUpdate();
    readData(connection);
}

Teraz możesz usunąć komentarz z następującego wiersza w metodzie main :

deleteData(todo, connection);

Wykonanie klasy głównej powinno teraz wygenerować następujące dane wyjściowe:

[INFO   ] Loading application properties 
[INFO   ] Connecting to the database 
[INFO   ] Database connection test: demo 
[INFO   ] Create database schema 
[INFO   ] Insert data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true} 
[INFO   ] Update data 
[INFO   ] Read data 
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true} 
[INFO   ] Delete data 
[INFO   ] Read data 
[INFO   ] There is no data in the database! 
[INFO   ] Closing database connection 

Podsumowanie i czyszczenie zasobów

Gratulacje! Utworzono aplikację Java, która używa narzędzia JDBC do przechowywania i pobierania danych z bazy danych Azure SQL Database.

Aby wyczyścić wszystkie zasoby używane w tym przewodniku Szybki start, usuń grupę zasobów przy użyciu następującego polecenia:

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes

Następne kroki