Jak korzystać z usługi Azure Table Storage lub interfejsu API tabel usługi Azure Cosmos DB przy użyciu języka JavaHow to use Azure Table storage or Azure Cosmos DB Table API from Java

Porada

Zawartość tego artykułu dotyczy magazynu tabel Azure i interfejsu API tabeli w usłudze Azure Cosmos DB.The content in this article applies to Azure Table storage and the Azure Cosmos DB Table API. Interfejs API tabeli w usłudze Azure Cosmos DB jest ofertą Premium służącą do przechowywania tabel, która zapewnia tabele zoptymalizowane pod kątem przepływności, ich globalną dystrybucję i automatyczne indeksy pomocnicze.The Azure Cosmos DB Table API is a premium offering for table storage that offers throughput-optimized tables, global distribution, and automatic secondary indexes.

OmówienieOverview

W tym artykule przedstawiono sposób wykonywania typowych zadań przy użyciu usług Azure Table Storage oraz Azure Cosmos DB.This article demonstrates how to perform common scenarios using the Azure Table storage service and Azure Cosmos DB. Przykłady zostały napisane w języku Java i wymagają użycia zestawu SDK usługi Azure Storage dla języka Java.The samples are written in Java and use the Azure Storage SDK for Java. Omówiono scenariusze tworzenia, wyświetlania listy i usuwania tabel, a także wstawiania jednostek w tabeli i wykonywania na nich zapytań oraz modyfikowania i usuwania jednostek w tabeli.The scenarios covered include creating, listing, and deleting tables, as well as inserting, querying, modifying, and deleting entities in a table. Aby uzyskać więcej informacji na temat tabel, zobacz sekcję Następne kroki.For more information on tables, see the Next steps section.

Uwaga

Jest dostępny zestaw SDK dla deweloperów korzystających z usługi Azure Storage na urządzeniach z systemem Android.An SDK is available for developers who are using Azure Storage on Android devices. Aby uzyskać więcej informacji, zobacz zestaw SDK usługi Azure Storage dla systemu Android.For more information, see the Azure Storage SDK for Android.

Tworzenie konta usługi AzureCreate an Azure service account

Do pracy z tabelami można używać usługi Azure Table Storage lub Azure Cosmos DB.You can work with tables using Azure Table storage or Azure Cosmos DB. Aby dowiedzieć się więcej o różnicach między usługami, zobacz Oferty tabel .To learn more about the differences between the services, see Table offerings. Aby móc korzystać z wybranej usługi, musisz w niej utworzyć konto.You'll need to create an account for the service you're going to use.

Tworzenie konta usługi Azure StorageCreate an Azure storage account

Najprostszym sposobem utworzenia konta magazynu platformy Azure jest użycie witryny Azure portal.The easiest way to create an Azure storage account is by using the Azure portal. Więcej informacji można znaleźć w temacie Tworzenie konta magazynu.To learn more, see Create a storage account.

Możesz utworzyć konto usługi Azure Storage przy użyciu programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure.You can also create an Azure storage account by using Azure PowerShell or Azure CLI.

Jeśli nie chcesz teraz tworzyć konta magazynu, możesz także użyć emulatora usługi Azure Storage do uruchomienia i testowania kodu w środowisku lokalnym.If you prefer not to create a storage account at this time, you can also use the Azure storage emulator to run and test your code in a local environment. Aby uzyskać więcej informacji, zobacz Używanie emulatora magazynu platformy Azure do tworzenia i testowania.For more information, see Use the Azure storage emulator for development and testing.

Tworzenie konta usługi Azure Cosmos DBCreate an Azure Cosmos DB account

Aby uzyskać instrukcje dotyczące tworzenia konta interfejsu API tabeli usługi Azure Cosmos DB, zobacz Tworzenie konta bazy danych.For instructions on creating an Azure Cosmos DB Table API account, see Create a database account.

Tworzenie aplikacji JavaCreate a Java application

Podczas pracy z tym przewodnikiem będziesz używać funkcji magazynu, które można uruchamiać lokalnie w aplikacji Java lub w kodzie działającym w ramach roli internetowej lub roli procesu roboczego na platformie Azure.In this guide, you will use storage features that you can run in a Java application locally, or in code running in a web role or worker role in Azure.

