Använda Java och JDBC med Azure SQL Database

Det här avsnittet visar hur du skapar ett exempelprogram som använder Java och JDBC för att lagra och hämta information i Azure SQL Database.

JDBC är java-standard-API:et för att ansluta till traditionella relationsdatabaser.

Förutsättningar

Förbereda arbetsmiljön

Vi kommer att använda miljövariabler för att begränsa skrivfel och göra det enklare för dig att anpassa följande konfiguration efter dina specifika behov.

Konfigurera miljövariablerna med hjälp av följande kommandon:

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>

Ersätt platshållarna med följande värden, som används i hela artikeln:

  • <YOUR_DATABASE_NAME>: Namnet på din Azure SQL Database-server. Det ska vara unikt i Azure.
  • <YOUR_AZURE_REGION>: Den Azure-region som du ska använda. Du kan använda eastus som standard, men vi rekommenderar att du konfigurerar den region som är närmast dig. Du kan ha en fullständig lista över tillgängliga regioner genom att ange az account list-locations.
  • <AZ_SQL_SERVER_PASSWORD>: Lösenordet för din Azure SQL Database-server. Lösenordet måste innehålla minst åtta tecken. Tecknen ska vara från tre av följande kategorier: engelska versaler, engelska gemener, siffror (0–9) och icke-alfanumeriska tecken (!, $, #, %och så vidare).
  • <YOUR_LOCAL_IP_ADDRESS>: IP-adressen för den lokala datorn som du ska köra Java-programmet från. Ett praktiskt sätt att hitta det är att peka webbläsaren till whatismyip.akamai.com.

Skapa sedan en resursgrupp med följande kommando:

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

Kommentar

Vi använder jq verktyget för att visa JSON-data och göra dem mer läsbara. Det här verktyget installeras som standard i Azure Cloud Shell. Om du inte gillar det här verktyget kan du ta bort | jq i alla kommandon.

Skapa en Azure SQL Database-instans

Det första vi skapar är en hanterad Azure SQL Database-server.

Kommentar

Du kan läsa mer detaljerad information om hur du skapar Azure SQL Database-servrar i Snabbstart: Skapa en enkel Azure SQL Database-databas.

Kör följande kommando i Azure Cloud Shell:

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

Det här kommandot skapar en Azure SQL Database-server.

Konfigurera en brandväggsregel för din Azure SQL Database-server

Azure SQL Database-instanser skyddas som standard. Databaserna har en brandvägg som inte tillåter inkommande anslutningar. För att kunna använda databasen måste du lägga till en brandväggsregel som gör att den lokala IP-adressen kan komma åt databasservern.

Eftersom du konfigurerade vår lokala IP-adress i början av den här artikeln kan du öppna serverns brandvägg genom att köra följande kommando:

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

Konfigurera en Azure SQL-databas

Azure SQL Database-servern som du skapade tidigare är tom. Den har ingen databas som du kan använda med Java-programmet. Skapa en ny databas med namnet demo genom att köra följande kommando:

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

Skapa ett nytt Java-projekt

Använd din favorit-IDE, skapa ett nytt Java-projekt och lägg till en pom.xml fil i rotkatalogen:

<?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>

Den här filen är en Apache Maven som konfigurerar vårt projekt att använda:

  • Java 17
  • En ny SQL Server-drivrutin för Java

Förbereda en konfigurationsfil för att ansluta till Azure SQL-databasen

Skapa en src/main/resources/application.properties-fil och lägg till:

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
  • Ersätt de två $AZ_DATABASE_NAME variablerna med det värde som du konfigurerade i början av den här artikeln.
  • Ersätt variabeln $AZ_SQL_SERVER_PASSWORD med det värde som du konfigurerade i början av den här artikeln.

Skapa en SQL-fil för att generera databasschemat

Vi använder en src/main/resources/schema.sql -fil för att skapa ett databasschema. Skapa filen med följande innehåll:

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

Koda appen

Ansluta till databasen

Lägg sedan till Java-koden som använder JDBC för att lagra och hämta data från din Azure SQL-databas.

Skapa en src/main/java/com/example/demo/DemoApplication.java-fil som innehåller:

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();
    }
}

Den här Java-koden använder application.propertiesoch de schema.sql-filer som vi skapade tidigare för att ansluta till SQL Server-databasen och skapa ett schema som lagrar våra data.

I den här filen kan du se att vi har kommenterat metoder för att infoga, läsa, uppdatera och ta bort data: vi kodar dessa metoder i resten av den här artikeln och du kommer att kunna avkommenteras en efter varandra.

Kommentar

Databasautentiseringsuppgifterna lagras i användar- och lösenordsegenskaperna för filen application.properties. Dessa autentiseringsuppgifter används när du kör DriverManager.getConnection(properties.getProperty("url"), properties);, eftersom egenskapsfilen skickas som ett argument.

Nu kan du köra den här huvudklassen med ditt favoritverktyg:

  • Med din IDE bör du kunna högerklicka på klassen DemoApplication och köra den.
  • Med Maven kan du köra programmet genom att köra: mvn package exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Programmet bör ansluta till Azure SQL Database, skapa ett databasschema och sedan stänga anslutningen, som du bör se i konsolloggarna:

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

Skapa en domänklass

Skapa en ny Todo Java-klass bredvid DemoApplication klassen och lägg till följande 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 +
                '}';
    }
}

Den här klassen är en domänmodell som mappas i tabellen todo som du skapade när du körde skriptet schema.sql .

Infoga data i Azure SQL-databasen

I filen src/main/java/DemoApplication.java lägger du efter huvudmetoden till följande metod för att infoga data i databasen:

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();
}

Du kan nu avkommenta de två följande raderna main i metoden:

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

Körning av huvudklassen bör nu generera följande utdata:

[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

Läsa data från Azure SQL-databas

Nu ska vi läsa de data som tidigare infogats för att verifiera att vår kod fungerar korrekt.

I filen src/main/java/DemoApplication.java lägger du efter insertData metoden till följande metod för att läsa data från databasen:

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

Du kan nu avkommentara följande rad i main metoden:

todo = readData(connection);

Körning av huvudklassen bör nu generera följande utdata:

[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 

Uppdatera data i Azure SQL Database

Nu ska vi uppdatera de data som vi infogade tidigare.

Efter metoden lägger du till följande metod för att uppdatera data i databasen i filen readData src/main/java/DemoApplication.java:

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);
}

Du kan nu avkommenta de två följande raderna main i metoden:

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

Körning av huvudklassen bör nu generera följande utdata:

[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 

Ta bort data i Azure SQL Database

Slutligen ska vi ta bort de data som vi infogade tidigare.

Efter metoden lägger du till följande metod för att ta bort data i databasen i filen updateData src/main/java/DemoApplication.java:

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);
}

Du kan nu avkommentara följande rad i main metoden:

deleteData(todo, connection);

Körning av huvudklassen bör nu generera följande utdata:

[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 

Slutsats- och resursrensning

Gratulerar! Du har skapat ett Java-program som använder JDBC för att lagra och hämta data från Azure SQL-databasen.

Om du vill rensa alla resurser som används under den här snabbstarten tar du bort resursgruppen med följande kommando:

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

Nästa steg