Używanie języka Java i funkcji JDBC z usługą Azure SQL Database
Dotyczy: 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
- Konto Azure. Jeśli go nie masz, skorzystaj z bezpłatnej wersji próbnej.
- Azure Cloud Shell lub interfejs wiersza polecenia platformy Azure. Zalecamy usługę Azure Cloud Shell, aby móc logować się automatycznie i mieć dostęp do wszystkich potrzebnych narzędzi.
- Obsługiwany zestaw Java Development Kit w wersji 8 (dołączony do usługi Azure Cloud Shell).
- Narzędzie kompilacji Apache Maven.
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ć regioneastus
, ale zalecamy skonfigurowanie regionu bliżej Twojego miejsca zamieszkania. Możesz mieć pełną listę dostępnych regionów, wprowadzając polecenieaz 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ń.
Utwórz bazę danych
Pierwszą rzeczą, którą utworzymy, jest zarządzany serwer logiczny dla 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 logiczny dla bazy danych.
Konfigurowanie reguły zapory dla serwera
Usługa Azure SQL Database jest domyślnie zabezpieczona, ponieważ ma 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
Utworzony wcześniej serwer 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 zawierający:
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 schema.sql utworzonych 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 zamapowanym na tabelę todo
utworzoną podczas wykonywania skryptu schema.sql .
Wstawianie danych
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
Odczyt danych
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
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
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