Aby skorzystać z przykładów przedstawionych w tym artykule, zainstaluj zestaw Java Development Kit (JDK), a następnie utwórz konto usługi Azure Storage lub Azure Cosmos DB w ramach swojej subskrypcji platformy Azure.To use the samples in this article, install the Java Development Kit (JDK), then create an Azure storage account or Azure Cosmos DB account in your Azure subscription. Po wykonaniu tych czynności sprawdź, czy Twój system programistyczny spełnia wymagania minimalne i zależności wymienione w repozytorium Azure Storage SDK for Java w witrynie GitHub.Once you have done so, verify that your development system meets the minimum requirements and dependencies that are listed in the Azure Storage SDK for Java repository on GitHub. Jeśli Twój system spełnia te wymagania, możesz pobrać biblioteki usługi Azure Storage dla języka Java z tego repozytorium i zainstalować je w systemie zgodnie z instrukcjami.If your system meets those requirements, you can follow the instructions to download and install the Azure Storage Libraries for Java on your system from that repository. Po wykonaniu tych zadań możesz utworzyć aplikację Java z użyciem przykładów zawartych w tym artykule.After you complete those tasks, you can create a Java application that uses the examples in this article.

Konfigurowanie aplikacji na potrzeby dostępu do usługi Table StorageConfigure your application to access table storage

Na początku pliku Java, w którym chcesz używać interfejsów API usługi Azure Storage lub interfejsu API tabel usługi Azure Cosmos DB w celu uzyskania dostępu do tabel, dodaj następujące instrukcje import:Add the following import statements to the top of the Java file where you want to use Azure storage APIs or the Azure Cosmos DB Table API to access tables:

// Include the following imports to use table APIs
import com.microsoft.azure.storage.*;
import com.microsoft.azure.storage.table.*;
import com.microsoft.azure.storage.table.TableQuery.*;

Dodawanie parametrów połączenia usługi Azure StorageAdd an Azure storage connection string

W kliencie usługi Azure Storage punkty końcowe i poświadczenia wymagane do uzyskania dostępu do usług zarządzania danymi są przechowywane w parametrach połączenia magazynu.An Azure storage client uses a storage connection string to store endpoints and credentials for accessing data management services. W aplikacji klienckiej należy podać parametry połączenia magazynu we wskazanym poniżej formacie, używając nazwy konta magazynu i podstawowego klucza dostępu do konta magazynu widocznego w witrynie Azure Portal jako wartości AccountName i AccountKey.When running in a client application, you must provide the storage connection string in the following format, using the name of your storage account and the Primary access key for the storage account listed in the Azure portal for the AccountName and AccountKey values.

W tym przykładzie pokazano, jak można zadeklarować pole statyczne w celu przechowywania parametrów połączenia:This example shows how you can declare a static field to hold the connection string:

// Define the connection-string with your values.
public static final String storageConnectionString =
    "DefaultEndpointsProtocol=http;" +
    "AccountName=your_storage_account;" +
    "AccountKey=your_storage_account_key";

Dodawanie parametrów połączenia interfejsu API tabel usługi Azure Cosmos DBAdd an Azure Cosmos DB Table API connection string

Na koncie usługi Azure Cosmos DB punkt końcowy tabeli i Twoje poświadczenia są przechowywane w parametrach połączenia.An Azure Cosmos DB account uses a connection string to store the table endpoint and your credentials. W aplikacji klienckiej należy podać parametry połączenia usługi Azure Cosmos DB we wskazanym poniżej formacie, używając nazwy konta usługi Azure Cosmos DB i podstawowego klucza dostępu do tego konta widocznego w witrynie Azure Portal jako wartości AccountName i AccountKey.When running in a client application, you must provide the Azure Cosmos DB connection string in the following format, using the name of your Azure Cosmos DB account and the primary access key for the account listed in the Azure portal for the AccountName and AccountKey values.

W tym przykładzie pokazano, jak można zadeklarować pole statyczne w celu przechowywania parametrów połączenia usługi Azure Cosmos DB:This example shows how you can declare a static field to hold the Azure Cosmos DB connection string:

public static final String storageConnectionString =
    "DefaultEndpointsProtocol=https;" + 
    "AccountName=your_cosmosdb_account;" + 
    "AccountKey=your_account_key;" + 
    "TableEndpoint=https://your_endpoint;" ;

