Szybki start: tworzenie interfejsu API dla aplikacji tabel przy użyciu zestawu Java SDK i usługi Azure Cosmos DB

DOTYCZY: Tabeli

W tym przewodniku Szybki start pokazano, jak uzyskać dostęp do interfejsu API tabel usługi Azure Cosmos DB z poziomu aplikacji Java. Interfejs API tabel usługi Azure Cosmos DB to bez schematu magazyn danych, który umożliwia aplikacjom przechowywanie ustrukturyzowanych danych NoSQL w chmurze. Ponieważ dane są przechowywane w projekcie bez schematu, nowe właściwości (kolumny) są automatycznie dodawane do tabeli po dodaniu obiektu z nowym atrybutem do tabeli.

Aplikacje Java mogą uzyskiwać dostęp do interfejsu API tabel usługi Azure Cosmos DB przy użyciu biblioteki klienta azure-data-tables .

Wymagania wstępne

Przykładowa aplikacja jest napisana w środowisku Spring Boot 2.6.4. Można użyć środowiska Visual Studio Code lub Środowiska IntelliJ IDEA jako środowiska IDE.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto .

Przykładowa aplikacja

Przykładowa aplikacja dla tego samouczka może zostać sklonowana lub pobrana z repozytorium https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java. Zarówno aplikacja startowa, jak i ukończona są uwzględnione w przykładowym repozytorium.

git clone https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java

Przykładowa aplikacja używa danych pogodowych jako przykładu, aby zademonstrować możliwości interfejsu API tabel. Obiekty reprezentujące obserwacje pogody są przechowywane i pobierane przy użyciu interfejsu API dla tabeli, w tym przechowywania obiektów z dodatkowymi właściwościami w celu zademonstrowania możliwości bez schematu interfejsu API tabel.

Zrzut ekranu ukończonej aplikacji przedstawiający dane przechowywane w tabeli usługi Azure Cosmos DB przy użyciu interfejsu API tabel.

1 — Tworzenie konta usługi Azure Cosmos DB

Najpierw należy utworzyć konto interfejsu API tabel usługi Azure Cosmos DB, które będzie zawierać tabele używane w aplikacji. Można to zrobić przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.

Zaloguj się do Azure Portal i wykonaj następujące kroki, aby utworzyć konto usługi Azure Cosmos DB.

Instrukcje Zrzut ekranu
W witrynie Azure Portal:
  1. Na pasku wyszukiwania w górnej części Azure Portal wprowadź "Azure Cosmos DB".
  2. W menu wyświetlonym poniżej paska wyszukiwania w obszarze Usługi wybierz element z etykietą Azure Cosmos DB.
Zrzut ekranu przedstawiający sposób użycia pola wyszukiwania na górnym pasku narzędzi do znajdowania kont usługi Azure Cosmos DB na platformie Azure.
Na stronie usługi Azure Cosmos DB wybierz pozycję +Utwórz. Zrzut ekranu przedstawiający lokalizację przycisku Utwórz na stronie kont usługi Azure Cosmos DB na platformie Azure.
Na stronie Wybierz interfejs API wybierz opcję Tabela platformy Azure . Zrzut ekranu przedstawiający opcję Tabela platformy Azure jako właściwą opcję do wybrania.
Na stronie Tworzenie konta usługi Azure Cosmos DB — tabela platformy Azure wypełnij formularz w następujący sposób.
  1. Utwórz nową grupę zasobów dla konta magazynu o nazwie rg-msdocs-tables-sdk-demo , wybierając link Utwórz nową w obszarze Grupa zasobów.
  2. Nadaj kontu magazynu nazwę cosmos-msdocs-tables-sdk-demo-XYZ , w której XYZ to dowolne trzy losowe znaki, aby utworzyć unikatową nazwę konta. Nazwy kont usługi Azure Cosmos DB muszą mieć długość od 3 do 44 znaków i mogą zawierać tylko małe litery, cyfry lub znak łącznika (-).
  3. Wybierz region dla swojego konta magazynu.
  4. Wybierz pozycję Wydajność w warstwie Standardowa .
  5. Wybierz pozycję Aprowizowana przepływność dla tego przykładu w obszarze Tryb pojemności.
  6. W tym przykładzie wybierz pozycję Zastosuj rabat na warstwę Bezpłatna .
  7. Wybierz przycisk Przejrzyj i utwórz w dolnej części ekranu, a następnie wybierz pozycję "Utwórz" na ekranie podsumowania, aby utworzyć konto usługi Azure Cosmos DB. Ten proces może potrwać kilka minut.
