azure-data-tables-java

Créez des applications de stockage de tables avec le SDK Azure Tables pour Java. À utiliser pour travailler avec le stockage Table Azure ou l'API Table Cosmos DB pour les données NoSQL clé-valeur, le stockage sans schéma ou les données structurées à grande échelle.

npx skills add https://github.com/microsoft/skills --skill azure-data-tables-java

SDK Azure Tables pour Java

Créez des applications de stockage de tables avec le SDK Azure Tables pour Java. Fonctionne avec Azure Table Storage et Cosmos DB Table API.

Installation

<dependency>
  <groupId>com.azure</groupId>
  <artifactId>azure-data-tables</artifactId>
  <version>12.6.0-beta.1</version>
</dependency>

Création du client

Avec une chaîne de connexion

import com.azure.data.tables.TableServiceClient;
import com.azure.data.tables.TableServiceClientBuilder;
import com.azure.data.tables.TableClient;

TableServiceClient serviceClient = new TableServiceClientBuilder()
    .connectionString("<your-connection-string>")
    .buildClient();

Avec une clé partagée

import com.azure.core.credential.AzureNamedKeyCredential;

AzureNamedKeyCredential credential = new AzureNamedKeyCredential(
    "<account-name>",
    "<account-key>");

TableServiceClient serviceClient = new TableServiceClientBuilder()
    .endpoint("<your-table-account-url>")
    .credential(credential)
    .buildClient();

Avec un jeton SAS

TableServiceClient serviceClient = new TableServiceClientBuilder()
    .endpoint("<your-table-account-url>")
    .sasToken("<sas-token>")
    .buildClient();

Avec DefaultAzureCredential (Storage uniquement)

import com.azure.identity.DefaultAzureCredentialBuilder;

TableServiceClient serviceClient = new TableServiceClientBuilder()
    .endpoint("<your-table-account-url>")
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();

Concepts clés

  • TableServiceClient : Gérer les tables (créer, lister, supprimer)
  • TableClient : Gérer les entités dans une table (CRUD)
  • Partition Key : Groupe les entités pour des requêtes efficaces
  • Row Key : Identifiant unique au sein d'une partition
  • Entity : Une ligne avec jusqu'à 252 propriétés (1 Mo Storage, 2 Mo Cosmos)

Modèles principaux

Créer une table

// Créer une table (lève une exception si elle existe)
TableClient tableClient = serviceClient.createTable("mytable");

// Créer si elle n'existe pas (pas d'exception)
TableClient tableClient = serviceClient.createTableIfNotExists("mytable");

Obtenir un client de table

// À partir du client service
TableClient tableClient = serviceClient.getTableClient("mytable");

// Construction directe
TableClient tableClient = new TableClientBuilder()
    .connectionString("<connection-string>")
    .tableName("mytable")
    .buildClient();

Créer une entité

import com.azure.data.tables.models.TableEntity;

TableEntity entity = new TableEntity("partitionKey", "rowKey")
    .addProperty("Name", "Product A")
    .addProperty("Price", 29.99)
    .addProperty("Quantity", 100)
    .addProperty("IsAvailable", true);

tableClient.createEntity(entity);

Obtenir une entité

TableEntity entity = tableClient.getEntity("partitionKey", "rowKey");

String name = (String) entity.getProperty("Name");
Double price = (Double) entity.getProperty("Price");
System.out.printf("Product: %s, Price: %.2f%n", name, price);

Mettre à jour une entité

import com.azure.data.tables.models.TableEntityUpdateMode;

// Fusion (mettre à jour uniquement les propriétés spécifiées)
TableEntity updateEntity = new TableEntity("partitionKey", "rowKey")
    .addProperty("Price", 24.99);
tableClient.updateEntity(updateEntity, TableEntityUpdateMode.MERGE);

// Remplacer (remplacer l'entité entière)
TableEntity replaceEntity = new TableEntity("partitionKey", "rowKey")
    .addProperty("Name", "Product A Updated")
    .addProperty("Price", 24.99)
    .addProperty("Quantity", 150);
tableClient.updateEntity(replaceEntity, TableEntityUpdateMode.REPLACE);

Upsert d'une entité

// Insérer ou mettre à jour (mode fusion)
tableClient.upsertEntity(entity, TableEntityUpdateMode.MERGE);

// Insérer ou remplacer
tableClient.upsertEntity(entity, TableEntityUpdateMode.REPLACE);

Supprimer une entité

tableClient.deleteEntity("partitionKey", "rowKey");

Lister les entités

import com.azure.data.tables.models.ListEntitiesOptions;

