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
- Conception de la Partition Key : Choisir des clés qui distribuent la charge de manière uniforme
- Opérations par lot : Utiliser les transactions pour les mises à jour multi-entités atomiques
- Optimisation des requêtes : Toujours filtrer par PartitionKey si possible
- Projection de sélection : Sélectionner uniquement les propriétés nécessaires pour les performances
- 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"