Zrzut ekranu przedstawiający sposób wypełniania pól na stronie tworzenia konta usługi Azure Cosmos DB.

2 — Tworzenie tabeli

Następnie należy utworzyć tabelę na koncie usługi Azure Cosmos DB, aby aplikacja mogła być używana. W przeciwieństwie do tradycyjnej bazy danych wystarczy określić nazwę tabeli, a nie właściwości (kolumny) w tabeli. W miarę ładowania danych do tabeli właściwości (kolumny) zostaną automatycznie utworzone zgodnie z potrzebami.

W Azure Portal wykonaj następujące kroki, aby utworzyć tabelę na koncie usługi Azure Cosmos DB.

Instrukcje Zrzut ekranu
W Azure Portal przejdź do strony przeglądu konta usługi Azure Cosmos DB. Możesz przejść do strony przeglądu konta usługi Azure Cosmos DB, wpisując nazwę (cosmos-msdocs-tables-sdk-demo-XYZ) konta usługi Azure Cosmos DB na górnym pasku wyszukiwania i patrząc pod nagłówkiem zasobów. Wybierz nazwę konta usługi Azure Cosmos DB, aby przejść do strony przeglądu. Zrzut ekranu przedstawiający sposób użycia pola wyszukiwania na górnym pasku narzędzi w celu znalezienia konta usługi Azure Cosmos DB.
Na stronie przeglądu wybierz pozycję +Dodaj tabelę. Zostanie wyświetlone okno dialogowe Nowa tabela z prawej strony. Zrzut ekranu przedstawiający lokalizację przycisku Dodaj tabelę.
W oknie dialogowym Nowa tabela wypełnij formularz w następujący sposób.
  1. Wprowadź nazwę WeatherData dla identyfikatora tabeli. Jest to nazwa tabeli.
  2. W tym przykładzie wybierz pozycję Ręczne w obszarze Przepływność tabeli (autoskalowanie ).
  3. Użyj wartości domyślnej 400 w szacowanej wartości RU/s.
  4. Wybierz przycisk OK , aby utworzyć tabelę.
Zrzut ekranu przedstawiający okno dialogowe Nowa tabela dla tabeli usługi Azure Cosmos DB.

3 — Pobieranie parametrów połączenia usługi Azure Cosmos DB

Aby uzyskać dostęp do tabel w usłudze Azure Cosmos DB, aplikacja będzie potrzebować parametrów połączenia tabeli dla konta usługi CosmosDB Storage. Parametry połączenia można pobrać przy użyciu Azure Portal, interfejsu wiersza polecenia platformy Azure lub Azure PowerShell.

Instrukcje Zrzut ekranu
Po lewej stronie konta usługi Azure Cosmos DB znajdź element menu o nazwie Parametry połączenia w nagłówku Ustawienia i wybierz go. Nastąpi przekierowanie do strony, na której można pobrać parametry połączenia dla konta magazynu. Zrzut ekranu przedstawiający lokalizację linku parametrów połączenia na stronie usługi Azure Cosmos DB.
Skopiuj wartość PODSTAWOWE PARAMETRY POŁĄCZENIA do użycia w aplikacji. Zrzut ekranu przedstawiający parametry połączenia do wybrania i użycia w aplikacji.

Parametry połączenia dla konta usługi Azure Cosmos DB są uważane za wpis tajny aplikacji i muszą być chronione jak każdy inny wpis tajny aplikacji lub hasło. W tym przykładzie użyto funkcji POM do przechowywania parametrów połączenia podczas programowania i udostępnienia jej aplikacji.

<profiles>
    <profile>
        <id>local</id>
        <properties>
            <azure.tables.connection.string>
                <![CDATA[YOUR-DATA-TABLES-SERVICE-CONNECTION-STRING]]>
            </azure.tables.connection.string>
            <azure.tables.tableName>WeatherData</azure.tables.tableName>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

4 — Dołączanie pakietu azure-data-tables

Aby uzyskać dostęp do interfejsu API tabel usługi Azure Cosmos DB z poziomu aplikacji Java, dołącz pakiet azure-data-tables .

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-data-tables</artifactId>
    <version>12.2.1</version>
</dependency>

5 — Konfigurowanie klienta tabeli w tabeli TableServiceConfig.java