W aplikacji działającej w ramach roli na platformie Azure można przechowywać te parametry w pliku konfiguracji usługi ServiceConfiguration.cscfg i uzyskiwać do nich dostęp za pomocą wywołania metody RoleEnvironment.getConfigurationSettings.In an application running within a role in Azure, you can store this string in the service configuration file, ServiceConfiguration.cscfg, and you can access it with a call to the RoleEnvironment.getConfigurationSettings method. Oto przykład pobierania parametrów połączenia z ustawienia o nazwie StorageConnectionString w pliku konfiguracji usługi:Here's an example of getting the connection string from a Setting element named StorageConnectionString in the service configuration file:

// Retrieve storage account from connection-string.
String storageConnectionString =
    RoleEnvironment.getConfigurationSettings().get("StorageConnectionString");

Można również przechowywać parametry połączenia w pliku config.properties w projekcie:You can also store your connection string in your project's config.properties file:

StorageConnectionString = DefaultEndpointsProtocol=https;AccountName=your_account;AccountKey=your_account_key;TableEndpoint=https://your_table_endpoint/

W poniższych przykładach założono, że uzyskano parametry połączenia za pomocą jednej z tych metod.The following samples assume that you have used one of these methods to get the storage connection string.

Tworzenie tabeliCreate a table

Obiekt CloudTableClient umożliwia pobieranie obiektów referencyjnych dla tabel i jednostek.A CloudTableClient object lets you get reference objects for tables and entities. Poniższy kod tworzy obiekt CloudTableClient, a następnie za jego pomocą tworzy nowy obiekt CloudTable reprezentujący tabelę o nazwie „people” (osoby).The following code creates a CloudTableClient object and uses it to create a new CloudTable object which represents a table named "people".

Uwaga

Istnieją inne sposoby tworzenia obiektów CloudStorageAccount. Aby uzyskać więcej informacji zobacz sekcję CloudStorageAccount w [dokumentacji zestawu SDK klienta usługi Azure Storage].There are other ways to create CloudStorageAccount objects; for more information, see CloudStorageAccount in the Azure Storage Client SDK Reference).

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create the table if it doesn't exist.
    String tableName = "people";
    CloudTable cloudTable = tableClient.getTableReference(tableName);
    cloudTable.createIfNotExists();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Wyświetlanie listy tabelList the tables

