Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek ukazuje, jak vytvořit ukázkovou aplikaci, která používá Java a JDBC k ukládání a načítání informací v Azure HorizonDB (Preview).
JDBC je standardní rozhraní API Java pro připojení k tradičním relačním databázím.
Kroky v tomto článku zahrnují ověřování PostgreSQL.
Ověřování PostgreSQL používá účty uložené v PostgreSQL a potřebujete spravovat obměnu hesel sami.
Předpoklady
- Účet Azure. Pokud ho nemáte, můžete získat bezplatnou zkušební verzi.
- Azure Cloud Shell nebo Azure CLI. Použijte Azure Cloud Shell, abyste byli automaticky ověřeni a měli přístup ke všem nástrojům, které potřebujete.
- Podporovaná sada Java Development Kit verze 8 (součástí Cloud Shell).
- Nástroj pro sestavení Apache Maven .
Příprava pracovního prostředí
Nejprve pomocí následujícího příkazu nastavte některé proměnné prostředí.
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_CLUSTER_NAME=<YOUR_DATABASE_CLUSTER_NAME>
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_POSTGRESQL_ADMIN_USERNAME=demo
export AZ_POSTGRESQL_ADMIN_PASSWORD=<YOUR_POSTGRESQL_ADMIN_PASSWORD>
export AZ_POSTGRESQL_NON_ADMIN_USERNAME=demo-non-admin
export AZ_POSTGRESQL_NON_ADMIN_PASSWORD=<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
Zástupné symboly nahraďte následujícími hodnotami, které se používají v tomto článku:
-
<YOUR_DATABASE_CLUSTER_NAME>: Název vašeho clusteru Azure HorizonDB, který by měl být jedinečný v rámci vašeho předplatného Azure a skupiny prostředků. -
<YOUR_DATABASE_NAME>: Název databáze, který používáte v rámci clusteru Azure HorizonDB. -
<YOUR_AZURE_REGION>: Oblast Azure, která se má použít. Ve výchozím nastavení můžete používataustraliaeast, ale nastavte si oblast, která je blíže místu, kde žijete. Úplný seznam dostupných oblastí můžete zobrazit zadánímaz account list-locations. -
<YOUR_POSTGRESQL_ADMIN_PASSWORD>a<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>: Heslo clusteru Azure HorizonDB. Toto heslo by mělo mít minimálně osm znaků. Znaky by měly být ze tří z následujících kategorií: velká písmena anglické abecedy, malá písmena anglické abecedy, číslice (0–9) a neosamocené znaky (!, $, #, %atd.). -
<YOUR_LOCAL_IP_ADDRESS>: IP adresa místního počítače, ze kterého spouštíte aplikaci Spring Boot. Jedním z pohodlných způsobů, jak najít, je otevřít whatismyip.akamai.com.
Dále pomocí následujícího příkazu vytvořte skupinu prostředků:
az group create \
--name $AZ_RESOURCE_GROUP \
--location $AZ_LOCATION \
--output tsv
Vytvoření clusteru Azure HorizonDB
Note
Nezařazujte žádné osobní, citlivé ani důvěrné informace do názvů zdrojů (například název tabulky, databáze) ani do štítků zdrojů. Data, která zadáte do těchto polí, nejsou považována za zákaznická data.
Následující části popisují, jak vytvořit a nakonfigurovat databázový cluster.
Vytvoření clusteru Azure HorizonDB
Nastavení uživatele správce
Nejprve vytvořte spravovanou instanci Azure HorizonDB.
Note
Podrobnější informace o vytváření Azure HorizonDB najdete v tématu Vytvoření clusteru Azure HorizonDB.
az horizondb create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_CLUSTER_NAME \
--location $AZ_LOCATION \
--version 17 \
--administrator-login $AZ_POSTGRESQL_ADMIN_USERNAME \
--administrator-login-password $AZ_POSTGRESQL_ADMIN_PASSWORD \
--v-cores 2 \
--yes \
--output tsv
Tento příkaz vytvoří malý cluster Azure HorizonDB.
Máte nějaké problémy? Dejte nám vědět.
Nakonfigurujte pravidlo brány firewall pro vaši instanci Azure HorizonDB
Azure instance HorizonDB jsou ve výchozím nastavení zabezpečené. Mají bránu firewall, která blokuje všechna příchozí připojení. Chcete-li používat svou databázi, přidejte pravidlo brány firewall, které povolí přístup z vaší místní IP adresy k databázovému serveru.
Vzhledem k tomu, že jste na začátku tohoto článku nakonfigurovali místní IP adresu, můžete bránu firewall serveru otevřít spuštěním následujícího příkazu:
az horizondb firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--cluster-name $AZ_DATABASE_CLUSTER_NAME \
--firewall-rule-name $AZ_DATABASE_CLUSTER_NAME-database-allow-local-ip \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
--output tsv
Pokud se ke clusteru Azure HorizonDB připojujete z Subsystém Windows pro Linux (WSL) na počítači se systémem Windows, musíte do brány firewall přidat ID hostitele systému WSL.
Spuštěním následujícího příkazu ve WSL získejte IP adresu vašeho hostitelského počítače:
cat /etc/resolv.conf
Zkopírujte IP adresu, která následuje za termínem nameserver, a pak pomocí následujícího příkazu nastavte proměnnou prostředí pro IP adresu WSL:
AZ_WSL_IP_ADDRESS=<the-copied-IP-address>
Pak pomocí následujícího příkazu otevřete bránu firewall serveru pro vaši aplikaci založenou na WSL:
az horizondb firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--cluster-name $AZ_DATABASE_CLUSTER_NAME \
--firewall-rule-name $AZ_DATABASE_CLUSTER_NAME-database-allow-local-ip \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--output tsv
Vytvoření databáze Azure HorizonDB
Vytvořte skript SQL s názvem create_database.sql pro vytvoření nové databáze v clusteru. Přidejte následující obsah a soubor uložte místně:
cat << EOF > create_database.sql
CREATE DATABASE "$AZ_DATABASE_NAME";
EOF
Spuštěním tohoto příkazu získejte plně kvalifikovaný název domény Azure HorizonDB a zkopírujte hodnotu clusterName:
az horizondb show \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_CLUSTER_NAME \
--query "{clusterName:properties.fullyQualifiedDomainName, adminUser:properties.administratorLogin}" \
--output table
clusterName Zkopírujte hodnotu a použijte ji v následujícím příkazu:
AZ_HORIZONDB_FQDN=<the-copied-clusterName-value>
Potom spuštěním následujícího příkazu spusťte skript SQL a vytvořte databázi:
psql "host=$AZ_HORIZONDB_FQDN user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require" < create_database.sql
Teď spuštěním následujícího příkazu odstraňte dočasný soubor skriptu SQL:
rm create_database.sql
Vytvoření uživatele Azure HorizonDB bez oprávnění správce a udělení oprávnění
Dále vytvořte uživatele bez oprávnění správce a udělte databázi všechna oprávnění.
Vytvořte skript SQL s názvem create_user.sql a vytvořte uživatele bez oprávnění správce. Přidejte následující obsah a soubor uložte místně:
cat << EOF > create_user.sql
CREATE ROLE "$AZ_POSTGRESQL_NON_ADMIN_USERNAME" WITH LOGIN PASSWORD '$AZ_POSTGRESQL_NON_ADMIN_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO "$AZ_POSTGRESQL_NON_ADMIN_USERNAME";
EOF
Potom spuštěním následujícího příkazu spusťte skript SQL a vytvořte Microsoft Entra uživatele bez oprávnění správce:
psql "host=$AZ_HORIZONDB_FQDN user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require" < create_user.sql
Teď spuštěním následujícího příkazu odstraňte dočasný soubor skriptu SQL:
rm create_user.sql
Vytvoření nového projektu v Javě
Pomocí svého oblíbeného integrovaného vývojového prostředí (IDE) vytvořte nový projekt Java pomocí Java 8 nebo novějšího. Do kořenového adresáře přidejte souborpom.xml s následujícím obsahem:
<?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>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.3.6</version>
</dependency>
</dependencies>
</project>
Tento soubor je soubor Apache Maven , který konfiguruje váš projekt tak, aby používal:
- Java 8
- Nedávný ovladač PostgreSQL pro Javu
Příprava konfiguračního souboru pro připojení k Azure HorizonDB
Vytvořte soubor src/main/resources/application.properties a přidejte následující obsah:
cat << EOF > src/main/resources/application.properties
url=jdbc:postgresql://${AZ_HORIZONDB_FQDN}:5432/${AZ_DATABASE_NAME}?sslmode=require
user=${AZ_POSTGRESQL_NON_ADMIN_USERNAME}
password=${AZ_POSTGRESQL_NON_ADMIN_PASSWORD}
EOF
Note
Vlastnost url v konfiguraci zahrnuje ?sslmode=require, aby ovladač JDBC při připojování k databázi používal TLS (Transport Layer Security). Azure HorizonDB vyžaduje protokol TLS a jedná se o doporučený postup zabezpečení.
Vytvoření souboru SQL pro vygenerování schématu databáze
K vytvoření schématu databáze použijte soubor src/main/resources/schema.sql . Vytvořte tento soubor s následujícím obsahem:
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description text, details text, done BOOLEAN);
Kódování aplikace
Připojte se k databázi.
Dále přidejte kód Java, který používá JDBC k ukládání a načítání dat z vaší instance Azure HorizonDB.
Vytvořte soubor src/main/java/DemoApplication.java a přidejte následující obsah:
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();
}
}
Máte nějaké problémy? Dejte nám vědět.
Tento kód Java používá soubory application.properties a schema.sql, které jsme vytvořili dříve, pro připojení k instanci Azure HorizonDB a vytvoření schématu, které ukládá naše data.
V tomto souboru vidíte, že jsme okomentovali metody pro vložení, čtení, aktualizaci a odstranění dat: tyto metody zakódujeme ve zbývající části tohoto článku a jeden po druhém je budete moct odkomentovat.
Note
Přihlašovací údaje databáze jsou uloženy ve vlastnostech uživatele a hesla souboru application.properties. Tyto přihlašovací údaje se používají při provádění DriverManager.getConnection(properties.getProperty("url"), properties);, protože soubor vlastností se předává jako argument.
Teď můžete tuto hlavní třídu spustit pomocí svého oblíbeného nástroje:
- Pomocí integrovaného vývojového prostředí (IDE) byste měli být schopni kliknout pravým tlačítkem myši na třídu DemoApplication a spustit ji.
- Pomocí Mavenu můžete aplikaci spustit spuštěním příkazu:
mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".
Aplikace by se měla připojit k instanci Azure HorizonDB, vytvořit schéma databáze a pak připojení zavřít, jak byste měli vidět v protokolech konzoly:
[INFO ] Loading application properties
[INFO ] Connecting to the database
[INFO ] Database connection test: demo
[INFO ] Create database schema
[INFO ] Closing database connection
Vytvoření doménové třídy
Vytvořte novou Todo třídu Java vedle DemoApplication třídy a přidejte následující kód:
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 +
'}';
}
}
Tato třída je doménový model mapovaný na todo tabulku, kterou jste vytvořili při provádění skriptu schema.sql .
Vložení dat do Azure HorizonDB
Do souboru src/main/java/DemoApplication.java za hlavní metodu přidejte následující metodu pro vložení dat do databáze:
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();
}
Teď můžete zrušit komentář ke dvěma následujícím řádkům main v metodě:
Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
insertData(todo, connection);
Spuštění hlavní třídy by teď mělo vytvořit následující výstup:
[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
Čtení dat z Azure HorizonDB
Pojďme si přečíst dříve vložená data, abychom ověřili, že náš kód funguje správně.
Do souboru src/main/java/DemoApplication.java za metodu insertData přidejte následující metodu pro čtení dat z databáze:
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;
}
V metodě teď můžete odkomentovat následující řádek main
todo = readData(connection);
Spuštění hlavní třídy by teď mělo vytvořit následující výstup:
[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
Aktualizace dat v Azure HorizonDB
Pojďme aktualizovat data, která jsme předtím vložili.
Stále v souboru src/main/java/DemoApplication.java přidejte za metodu readData následující metodu pro aktualizaci dat uvnitř databáze:
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);
}
Teď můžete zrušit komentář ke dvěma následujícím řádkům main v metodě:
todo.setDetails("congratulations, you have updated data!");
updateData(todo, connection);
Spuštění hlavní třídy by teď mělo vytvořit následující výstup:
[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
Odstranění dat v Azure HorizonDB
Nakonec odstraníme data, která jsme vložili dříve.
Stále v souboru src/main/java/DemoApplication.java přidejte za metodu updateData následující metodu pro odstranění dat uvnitř databáze:
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);
}
V metodě teď můžete odkomentovat následující řádek main
deleteData(todo, connection);
Spuštění hlavní třídy by teď mělo vytvořit následující výstup:
[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
Vyčistěte zdroje
Gratulujeme! Vytvořili jste Java aplikaci, která používá JDBC k ukládání a načítání dat z instance Azure HorizonDB.
Pokud chcete vyčistit všechny prostředky použité během tohoto rychlého startu, odstraňte skupinu prostředků pomocí následujícího příkazu:
az group delete \
--name $AZ_RESOURCE_GROUP \
--yes