Zestaw Azure SDK komunikuje się z platformą Azure przy użyciu obiektów klienta w celu wykonywania różnych operacji na platformie Azure. Obiekt TableClient jest obiektem używanym do komunikowania się z interfejsem API tabel usługi Azure Cosmos DB.

Aplikacja zazwyczaj tworzy pojedynczy obiekt TableClient na tabelę do użycia w całej aplikacji. Zaleca się wskazanie, że metoda tworzy fasolę obiektu TableClient , która ma być zarządzana przez kontener Spring i jako jedenton, aby to osiągnąć.

TableServiceConfig.java W pliku aplikacji zmodyfikuj metodę tableClientConfiguration() tak, aby odpowiadała następującemu fragmentowi kodu:

@Configuration
public class TableServiceConfiguration {

    private static String TABLE_NAME;

    private static String CONNECTION_STRING;

    @Value("${azure.tables.connection.string}")
    public void setConnectionStringStatic(String connectionString) {
        TableServiceConfiguration.CONNECTION_STRING = connectionString;
    }

    @Value("${azure.tables.tableName}")
    public void setTableNameStatic(String tableName) {
        TableServiceConfiguration.TABLE_NAME = tableName;
    }

    @Bean
    public TableClient tableClientConfiguration() {
        return new TableClientBuilder()
                .connectionString(CONNECTION_STRING)
                .tableName(TABLE_NAME)
                .buildClient();
    }
    
}

Należy również dodać następującą instrukcję using w górnej części TableServiceConfig.java pliku.

import com.azure.data.tables.TableClient;
import com.azure.data.tables.TableClientBuilder;

6 — Implementowanie operacji tabeli usługi Azure Cosmos DB

Wszystkie operacje tabeli usługi Azure Cosmos DB dla przykładowej aplikacji są implementowane w klasie znajdującej TablesServiceImpl się w katalogu Services . Musisz zaimportować com.azure.data.tables pakiet zestawu SDK.

import com.azure.data.tables.TableClient;
import com.azure.data.tables.models.ListEntitiesOptions;
import com.azure.data.tables.models.TableEntity;
import com.azure.data.tables.models.TableTransactionAction;
import com.azure.data.tables.models.TableTransactionActionType;

Na początku TableServiceImpl klasy dodaj zmienną składową dla obiektu TableClient i konstruktora, aby umożliwić wstrzyknięcie obiektu TableClient do klasy.

@Autowired
private TableClient tableClient;

Pobieranie wierszy z tabeli

Klasa TableClient zawiera metodę o nazwie listEntities , która umożliwia wybieranie wierszy z tabeli. W tym przykładzie, ponieważ żadne parametry nie są przekazywane do metody, wszystkie wiersze zostaną wybrane z tabeli.

Metoda przyjmuje również ogólny parametr typu TableEntity , który określa dane klasy modelu zostaną zwrócone jako. W takim przypadku jest używana wbudowana klasa TableEntity , co oznacza, że listEntities metoda zwróci PagedIterable<TableEntity> kolekcję jako wyniki.

public List<WeatherDataModel> retrieveAllEntities() {
    List<WeatherDataModel> modelList = tableClient.listEntities().stream()
        .map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
        .collect(Collectors.toList());
    return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}

Klasa TableEntity zdefiniowana w com.azure.data.tables.models pakiecie ma właściwości dla wartości klucza partycji i klucza wiersza w tabeli. Te dwie wartości dla unikatowego klucza dla wiersza w tabeli. W tej przykładowej aplikacji nazwa stacji pogodowej (miasta) jest przechowywana w kluczu partycji, a data/godzina obserwacji jest przechowywana w kluczu wiersza. Wszystkie inne właściwości (temperatura, wilgotność, prędkość wiatru) są przechowywane w słowniku TableEntity w obiekcie.

Często praktyką jest mapowania obiektu TableEntity na obiekt własnej definicji. Przykładowa aplikacja definiuje klasę WeatherDataModel w katalogu Models w tym celu. Ta klasa ma właściwości nazwy stacji i daty obserwacji, do której będzie mapować klucz partycji i klucz wiersza, zapewniając bardziej znaczące nazwy właściwości dla tych wartości. Następnie używa słownika do przechowywania wszystkich pozostałych właściwości obiektu. Jest to typowy wzorzec podczas pracy z usługą Table Storage, ponieważ wiersz może mieć dowolną liczbę dowolnych właściwości i chcemy, aby nasze obiekty modelu mogły przechwytywać wszystkie z nich. Ta klasa zawiera również metody wyświetlania listy właściwości w klasie.