Aby uzyskać listę tabel, wywołaj metodę CloudTableClient.listTables(), aby pobrać iterowaną listę nazw tabel.To get a list of tables, call the CloudTableClient.listTables() method to retrieve an iterable list of table names.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Loop through the collection of table names.
    for (String table : tableClient.listTables())
    {
        // Output each table name.
        System.out.println(table);
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Dodawanie jednostki do tabeliAdd an entity to a table

Jednostki są mapowane na obiekty Java za pomocą niestandardowej klasy implementującej obiekt TableEntity.Entities map to Java objects using a custom class implementing TableEntity. Dla wygody klasa TableServiceEntity implementuje obiekt TableEntity i za pomocą odbicia mapuje właściwości na metody pobierające i ustawiające nazwane od tych właściwości.For convenience, the TableServiceEntity class implements TableEntity and uses reflection to map properties to getter and setter methods named for the properties. Aby dodać jednostkę do tabeli, należy najpierw utworzyć klasę, która definiuje właściwości jednostki.To add an entity to a table, first create a class that defines the properties of your entity. Poniższy kod definiuje klasę jednostki, która używa imienia klienta jako klucza wiersza i nazwiska klienta jako klucza partycji.The following code defines an entity class that uses the customer's first name as the row key, and last name as the partition key. Razem klucz partycji i klucz wiersza jednostki jednoznacznie identyfikują jednostkę w tabeli.Together, an entity's partition and row key uniquely identify the entity in the table. Zapytania mogą być wykonywane szybciej w przypadku jednostek mających taki sam klucz partycji niż w przypadku jednostek z różnymi kluczami partycji.Entities with the same partition key can be queried faster than those with different partition keys.

public class CustomerEntity extends TableServiceEntity {
    public CustomerEntity(String lastName, String firstName) {
        this.partitionKey = lastName;
        this.rowKey = firstName;
    }

    public CustomerEntity() { }

    String email;
    String phoneNumber;

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNumber() {
        return this.phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

Operacje na jednostkach w tabelach wymagają użycia obiektu TableOperation.Table operations involving entities require a TableOperation object. Ten obiekt definiuje operację do wykonania na jednostce, którą można wykonać przy użyciu obiektu CloudTable.This object defines the operation to be performed on an entity, which can be executed with a CloudTable object. Poniższy kod tworzy nowe wystąpienie klasy CustomerEntity, zawierające dane klienta, które mają być przechowywane.The following code creates a new instance of the CustomerEntity class with some customer data to be stored. Następnie wywołuje metodęTableOperation.insertOrReplace, aby utworzyć obiekt TableOperation w celu wstawienia jednostki do tabeli, i kojarzy z nim nową jednostkę CustomerEntity.The code next calls TableOperation.insertOrReplace to create a TableOperation object to insert an entity into a table, and associates the new CustomerEntity with it. Na koniec kod wywołuje metodę execute względem obiektu CloudTable, wskazując tabelę „people” i nowy obiekt TableOperation, co powoduje wysłanie żądania do usługi magazynu w celu wstawienia nowej jednostki klienta do tabeli „people” lub zastąpienia tej jednostki, jeśli już istnieje.Finally, the code calls the execute method on the CloudTable object, specifying the "people" table and the new TableOperation, which then sends a request to the storage service to insert the new customer entity into the "people" table, or replace the entity if it already exists.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create a new customer entity.
    CustomerEntity customer1 = new CustomerEntity("Harp", "Walter");
    customer1.setEmail("Walter@contoso.com");
    customer1.setPhoneNumber("425-555-0101");

    // Create an operation to add the new customer to the people table.
    TableOperation insertCustomer1 = TableOperation.insertOrReplace(customer1);

    // Submit the operation to the table service.
    cloudTable.execute(insertCustomer1);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Zbiorcze wstawianie jednostekInsert a batch of entities

Możesz wstawić partię jednostek do usługi tabel w ramach jednej operacji zapisu.You can insert a batch of entities to the table service in one write operation. Poniższy kod tworzy obiekt TableBatchOperation, a następnie dodaje do niego trzy operacje wstawiania.The following code creates a TableBatchOperation object, then adds three insert operations to it. Każda operacja wstawiania zostaje dodana przez utworzenie nowego obiektu jednostki, ustawienie jego wartości i wywołanie metody insert względem obiektu TableBatchOperation w celu skojarzenia jednostki z nową operacją wstawiania.Each insert operation is added by creating a new entity object, setting its values, and then calling the insert method on the TableBatchOperation object to associate the entity with a new insert operation. Następnie kod wywołuje metodę execute względem obiektu CloudTable, wskazując tabelę „people” i obiekt TableBatchOperation, co powoduje wysłanie partii operacji na tabeli do usługi magazynu w ramach jednego żądania.Then the code calls execute on the CloudTable object, specifying the "people" table and the TableBatchOperation object, which sends the batch of table operations to the storage service in a single request.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Define a batch operation.
    TableBatchOperation batchOperation = new TableBatchOperation();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create a customer entity to add to the table.
    CustomerEntity customer = new CustomerEntity("Smith", "Jeff");
    customer.setEmail("Jeff@contoso.com");
    customer.setPhoneNumber("425-555-0104");
    batchOperation.insertOrReplace(customer);

    // Create another customer entity to add to the table.
    CustomerEntity customer2 = new CustomerEntity("Smith", "Ben");
    customer2.setEmail("Ben@contoso.com");
    customer2.setPhoneNumber("425-555-0102");
    batchOperation.insertOrReplace(customer2);

    // Create a third customer entity to add to the table.
    CustomerEntity customer3 = new CustomerEntity("Smith", "Denise");
    customer3.setEmail("Denise@contoso.com");
    customer3.setPhoneNumber("425-555-0103");
    batchOperation.insertOrReplace(customer3);

    // Execute the batch of operations on the "people" table.
    cloudTable.execute(batchOperation);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Kilka uwag dotyczących operacji zbiorczych:Some things to note on batch operations:

  • W ramach jednej partii można wykonać maksymalnie 100 operacji wstawiania, usuwania, łączenia, zastępowania, wstawiania lub łączenia i wstawiania lub zastępowania — w dowolnej kombinacji.You can perform up to 100 insert, delete, merge, replace, insert or merge, and insert or replace operations in any combination in a single batch.
  • Operacja zbiorcza może zawierać operację pobierania, o ile jest to jedyna operacja w partii.A batch operation can have a retrieve operation, if it is the only operation in the batch.
  • Wszystkie jednostki w jednej operacji zbiorczej muszą mieć ten sam klucz partycji.All entities in a single batch operation must have the same partition key.
  • Maksymalny rozmiar ładunku danych operacji zbiorczej to 4 MB.A batch operation is limited to a 4MB data payload.

Pobieranie wszystkich jednostek w partycjiRetrieve all entities in a partition

Aby wysłać do tabeli zapytanie dotyczące jednostek w partycji, możesz użyć obiektu TableQuery.To query a table for entities in a partition, you can use a TableQuery. Wywołaj metodę TableQuery.from, aby utworzyć zapytanie dotyczące określonej tabeli, zwracające wyniki określonego typu.Call TableQuery.from to create a query on a particular table that returns a specified result type. Poniższy kod określa filtr jednostek, gdzie „Smith” jest kluczem partycji.The following code specifies a filter for entities where 'Smith' is the partition key. Metoda TableQuery.generateFilterCondition to metoda pomocnicza, umożliwiająca tworzenie filtrów zapytań.TableQuery.generateFilterCondition is a helper method to create filters for queries. Wywołaj metodę where względem odwołania zwróconego przez metodę TableQuery.from, aby zastosować filtr do zapytania.Call where on the reference returned by the TableQuery.from method to apply the filter to the query. Po wykonaniu zapytania przez wywołanie metody execute względem obiektu CloudTable zostanie zwrócony Iterator z określonym typem wyniku CustomerEntity.When the query is executed with a call to execute on the CloudTable object, it returns an Iterator with the CustomerEntity result type specified. Następnie możesz użyć zwróconego Iteratora w instrukcji for dla każdej pętli, aby korzystać z wyników.You can then use the Iterator returned in a for each loop to consume the results. Ten kod drukuje pola każdej jednostki w wynikach zapytania w konsoli.This code prints the fields of each entity in the query results to the console.

try
{
    // Define constants for filters.
    final String PARTITION_KEY = "PartitionKey";
    final String ROW_KEY = "RowKey";
    final String TIMESTAMP = "Timestamp";

    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create a filter condition where the partition key is "Smith".
    String partitionFilter = TableQuery.generateFilterCondition(
        PARTITION_KEY,
        QueryComparisons.EQUAL,
        "Smith");

    // Specify a partition query, using "Smith" as the partition key filter.
    TableQuery<CustomerEntity> partitionQuery =
        TableQuery.from(CustomerEntity.class)
        .where(partitionFilter);

    // Loop through the results, displaying information about the entity.
    for (CustomerEntity entity : cloudTable.execute(partitionQuery)) {
        System.out.println(entity.getPartitionKey() +
            " " + entity.getRowKey() +
            "\t" + entity.getEmail() +
            "\t" + entity.getPhoneNumber());
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Pobieranie zakresu jednostek w partycjiRetrieve a range of entities in a partition

Jeśli nie chcesz wykonywać zapytania dla wszystkich jednostek w partycji, możesz określić zakres, korzystając z operatorów porównania w filtrze.If you don't want to query all the entities in a partition, you can specify a range by using comparison operators in a filter. Poniższy kod łączy dwa filtry w celu pobrania wszystkich jednostek w partycji „Smith”, w których klucz wiersza (imię) rozpoczyna się od litery alfabetu wcześniejszej niż „E”.The following code combines two filters to get all entities in partition "Smith" where the row key (first name) starts with a letter up to 'E' in the alphabet. Następnie drukuje wyniki zapytania.Then it prints the query results. W przypadku użycia jednostek dodanych do tabeli w sekcji tego przewodnika dotyczącej wstawiania zbiorczego zostaną zwrócone tylko dwie jednostki, Ben i Denise Smith — nie zostanie zwrócona jednostka Jeff Smith.If you use the entities added to the table in the batch insert section of this guide, only two entities are returned this time (Ben and Denise Smith); Jeff Smith is not included.

try
{
    // Define constants for filters.
    final String PARTITION_KEY = "PartitionKey";
    final String ROW_KEY = "RowKey";
    final String TIMESTAMP = "Timestamp";

    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create a filter condition where the partition key is "Smith".
    String partitionFilter = TableQuery.generateFilterCondition(
        PARTITION_KEY,
        QueryComparisons.EQUAL,
        "Smith");

    // Create a filter condition where the row key is less than the letter "E".
    String rowFilter = TableQuery.generateFilterCondition(
        ROW_KEY,
        QueryComparisons.LESS_THAN,
        "E");

    // Combine the two conditions into a filter expression.
    String combinedFilter = TableQuery.combineFilters(partitionFilter,
        Operators.AND, rowFilter);

    // Specify a range query, using "Smith" as the partition key,
    // with the row key being up to the letter "E".
    TableQuery<CustomerEntity> rangeQuery =
        TableQuery.from(CustomerEntity.class)
        .where(combinedFilter);

    // Loop through the results, displaying information about the entity
    for (CustomerEntity entity : cloudTable.execute(rangeQuery)) {
        System.out.println(entity.getPartitionKey() +
            " " + entity.getRowKey() +
            "\t" + entity.getEmail() +
            "\t" + entity.getPhoneNumber());
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Pobieranie pojedynczej jednostkiRetrieve a single entity

Można napisać zapytanie do pobrania jednej, określonej jednostki.You can write a query to retrieve a single, specific entity. Poniższy kod wywołuje metodę TableOperation.retrieve z parametrami klucza partycji i klucza wiersza w celu wskazania klienta o nazwisku Jeff Smith — zamiast utworzenia obiektu TableQuery i użycia filtrów w tym samym celu.The following code calls TableOperation.retrieve with partition key and row key parameters to specify the customer "Jeff Smith", instead of creating a TableQuery and using filters to do the same thing. Po wykonaniu tego kodu operacja pobierania zwróci tylko jedną jednostkę, a nie zbiór jednostek.When executed, the retrieve operation returns just one entity, rather than a collection. Metoda getResultAsType rzutuje wynik na typ elementu docelowego przypisania, obiekt CustomerEntity.The getResultAsType method casts the result to the type of the assignment target, a CustomerEntity object. Jeśli ten typ nie jest zgodny z typem określonym w zapytaniu, zostanie zwrócony wyjątek.If this type is not compatible with the type specified for the query, an exception is thrown. Jeśli żadna jednostka nie ma dokładnie pasującego klucza partycji i wiersza, zostanie zwrócona wartość null.A null value is returned if no entity has an exact partition and row key match. Określenie kluczy partycji i wiersza w pojedynczym zapytaniu jest najszybszym sposobem na pobranie jednej jednostki z usługi tabel.Specifying both partition and row keys in a query is the fastest way to retrieve a single entity from the Table service.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Retrieve the entity with partition key of "Smith" and row key of "Jeff"
    TableOperation retrieveSmithJeff =
        TableOperation.retrieve("Smith", "Jeff", CustomerEntity.class);

    // Submit the operation to the table service and get the specific entity.
    CustomerEntity specificEntity =
        cloudTable.execute(retrieveSmithJeff).getResultAsType();

    // Output the entity.
    if (specificEntity != null)
    {
        System.out.println(specificEntity.getPartitionKey() +
            " " + specificEntity.getRowKey() +
            "\t" + specificEntity.getEmail() +
            "\t" + specificEntity.getPhoneNumber());
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Modyfikowanie jednostkiModify an entity

Aby zmodyfikować jednostkę, pobierz ją z usługi tabel, wprowadź zmiany w obiekcie jednostki, a następnie zapisz zmiany w usłudze tabel przy użyciu operacji zastępowania lub łączenia.To modify an entity, retrieve it from the table service, make changes to the entity object, and save the changes back to the table service with a replace or merge operation. Poniższy kod zmienia istniejący numer telefonu klienta.The following code changes an existing customer's phone number. Zamiast wywołania metody TableOperation.insert, jak w przypadku wstawiania, jest w nim wywoływana metoda TableOperation.replace.Instead of calling TableOperation.insert as we did to insert, this code calls TableOperation.replace. Metoda CloudTable.execute wywołuje usługę tabel i zastępuje jednostkę, o ile jednostka nie została zmieniona przez inną aplikację po pobraniu jej przez tę aplikację.The CloudTable.execute method calls the table service, and the entity is replaced, unless another application changed it in the time since this application retrieved it. W takim przypadku zostanie zwrócony wyjątek i będzie konieczne ponowne pobranie, zmodyfikowanie i zapisanie jednostki.When that happens, an exception is thrown, and the entity must be retrieved, modified, and saved again. Taki wzorzec ponawiania z optymistyczną współbieżnością jest typowy w rozproszonych systemach przechowywania danych.This optimistic concurrency retry pattern is common in a distributed storage system.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Retrieve the entity with partition key of "Smith" and row key of "Jeff".
    TableOperation retrieveSmithJeff =
        TableOperation.retrieve("Smith", "Jeff", CustomerEntity.class);

    // Submit the operation to the table service and get the specific entity.
    CustomerEntity specificEntity =
        cloudTable.execute(retrieveSmithJeff).getResultAsType();

    // Specify a new phone number.
    specificEntity.setPhoneNumber("425-555-0105");

    // Create an operation to replace the entity.
    TableOperation replaceEntity = TableOperation.replace(specificEntity);

    // Submit the operation to the table service.
    cloudTable.execute(replaceEntity);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Tworzenie zapytania do podzbioru właściwości jednostkiQuery a subset of entity properties

Za pomocą zapytania wykonywanego względem tabeli można pobrać tylko kilka właściwości z jednostki.A query to a table can retrieve just a few properties from an entity. Ta technika, zwana projekcją, redukuje przepustowość i może poprawiać wydajność zapytań, zwłaszcza w przypadku dużych jednostek.This technique, called projection, reduces bandwidth and can improve query performance, especially for large entities. Zapytanie w poniższym kodzie zwraca wyłącznie adresy e-mail jednostek w tabeli dzięki użyciu metody select.The query in the following code uses the select method to return only the email addresses of entities in the table. Te wyniki są projektowane do kolekcji obiektów String za pomocą zapytania EntityResolver, wykonującego konwersję typu jednostek zwróconych z serwera.The results are projected into a collection of String with the help of an EntityResolver, which does the type conversion on the entities returned from the server. Więcej informacji na temat projekcji można dowiedzieć się w programie [Tabele platformy Azure: wprowadzenie upsert i projekcji zapytań][Tabele platformy Azure: wprowadzenie upsert i projekcji zapytań].You can learn more about projection in [Azure Tables: Introducing Upsert and Query Projection][Azure Tables: Introducing Upsert and Query Projection]. Należy zauważyć, że funkcja projekcji nie jest obsługiwana w lokalnym emulatorze magazynu, dlatego ten kod zadziała tylko w przypadku użycia konta w usłudze tabel.Note that projection is not supported on the local storage emulator, so this code runs only when using an account on the table service.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Define a projection query that retrieves only the Email property
    TableQuery<CustomerEntity> projectionQuery =
        TableQuery.from(CustomerEntity.class)
        .select(new String[] {"Email"});

    // Define an Entity resolver to project the entity to the Email value.
    EntityResolver<String> emailResolver = new EntityResolver<String>() {
        @Override
        public String resolve(String PartitionKey, String RowKey, Date timeStamp, HashMap<String, EntityProperty> properties, String etag) {
            return properties.get("Email").getValueAsString();
        }
    };

    // Loop through the results, displaying the Email values.
    for (String projectedString :
        cloudTable.execute(projectionQuery, emailResolver)) {
            System.out.println(projectedString);
    }
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Wstawianie lub zastępowanie jednostkiInsert or Replace an entity

Często zdarza się, że chcesz dodać jednostkę do tabeli, ale nie wiesz, czy taka jednostka już istnieje.Often you want to add an entity to a table without knowing if it already exists in the table. Operacja wstawiania lub zastępowania umożliwia przesłanie jednego żądania, w wyniku którego jednostka zostanie wstawiona (jeśli jeszcze nie istnieje) lub zastąpiona (jeśli istnieje).An insert-or-replace operation allows you to make a single request which will insert the entity if it does not exist or replace the existing one if it does. Poniższy kod, oparty na poprzednich przykładach, wstawia lub zastępuje jednostkę „Walter Harp”.Building on prior examples, the following code inserts or replaces the entity for "Walter Harp". Po utworzeniu nowej jednostki kod wywołuje metodę TableOperation.insertOrReplace.After creating a new entity, this code calls the TableOperation.insertOrReplace method. Następnie wywołuje metodę execute względem obiektu CloudTable, używając tabeli i operacji wstawiania lub zastępowania jako parametrów.This code then calls execute on the CloudTable object with the table and the insert or replace table operation as the parameters. Aby zaktualizować tylko część jednostki, można użyć zamiast tego metody TableOperation.insertOrMerge.To update only part of an entity, the TableOperation.insertOrMerge method can be used instead. Należy zauważyć, że funkcja wstawiania lub zastępowania nie jest obsługiwana w lokalnym emulatorze magazynu, dlatego ten kod zadziała tylko w przypadku użycia konta w usłudze tabel.Note that insert-or-replace is not supported on the local storage emulator, so this code runs only when using an account on the table service. Więcej informacji na temat wstawiania lub zamieniania i wstawiania lub scalania można dowiedzieć się w tym [Tabele platformy Azure: Wprowadzenie upsert i projekcji zapytań][Tabele platformy Azure: wprowadzenie upsert i projekcji zapytań].You can learn more about insert-or-replace and insert-or-merge in this [Azure Tables: Introducing Upsert and Query Projection][Azure Tables: Introducing Upsert and Query Projection].

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create a new customer entity.
    CustomerEntity customer5 = new CustomerEntity("Harp", "Walter");
    customer5.setEmail("Walter@contoso.com");
    customer5.setPhoneNumber("425-555-0106");

    // Create an operation to add the new customer to the people table.
    TableOperation insertCustomer5 = TableOperation.insertOrReplace(customer5);

    // Submit the operation to the table service.
    cloudTable.execute(insertCustomer5);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Usuwanie jednostkiDelete an entity

Można łatwo usunąć pobraną jednostkę.You can easily delete an entity after you have retrieved it. Po pobraniu jednostki wywołaj metodę TableOperation.delete, wskazując jednostkę do usunięcia.After the entity is retrieved, call TableOperation.delete with the entity to delete. Następnie wywołaj metodę execute względem obiektu CloudTable.Then call execute on the CloudTable object. Poniższy kod umożliwia pobranie i usunięcie jednostki klienta.The following code retrieves and deletes a customer entity.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Create a cloud table object for the table.
    CloudTable cloudTable = tableClient.getTableReference("people");

    // Create an operation to retrieve the entity with partition key of "Smith" and row key of "Jeff".
    TableOperation retrieveSmithJeff = TableOperation.retrieve("Smith", "Jeff", CustomerEntity.class);

    // Retrieve the entity with partition key of "Smith" and row key of "Jeff".
    CustomerEntity entitySmithJeff =
        cloudTable.execute(retrieveSmithJeff).getResultAsType();

    // Create an operation to delete the entity.
    TableOperation deleteSmithJeff = TableOperation.delete(entitySmithJeff);

    // Submit the delete operation to the table service.
    cloudTable.execute(deleteSmithJeff);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Usuwanie tabeliDelete a table

Poniższy kod usuwa tabelę z konta magazynu.Finally, the following code deletes a table from a storage account. Nie można ponownie utworzyć tabeli przez około 40 sekund po jej usunięciu.For about 40 seconds after you delete a table, you cannot recreate it.

try
{
    // Retrieve storage account from connection-string.
    CloudStorageAccount storageAccount =
        CloudStorageAccount.parse(storageConnectionString);

    // Create the table client.
    CloudTableClient tableClient = storageAccount.createCloudTableClient();

    // Delete the table and all its data if it exists.
    CloudTable cloudTable = tableClient.getTableReference("people");
    cloudTable.deleteIfExists();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Porada

Zapoznaj się z repozytorium przykładów kodu usługi Azure StorageCheck out the Azure Storage code samples repository

Nasza lista przykładów usługi Azure Storage zawiera łatwe w użyciu kompleksowe przykłady kodu usługi Azure Storage, które można pobierać i uruchamiać.For easy-to-use end-to-end Azure Storage code samples that you can download and run, please check out our list of Azure Storage Samples.

Następne krokiNext steps

Aby uzyskać więcej informacji, odwiedź stronę Azure dla deweloperów języka Java.For more information, visit Azure for Java developers.