// Lister toutes les entités
for (TableEntity entity : tableClient.listEntities()) {
    System.out.printf("%s - %s%n",
        entity.getPartitionKey(),
        entity.getRowKey());
}

// Avec filtrage et sélection
ListEntitiesOptions options = new ListEntitiesOptions()
    .setFilter("PartitionKey eq 'sales'")
    .setSelect("Name", "Price");

for (TableEntity entity : tableClient.listEntities(options, null, null)) {
    System.out.printf("%s: %.2f%n",
        entity.getProperty("Name"),
        entity.getProperty("Price"));
}

Requête avec filtre OData

// Filtrer par partition key
ListEntitiesOptions options = new ListEntitiesOptions()
    .setFilter("PartitionKey eq 'electronics'");

// Filtrer avec plusieurs conditions
options.setFilter("PartitionKey eq 'electronics' and Price gt 100");

// Filtrer avec opérateurs de comparaison
options.setFilter("Quantity ge 10 and Quantity le 100");

// Top N résultats
options.setTop(10);

for (TableEntity entity : tableClient.listEntities(options, null, null)) {
    System.out.println(entity.getRowKey());
}

Opérations par lot (Transactions)

import com.azure.data.tables.models.TableTransactionAction;
import com.azure.data.tables.models.TableTransactionActionType;
import java.util.Arrays;

// Toutes les entités doivent avoir la même partition key
List<TableTransactionAction> actions = Arrays.asList(
    new TableTransactionAction(
        TableTransactionActionType.CREATE,
        new TableEntity("batch", "row1").addProperty("Name", "Item 1")),
    new TableTransactionAction(
        TableTransactionActionType.CREATE,
        new TableEntity("batch", "row2").addProperty("Name", "Item 2")),
    new TableTransactionAction(
        TableTransactionActionType.UPSERT_MERGE,
        new TableEntity("batch", "row3").addProperty("Name", "Item 3"))
);

tableClient.submitTransaction(actions);

Lister les tables

import com.azure.data.tables.models.TableItem;
import com.azure.data.tables.models.ListTablesOptions;

// Lister toutes les tables
for (TableItem table : serviceClient.listTables()) {
    System.out.println(table.getName());
}

// Filtrer les tables
ListTablesOptions options = new ListTablesOptions()
    .setFilter("TableName eq 'mytable'");

for (TableItem table : serviceClient.listTables(options, null, null)) {
    System.out.println(table.getName());
}

Supprimer une table

serviceClient.deleteTable("mytable");

Entités typées

public class Product implements TableEntity {
    private String partitionKey;
    private String rowKey;
    private OffsetDateTime timestamp;
    private String eTag;
    private String name;
    private double price;

    // Getters et setters pour tous les champs
    @Override
    public String getPartitionKey() { return partitionKey; }
    @Override
    public void setPartitionKey(String partitionKey) { this.partitionKey = partitionKey; }
    @Override
    public String getRowKey() { return rowKey; }
    @Override
    public void setRowKey(String rowKey) { this.rowKey = rowKey; }
    // ... autres getters/setters

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public double getPrice() { return price; }
    public void setPrice(double price) { this.price = price; }
}

// Utilisation
Product product = new Product();
product.setPartitionKey("electronics");
product.setRowKey("laptop-001");
product.setName("Laptop");
product.setPrice(999.99);

tableClient.createEntity(product);

Gestion des erreurs

import com.azure.data.tables.models.TableServiceException;

try {
    tableClient.createEntity(entity);
} catch (TableServiceException e) {
    System.out.println("Status: " + e.getResponse().getStatusCode());
    System.out.println("Error: " + e.getMessage());
    // 409 = Conflict (entité existe)
    // 404 = Not Found
}

Variables d'environnement

# Compte de stockage
AZURE_TABLES_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
AZURE_TABLES_ENDPOINT=https://<account>.table.core.windows.net

# Cosmos DB Table API
COSMOS_TABLE_ENDPOINT=https://<account>.table.cosmosdb.azure.com

Bonnes pratiques

  1. Conception de la Partition Key : Choisir des clés qui distribuent la charge de manière uniforme
  2. Opérations par lot : Utiliser les transactions pour les mises à jour multi-entités atomiques
  3. Optimisation des requêtes : Toujours filtrer par PartitionKey si possible
  4. Projection de sélection : Sélectionner uniquement les propriétés nécessaires pour les performances
  5. Taille d'entité : Garder les entités sous 1 Mo (Storage) ou 2 Mo (Cosmos)

Expressions déclencheurs

  • "Azure Tables Java"
  • "table storage SDK"
  • "Cosmos DB Table API"
  • "NoSQL key-value storage"
  • "partition key row key"
  • "table entity CRUD"

Skills similaires