public class WeatherDataModel {

    public WeatherDataModel(String stationName, String observationDate, OffsetDateTime timestamp, String etag) {
        this.stationName = stationName;
        this.observationDate = observationDate;
        this.timestamp = timestamp;
        this.etag = etag;
    }

    private String stationName;

    private String observationDate;

    private OffsetDateTime timestamp;

    private String etag;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public OffsetDateTime getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(OffsetDateTime timestamp) {
        this.timestamp = timestamp;
    }

    public String getEtag() {
        return etag;
    }

    public void setEtag(String etag) {
        this.etag = etag;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }
}

Metoda mapTableEntityToWeatherDataModel służy do mapowania obiektu TableEntity na WeatherDataModel obiekt. Metoda mapTableEntityToWeatherDataModel mapuje PartitionKeybezpośrednio właściwości , , TimestampRowKey, i Etag , a następnie używa properties.keySet metody do iteracji innych właściwości w TableEntity obiekcie i mapowania ich na WeatherDataModel obiekt, minus właściwości, które zostały już zamapowane bezpośrednio.

Edytuj kod w metodzie mapTableEntityToWeatherDataModel , aby był zgodny z następującym blokiem kodu.

public static WeatherDataModel mapTableEntityToWeatherDataModel(TableEntity entity) {
    WeatherDataModel observation = new WeatherDataModel(
        entity.getPartitionKey(), entity.getRowKey(),
        entity.getTimestamp(), entity.getETag());
    rearrangeEntityProperties(observation.getPropertyMap(), entity.getProperties());
    return observation;
}

private static void rearrangeEntityProperties(Map<String, Object> target, Map<String, Object> source) {
    Constants.DEFAULT_LIST_OF_KEYS.forEach(key -> {
        if (source.containsKey(key)) {
            target.put(key, source.get(key));
        }
    });
    source.keySet().forEach(key -> {
        if (Constants.DEFAULT_LIST_OF_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))
        && Constants.EXCLUDE_TABLE_ENTITY_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))) {
            target.put(key, source.get(key));
        }
    });
}

Filtrowanie wierszy zwracanych z tabeli

Aby filtrować wiersze zwrócone z tabeli, możesz przekazać ciąg filtru stylu OData do metody listEntities . Jeśli na przykład chcesz uzyskać wszystkie odczyty pogodowe dla Chicago między północą 1 lipca 2021 r. a północą 2 lipca 2021 r. (włącznie), przekaż następujący ciąg filtru.

PartitionKey eq 'Chicago' and RowKey ge '2021-07-01 12:00 AM' and RowKey le '2021-07-02 12:00 AM'

Wszystkie operatory filtrów OData można wyświetlić w witrynie internetowej OData w sekcji Filtruj opcję zapytania systemowego

W przykładowej aplikacji FilterResultsInputModel obiekt jest przeznaczony do przechwytywania wszystkich kryteriów filtrowania dostarczonych przez użytkownika.

public class FilterResultsInputModel implements Serializable {

    private String partitionKey;

    private String rowKeyDateStart;

    private String rowKeyTimeStart;

    private String rowKeyDateEnd;

    private String rowKeyTimeEnd;

    private Double minTemperature;

    private Double maxTemperature;

    private Double minPrecipitation;

    private Double maxPrecipitation;

    public String getPartitionKey() {
        return partitionKey;
    }

    public void setPartitionKey(String partitionKey) {
        this.partitionKey = partitionKey;
    }

    public String getRowKeyDateStart() {
        return rowKeyDateStart;
    }

    public void setRowKeyDateStart(String rowKeyDateStart) {
        this.rowKeyDateStart = rowKeyDateStart;
    }

    public String getRowKeyTimeStart() {
        return rowKeyTimeStart;
    }

    public void setRowKeyTimeStart(String rowKeyTimeStart) {
        this.rowKeyTimeStart = rowKeyTimeStart;
    }

    public String getRowKeyDateEnd() {
        return rowKeyDateEnd;
    }

    public void setRowKeyDateEnd(String rowKeyDateEnd) {
        this.rowKeyDateEnd = rowKeyDateEnd;
    }

    public String getRowKeyTimeEnd() {
        return rowKeyTimeEnd;
    }

    public void setRowKeyTimeEnd(String rowKeyTimeEnd) {
        this.rowKeyTimeEnd = rowKeyTimeEnd;
    }

    public Double getMinTemperature() {
        return minTemperature;
    }

    public void setMinTemperature(Double minTemperature) {
        this.minTemperature = minTemperature;
    }

    public Double getMaxTemperature() {
        return maxTemperature;
    }

    public void setMaxTemperature(Double maxTemperature) {
        this.maxTemperature = maxTemperature;
    }

    public Double getMinPrecipitation() {
        return minPrecipitation;
    }

    public void setMinPrecipitation(Double minPrecipitation) {
        this.minPrecipitation = minPrecipitation;
    }

    public Double getMaxPrecipitation() {
        return maxPrecipitation;
    }

    public void setMaxPrecipitation(Double maxPrecipitation) {
        this.maxPrecipitation = maxPrecipitation;
    }
}

Po przekazaniu TableServiceImpl tego obiektu do retrieveEntitiesByFilter metody w klasie tworzy ciąg filtru dla każdej wartości właściwości innej niż null. Następnie tworzy połączony ciąg filtru, łącząc wszystkie wartości z klauzulą "and". Ten połączony ciąg filtru jest przekazywany do metody listEntities w obiekcie TableClient i zwracane będą tylko wiersze pasujące do ciągu filtru. Możesz użyć podobnej metody w kodzie, aby utworzyć odpowiednie ciągi filtru zgodnie z wymaganiami aplikacji.

public List<WeatherDataModel> retrieveEntitiesByFilter(FilterResultsInputModel model) {

    List<String> filters = new ArrayList<>();

    if (!StringUtils.isEmptyOrWhitespace(model.getPartitionKey())) {
        filters.add(String.format("PartitionKey eq '%s'", model.getPartitionKey()));
    }
    if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateStart())
            && !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeStart())) {
        filters.add(String.format("RowKey ge '%s %s'", model.getRowKeyDateStart(), model.getRowKeyTimeStart()));
    }
    if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateEnd())
            && !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeEnd())) {
        filters.add(String.format("RowKey le '%s %s'", model.getRowKeyDateEnd(), model.getRowKeyTimeEnd()));
    }
    if (model.getMinTemperature() != null) {
        filters.add(String.format("Temperature ge %f", model.getMinTemperature()));
    }
    if (model.getMaxTemperature() != null) {
        filters.add(String.format("Temperature le %f", model.getMaxTemperature()));
    }
    if (model.getMinPrecipitation() != null) {
        filters.add(String.format("Precipitation ge %f", model.getMinPrecipitation()));
    }
    if (model.getMaxPrecipitation() != null) {
        filters.add(String.format("Precipitation le %f", model.getMaxPrecipitation()));
    }

    List<WeatherDataModel> modelList = tableClient.listEntities(new ListEntitiesOptions()
        .setFilter(String.join(" and ", filters)), null, null).stream()
        .map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
        .collect(Collectors.toList());
    return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}

Wstawianie danych przy użyciu obiektu TableEntity

Najprostszym sposobem dodawania danych do tabeli jest użycie obiektu TableEntity . W tym przykładzie dane są mapowane z obiektu modelu wejściowego na obiekt TableEntity . Właściwości obiektu wejściowego reprezentującego nazwę stacji pogodowej i datę/godzinę obserwacji są mapowane odpowiednio na PartitionKey właściwości i RowKey), które razem tworzą unikatowy klucz dla wiersza w tabeli. Następnie dodatkowe właściwości obiektu modelu wejściowego są mapowane na właściwości słownika w obiekcie TableClient . Na koniec metoda createEntity obiektu TableClient służy do wstawiania danych do tabeli.

Zmodyfikuj klasę insertEntity w przykładowej aplikacji, aby zawierała następujący kod.

public void insertEntity(WeatherInputModel model) {
    tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}

Dane upsert używające obiektu TableEntity

Jeśli spróbujesz wstawić wiersz do tabeli z kombinacją klucza partycji/klucza wiersza, która już istnieje w tej tabeli, zostanie wyświetlony błąd. Z tego powodu często zaleca się użycie metody upsertEntity zamiast insertEntity metody podczas dodawania wierszy do tabeli. Jeśli dana kombinacja klucza partycji/klucza wiersza już istnieje w tabeli, metoda upsertEntity zaktualizuje istniejący wiersz. W przeciwnym razie wiersz zostanie dodany do tabeli.

public void upsertEntity(WeatherInputModel model) {
    tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}

Wstawianie lub upsert danych z właściwościami zmiennych

Jedną z zalet korzystania z interfejsu API tabel usługi Azure Cosmos DB jest to, że jeśli obiekt ładowany do tabeli zawiera jakiekolwiek nowe właściwości, te właściwości są automatycznie dodawane do tabeli i wartości przechowywane w usłudze Azure Cosmos DB. Nie ma potrzeby uruchamiania instrukcji DDL, takich jak ALTER TABLE dodawanie kolumn w tradycyjnej bazie danych.

Ten model zapewnia elastyczność aplikacji podczas pracy ze źródłami danych, które mogą dodawać lub modyfikować dane, które muszą być przechwytywane w czasie lub gdy różne dane wejściowe dostarczają różne dane do aplikacji. W przykładowej aplikacji możemy symulować stację pogodową, która wysyła nie tylko podstawowe dane pogodowe, ale także kilka dodatkowych wartości. Gdy obiekt z tymi nowymi właściwościami jest przechowywany w tabeli po raz pierwszy, odpowiednie właściwości (kolumny) zostaną automatycznie dodane do tabeli.

W przykładowej aplikacji klasa jest tworzona ExpandableWeatherObject wokół słownika wewnętrznego w celu obsługi dowolnego zestawu właściwości obiektu. Ta klasa reprezentuje typowy wzorzec, gdy obiekt musi zawierać dowolny zestaw właściwości.

public class ExpandableWeatherObject {

    private String stationName;

    private String observationDate;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }

    public boolean containsProperty(String key) {
        return this.propertyMap.containsKey(key);
    }

    public Object getPropertyValue(String key) {
        return containsProperty(key) ? this.propertyMap.get(key) : null;
    }

    public void putProperty(String key, Object value) {
        this.propertyMap.put(key, value);
    }

    public List<String> getPropertyKeys() {
        List<String> list = Collections.synchronizedList(new ArrayList<String>());
        Iterator<String> iterators = this.propertyMap.keySet().iterator();
        while (iterators.hasNext()) {
            list.add(iterators.next());
        }
        return Collections.unmodifiableList(list);
    }

    public Integer getPropertyCount() {
        return this.propertyMap.size();
    }
}

Aby wstawić lub upsert taki obiekt przy użyciu interfejsu API dla tabeli, zamapuj właściwości obiektu rozszerzalnego na obiekt TableEntity i użyj metod createEntity lub upsertEntity w obiekcie TableClient odpowiednio.

public void insertExpandableEntity(ExpandableWeatherObject model) {
    tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}

public void upsertExpandableEntity(ExpandableWeatherObject model) {
    tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}

Aktualizowanie jednostki

Jednostki można zaktualizować, wywołując metodę updateEntity w obiekcie TableClient . Ponieważ jednostka (wiersz) przechowywana przy użyciu interfejsu API tabel może zawierać dowolny zestaw właściwości, często warto utworzyć obiekt aktualizacji na podstawie obiektu słownika podobnego do omówionego ExpandableWeatherObject wcześniej. W takim przypadku jedyną różnicą etag jest dodanie właściwości, która jest używana do kontroli współbieżności podczas aktualizacji.

public class UpdateWeatherObject {

    private String stationName;

    private String observationDate;

    private String etag;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public String getEtag() {
        return etag;
    }

    public void setEtag(String etag) {
        this.etag = etag;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }
}

W przykładowej aplikacji ten obiekt jest przekazywany do updateEntity metody w TableServiceImpl klasie. Ta metoda najpierw ładuje istniejącą jednostkę z interfejsu API tabel przy użyciu metody getEntity w obiekcie TableClient. Następnie aktualizuje ten obiekt jednostki i używa updateEntity metody zapisywania aktualizacji w bazie danych. Zwróć uwagę, że metoda updateEntity pobiera bieżący element Etag obiektu, aby upewnić się, że obiekt nie uległ zmianie od czasu jego początkowego załadowania. Jeśli chcesz zaktualizować jednostkę niezależnie od tego, możesz przekazać wartość etag do updateEntity metody .

public void updateEntity(UpdateWeatherObject model) {
    TableEntity tableEntity = tableClient.getEntity(model.getStationName(), model.getObservationDate());
    Map<String, Object> propertiesMap = model.getPropertyMap();
    propertiesMap.keySet().forEach(key -> tableEntity.getProperties().put(key, propertiesMap.get(key)));
    tableClient.updateEntity(tableEntity);
}

Usuwanie jednostki

Aby usunąć jednostkę z tabeli, wywołaj metodę deleteEntity w obiekcie TableClient z kluczem partycji i kluczem wiersza obiektu.

public void deleteEntity(WeatherInputModel model) {
    tableClient.deleteEntity(model.getStationName(),
            WeatherDataUtils.formatRowKey(model.getObservationDate(), model.getObservationTime()));
}

7 — Uruchamianie kodu

Uruchom przykładową aplikację, aby korzystać z interfejsu API tabel usługi Azure Cosmos DB. Przy pierwszym uruchomieniu aplikacji nie będzie żadnych danych, ponieważ tabela jest pusta. Użyj dowolnych przycisków w górnej części aplikacji, aby dodać dane do tabeli.

Zrzut ekranu aplikacji przedstawiający lokalizację przycisków używanych do wstawiania danych do usługi Azure Cosmos DB przy użyciu interfejsu API tabel.

Wybranie przycisku Wstaw przy użyciu jednostki tabeli powoduje otwarcie okna dialogowego umożliwiającego wstawianie lub upsert nowego wiersza przy użyciu TableEntity obiektu.

Zrzut ekranu aplikacji przedstawiający okno dialogowe używane do wstawiania danych przy użyciu obiektu TableEntity.

Wybranie przycisku Wstaw przy użyciu danych rozwijanych powoduje wyświetlenie okna dialogowego, które umożliwia wstawianie obiektu z właściwościami niestandardowymi, co pokazuje, jak interfejs API tabel usługi Azure Cosmos DB automatycznie dodaje właściwości (kolumny) do tabeli w razie potrzeby. Użyj przycisku Dodaj pole niestandardowe , aby dodać co najmniej jedną nową właściwości i zademonstrować tę możliwość.

Zrzut ekranu aplikacji przedstawiający okno dialogowe używane do wstawiania danych przy użyciu obiektu z polami niestandardowymi.

Użyj przycisku Wstaw przykładowe dane , aby załadować przykładowe dane do tabeli usługi Azure Cosmos DB.

Zrzut ekranu aplikacji przedstawiający lokalizację przycisku wstawiania przykładowych danych.

Wybierz element Filtruj wyniki w górnym menu, który ma zostać przeniesiony do strony Wyniki filtrowania. Na tej stronie wypełnij kryteria filtrowania, aby pokazać, jak można skompilować i przekazać klauzulę filtru do interfejsu API tabel usługi Azure Cosmos DB.

Zrzut ekranu aplikacji przedstawiający stronę wyników filtrowania i wyróżnianie elementu menu używanego do przechodzenia do strony.

Czyszczenie zasobów

Po zakończeniu pracy z przykładową aplikacją należy usunąć wszystkie zasoby platformy Azure powiązane z tym artykułem z konta platformy Azure. Można to zrobić, usuwając grupę zasobów.

Grupę zasobów można usunąć przy użyciu Azure Portal, wykonując następujące czynności.

Instrukcje Zrzut ekranu
Aby przejść do grupy zasobów, na pasku wyszukiwania wpisz nazwę grupy zasobów. Następnie na karcie Grupy zasobów wybierz nazwę grupy zasobów. Zrzut ekranu przedstawiający sposób wyszukiwania grupy zasobów.
Wybierz pozycję Usuń grupę zasobów na pasku narzędzi w górnej części strony grupy zasobów. Zrzut ekranu przedstawiający lokalizację przycisku Usuń grupę zasobów.
Po prawej stronie ekranu zostanie wyświetlone okno dialogowe z prośbą o potwierdzenie usunięcia grupy zasobów.
  1. Wpisz pełną nazwę grupy zasobów w polu tekstowym, aby potwierdzić usunięcie zgodnie z instrukcjami.
  2. Wybierz przycisk Usuń w dolnej części strony.
Zrzut ekranu przedstawiający okno dialogowe potwierdzenia dotyczące usuwania grupy zasobów.

Następne kroki

W tym przewodniku Szybki start wyjaśniono sposób tworzenia konta usługi Azure Cosmos DB, tworzenia tabeli za pomocą Eksploratora danych i uruchamiania aplikacji. Teraz możesz wykonywać zapytania dotyczące danych przy użyciu interfejsu API dla tabeli.