Java için Azure Tabloları istemci kitaplığını kullanma

ŞUNLAR IÇIN GEÇERLIDIR: Tablo

İpucu

Bu makaledeki içerik, Azure Tablo depolama ve Tablo için Azure Cosmos DB için geçerlidir. Tablo için Azure Cosmos DB, aktarım hızı için iyileştirilmiş tablolar, genel dağıtım ve otomatik ikincil dizinler sunan bir premium tablo depolama teklifidir.

Bu makalede tablo oluşturma, verilerinizi depolama ve söz konusu veriler üzerinde CRUD işlemleri gerçekleştirme işlemleri gösterilir. Örnekler Java dilinde yazılır ve Java için Azure Tabloları istemci kitaplığını kullanır. Tablo oluşturma, listeleme ve silme işlemlerinin yanı sıra bir tablodaki varlıkları ekleme, sorgulama, değiştirme ve silme işlemleri ele alınmaktadır. Tablolar hakkında daha fazla bilgi için Sonraki adımlar’a bakın.

Önemli

Tablo Depolama ve Azure Cosmos DB Tablosunu destekleyen Azure Tabloları istemci kitaplığının son sürümü 12+.

Azure hizmet hesabı oluşturma

Azure Tablo depolama alanını veya Azure Cosmos DB'yi kullanarak tablolarla çalışabilirsiniz. Bu iki hizmetteki tablo teklifleri arasındaki farklar hakkında daha fazla bilgi edinmek için bkz. Tabloya genel bakış API'sine bakın. Kullanacağınız hizmet için bir hesap oluşturmanız gerekir. Aşağıdaki bölümlerde hem Azure Tablo depolamanın hem de Azure Cosmos DB hesabının nasıl oluşturulacağı gösterilir, ancak bunlardan yalnızca birini kullanabilirsiniz.

Azure depolama hesabı oluşturma

Azure depolama hesabı oluşturmanın en kolay yolu Azure portal kullanmaktır. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.

Azure PowerShell veya Azure CLI kullanarak da bir Azure depolama hesabı oluşturabilirsiniz.

Şu anda bir depolama hesabı oluşturmamayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azure Depolama Öykünücüsü'ni de kullanabilirsiniz. Daha fazla bilgi için bkz. Geliştirme ve test için Azure Depolama Öykünücüsü'ni kullanma.

Azure Cosmos DB hesabı oluşturma

Tablo hesabı için Azure Cosmos DB oluşturma yönergeleri için bkz. Veritabanı hesabı oluşturma.

Java uygulaması oluşturma

Bu makaledeki örnekleri kullanmak için:

  1. Java Development Kit'i (JDK) yükleyin.
  2. Azure aboneliğinizde bir Azure depolama hesabı veya Azure Cosmos DB hesabı oluşturun.
  3. Geliştirme sisteminizin GitHub'daki Java deposu için Azure Tabloları istemci kitaplığında listelenen en düşük gereksinimleri ve bağımlılıkları karşıladığını doğrulayın.
  4. Java için Azure Depolama Kitaplıklarını bu depodan indirip sisteminize yüklemek için yönergeleri izleyin.
  5. Bu makaledeki örnekleri kullanan bir Java uygulaması oluşturun.

Uygulamanızı Tablo Depolama'ya erişecek şekilde yapılandırma

pom.xml dosyanızın dependencies bölümüne aşağıdaki girdiyi ekleyin:

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

Ardından, tablolara erişmek için Azure Tabloları API'lerini kullanmak istediğiniz Java dosyasının en üstüne aşağıdaki import deyimleri ekleyin:

// Include the following imports to use table APIs
import com.azure.data.tables.TableClient;
import com.azure.data.tables.TableClientBuilder;
import com.azure.data.tables.TableServiceClient;
import com.azure.data.tables.TableServiceClientBuilder;
import com.azure.data.tables.models.ListEntitiesOptions;
import com.azure.data.tables.models.TableEntity;
import com.azure.data.tables.models.TableEntityUpdateMode;
import com.azure.data.tables.models.TableTransactionAction;
import com.azure.data.tables.models.TableTransactionActionType;

Bağlantı dizenizi ekleme

Azure depolama hesabına veya Tablo için Azure Cosmos DB hesabına bağlanabilirsiniz. Kullandığınız hesabın türüne göre bağlantı dizesini alın.

Azure Depolama bağlantı dizesi ekleme

Azure Tabloları istemcisi, veri yönetimi hizmetlerine erişmek için uç noktaları ve kimlik bilgilerini depolamak için bir depolama bağlantı dizesi kullanabilir. İstemci uygulamasında çalışırken, Depolama hesabınızın adını ve AccountName ve AccountKey değerlerinin Azure portal listelenen Depolama hesabının Birincil erişim anahtarını kullanarak Depolama bağlantı dizesini aşağıdaki biçimde sağlamanız gerekir.

Bu örnekte bağlantı dizesini tutmak için nasıl statik bir alan bildirebileceğiniz gösterilmektedir:

// Define the connection-string with your values.
public final String connectionString =
    "DefaultEndpointsProtocol=http;" +
    "AccountName=your_storage_account;" +
    "AccountKey=your_storage_account_key;" +
    "EndpointSuffix=core.windows.net";

Tablo için Azure Cosmos DB bağlantı dizesi ekleme

Azure Cosmos DB hesabı, tablo uç noktasını ve kimlik bilgilerinizi depolamak için bir bağlantı dizesi kullanır. İstemci uygulamasında çalışırken, Azure Cosmos DB hesabınızın adını ve AccountName ve AccountKey değerlerinin Azure portal listelenen hesabın birincil erişim anahtarını kullanarak Azure Cosmos DB bağlantı dizesini aşağıdaki biçimde sağlamanız gerekir.

Bu örnekte Azure Cosmos DB bağlantı dizesini tutmak için nasıl statik bir alan bildirebileceğiniz gösterilmektedir:

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

Azure'da bir rol içinde çalışan bir uygulamada bu dizeyi ServiceConfiguration.cscfg hizmet yapılandırma dosyasında depolayabilirsiniz. Yöntemine System.getenv bir çağrı ile erişebilirsiniz. Hizmet yapılandırma dosyasında ConnectionString adlı bir Setting öğesinden bağlantı dizesini alma örneği aşağıda verilmiştir:

// Retrieve storage account from connection-string.
String connectionString = System.getenv("ConnectionString");

Bağlantı dizenizi projenin config.properties dosyasında da depolayabilirsiniz:

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

Aşağıdaki örnekler, depolama bağlantı dizesini almak için bu yöntemlerden birini kullandığınızı varsayar.

Bir tablo oluşturma

TableServiceClient Nesnesi tablolar oluşturmak, listelemek ve silmek için Tablolar hizmetiyle etkileşim kurmanızı sağlar. Aşağıdaki kod bir TableServiceClient nesnesi oluşturur ve bunu kullanarak adlı Employeestabloyu temsil eden yeni TableClient bir nesne oluşturur.

try
{
    final String tableName = "Employees";

    // Create a TableServiceClient with a connection string.
    TableServiceClient tableServiceClient = new TableServiceClientBuilder()
        .connectionString(connectionString)
        .buildClient();

    // Create the table if it not exists.
    TableClient tableClient = tableServiceClient.createTableIfNotExists(tableName);

}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Tabloları listeleme

Tabloların listesini almak için, tablo adlarının TableServiceClient.listTables yinelenebilir bir listesini almak için yöntemini çağırın.

try
{
    // Create a TableServiceClient with a connection string.
    TableServiceClient tableServiceClient = new TableServiceClientBuilder()
        .connectionString(connectionString)
        .buildClient();

    // Loop through a collection of table names.
    tableServiceClient.listTables().forEach(tableItem -> 
        System.out.printf(tableItem.getName())
    );
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Tabloya bir varlık ekleme

Aşağıdaki kod, depolanacak bazı müşteri verileriyle sınıfının yeni bir örneğini TableEntity oluşturur. Kod, nesnesinde upsertEntityTableClient yöntemini çağırır. Bu yöntem, yeni müşteri varlığını tabloya Employees ekler veya zaten varsa varlığın yerini alır.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
     TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Create a new employee TableEntity.
    String partitionKey = "Sales";
    String rowKey = "0001";
    Map<String, Object> personalInfo= new HashMap<>();
    personalInfo.put("FirstName", "Walter");
    personalInfo.put("LastName", "Harp");
    personalInfo.put("Email", "Walter@contoso.com");
    personalInfo.put("PhoneNumber", "425-555-0101");
    TableEntity employee = new TableEntity(partitionKey, rowKey).setProperties(personalInfo);
        
    // Upsert the entity into the table
    tableClient.upsertEntity(employee);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Toplu işlem varlık yerleştirme

Tablo hizmetine tek bir yazma işlemiyle çok sayıda varlık ekleyebilirsiniz. Aşağıdaki kod bir List<TableTransactionAction> nesnesi oluşturur ve ardından buna üç upsert işlemi ekler. Her işlem, yeni TableEntity bir nesne oluşturularak, özellikleri ayarlanarak ve nesnede submitTransactionTableClient yöntemini çağırarak eklenir.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    String partitionKey = "Sales";
    List<TableTransactionAction> tableTransactionActions = new ArrayList<>();
    
    Map<String, Object> personalInfo1 = new HashMap<>();
    personalInfo1.put("FirstName", "Jeff");
    personalInfo1.put("LastName", "Smith");
    personalInfo1.put("Email", "Jeff@contoso.com");
    personalInfo1.put("PhoneNumber", "425-555-0104");
    
    // Create an entity to add to the table.
    tableTransactionActions.add(new TableTransactionAction(
        TableTransactionActionType.UPSERT_MERGE,
        new TableEntity(partitionKey, "0001")
            .setProperties(personalInfo1)
    ));
    
    Map<String, Object> personalInfo2 = new HashMap<>();
    personalInfo2.put("FirstName", "Ben");
    personalInfo2.put("LastName", "Johnson");
    personalInfo2.put("Email", "Ben@contoso.com");
    personalInfo2.put("PhoneNumber", "425-555-0102");
    
    // Create another entity to add to the table.
    tableTransactionActions.add(new TableTransactionAction(
        TableTransactionActionType.UPSERT_MERGE,
        new TableEntity(partitionKey, "0002")
            .setProperties(personalInfo2)
    ));
    
    Map<String, Object> personalInfo3 = new HashMap<>();
    personalInfo3.put("FirstName", "Denise");
    personalInfo3.put("LastName", "Rivers");
    personalInfo3.put("Email", "Denise@contoso.com");
    personalInfo3.put("PhoneNumber", "425-555-0103");
    
    // Create a third entity to add to the table.
    tableTransactionActions.add(new TableTransactionAction(
        TableTransactionActionType.UPSERT_MERGE,
        new TableEntity(partitionKey, "0003")
            .setProperties(personalInfo3)
    ));

    // Submit transaction on the "Employees" table.
    tableClient.submitTransaction(tableTransactionActions);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Toplu işlemlerde dikkat edilecek bazı noktalar:

  • Tek bir toplu işlemdeki herhangi bir birleşimde en fazla 100 insert, delete, merge, replace, insert veya merge ve insert ya da replace işlemi gerçekleştirebilirsiniz.
  • Bir toplu işlem toplu iş içindeki tek işlemse bir retrieve işlemi içerebilir.
  • Tek bir toplu işlemdeki tüm varlıkların bölüm anahtarları aynı olmalıdır.
  • Toplu işlem 4 MB veri yükü ile sınırlıdır.

Tüm varlıkları bir bölüme alma

Bir bölümdeki varlıkların tablosunu sorgulamak için kullanabilirsiniz ListEntitiesOptions. Belirtilen sonuç türünü döndüren belirli bir tabloda sorgu oluşturmak için çağrısı ListEntitiesOptions.setFilter . Aşağıdaki kod, bölüm anahtarı olan Sales varlıklar için bir filtre belirtir. Sorgu nesnesi üzerinde çağrısıyla listEntities yürütüldüğünde TableClient , bir Iterator döndürür TableEntity. Daha sonra sonuçları kullanmak için "ForEach" döngüsünde döndürülen öğesini kullanabilirsiniz Iterator . Bu kod, sorgu sonuçlarındaki her varlığın alanlarını konsola yazdırır.

try
{
    // Define constants for filters.
    final String PARTITION_KEY = "PartitionKey";
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Create a filter condition where the partition key is "Sales".
    ListEntitiesOptions options = new ListEntitiesOptions().setFilter(PARTITION_KEY + " eq 'Sales'");

    // Loop through the results, displaying information about the entities.
    tableClient.listEntities(options, null, null).forEach(tableEntity -> {
        System.out.println(tableEntity.getPartitionKey() +
            " " + tableEntity.getRowKey() +
            "\t" + tableEntity.getProperty("FirstName") +
            "\t" + tableEntity.getProperty("LastName") +
            "\t" + tableEntity.getProperty("Email") +
            "\t" + tableEntity.getProperty("PhoneNumber"));
    });
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Bir bölüme bir grup varlık alma

Bir bölümdeki tüm varlıkları sorgulamak istemiyorsanız, bir filtrede karşılaştırma işleçlerini kullanarak bir aralık belirtin. Aşağıdaki kod, bölümdeki Sales tüm varlıkları '0001' ile '0004' arasında bir satır anahtarıyla almak için iki filtreyi birleştirir. Ardından sorgu sonuçlarını yazdırır. Bu kılavuzun toplu ekleme bölümünde tabloya eklenen varlıkları kullanırsanız, bu kez yalnızca iki varlık döndürülür (Ben ve Denise).

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

    // Create a TableServiceClient with a connection string.
    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Create a filter condition where the partition key is "Sales".
    ListEntitiesOptions options = new ListEntitiesOptions().setFilter(PARTITION_KEY + " eq 'Sales' AND " + ROW_KEY + " lt '0004' AND " + ROW_KEY + " gt '0001'");
    
    // Loop through the results, displaying information about the entities.
    tableClient.listEntities(options, null, null).forEach(tableEntity -> {
        System.out.println(tableEntity.getPartitionKey() +
            " " + tableEntity.getRowKey() +
            "\t" + tableEntity.getProperty("FirstName") +
            "\t" + tableEntity.getProperty("LastName") +
            "\t" + tableEntity.getProperty("Email") +
            "\t" + tableEntity.getProperty("PhoneNumber"));
    });
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Tek bir varlık alma

Tek, belirli bir varlığı almak üzere bir sorgu yazabilirsiniz. Aşağıdaki kod, bir oluşturmak ListEntitiesOptions ve aynı işlemi yapmak için filtreler kullanmak yerine "Jeff Smith" çalışanının varlığını almak için bölüm anahtarı ve satır anahtarı parametreleriyle çağrı TableClient.getEntity yapar. Yürütüldüğünde, retrieve işlemi bir koleksiyon yerine yalnızca bir varlık döndürür. Hiçbir null varlığın tam bölüm ve satır anahtarı eşleşmesi yoksa bir değer döndürülür. Bir sorguda hem bölüm hem de satır anahtarını belirtmek Tablo hizmetinden tek bir varlık almanın en hızlı yoludur.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Get the specific entity.
    TableEntity specificEntity = tableClient.getEntity("Sales", "0001");

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

Varlığı değiştirme

Bir varlığı değiştirmek için tablo hizmetinden alın, varlık nesnesinde değişiklikler yapın ve değişiklikleri bir replace veya merge işlemi ile tablo hizmetine geri kaydedin. Aşağıdaki kod mevcut bir müşterinin telefon numarasını değiştirir. Bu kod, eklemek için yaptığımız gibi çağrısı tableClient.upsertEntity yapmak yerine öğesini çağırır tableClient.updateEntity.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Get the specific entity.
    TableEntity specificEntity = tableClient.getEntity("Sales", "0001");

    // Specify a new phone number
    specificEntity.getProperties().put("PhoneNumber", "425-555-0105");

    // Update the specific entity
    tableClient.updateEntity(specificEntity, TableEntityUpdateMode.REPLACE);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Giriş özellikleri alt kümesi sorgulama

Tabloya gönderilen bir sorgu, bir varlıktan yalnızca birkaç özellik alabilir. Projeksiyon olarak adlandırılan bu yöntem bant genişliğini azaltır ve özellikle büyük varlıklar için sorgu performansını iyileştirebilir. Aşağıdaki koddaki sorgu, yalnızca tablodaki varlıkların e-posta adreslerini döndürmek için yöntemini kullanır ListEntitiesOptions.setSelect .

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Create a filter condition that retrieves only the Email property.
    List<String> attributesToRetrieve = new ArrayList<>();
    attributesToRetrieve.add("Email");
    
    ListEntitiesOptions options = new ListEntitiesOptions().setSelect(attributesToRetrieve);

    // Loop through the results, displaying the Email values.
    tableClient.listEntities(options, null, null).forEach(tableEntity -> {
        System.out.println(tableEntity.getProperty("Email"));
    });
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Varlık Ekleme veya Değiştirme

Genellikle tabloda zaten mevcut olup olmadığını bilmeden tabloya varlık eklemek istersiniz. Ekleme veya değiştirme işlemi, tek bir istekte bulunmanızı sağlar. Bu istek, mevcut değilse varlığı ekler veya varsa mevcut varlığı değiştirir. Önceki örneklere ek olarak, aşağıdaki kod "Walter Harp" varlığını ekler veya değiştirir. Yeni bir varlık oluşturduktan sonra bu kod yöntemini çağırır TableClient.upsertEntity .

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Create a new table entity.
    Map<String, Object> properties = new HashMap<>();
    properties.put("FirstName", "Walter");
    properties.put("LastName", "Harp");
    properties.put("Email", "Walter@contoso.com");
    properties.put("PhoneNumber", "425-555-0101");
        
    TableEntity newEmployee = new TableEntity("Sales", "0004")
        .setProperties(properties);
        
    // Add the new customer to the Employees table.
    tableClient.upsertEntity(newEmployee);
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Bir varlığı silme

Bölüm anahtarını ve satır anahtarını aracılığıyla TableClient.deleteEntitysağlayarak varlığı silebilirsiniz.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Delete the entity for partition key 'Sales' and row key '0001' from the table.
    tableClient.deleteEntity("Sales", "0001");
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

Bir tablo silme

Son olarak, aşağıdaki kod hesaptan bir tabloyu siler. Tabloyu sildikten yaklaşık 40 saniye sonra yeniden oluşturamazsınız.

try
{
    final String tableName = "Employees";

    // Create a TableClient with a connection string and a table name.
    TableClient tableClient = new TableClientBuilder()
        .connectionString(connectionString)
        .tableName(tableName)
        .buildClient();

    // Delete the table and all its data.
    tableClient.deleteTable();
}
catch (Exception e)
{
    // Output the stack trace.
    e.printStackTrace();
}

İpucu

Azure Depolama kod örnekleri havuzuna göz atın

İndirip çalıştırabileceğiniz kullanımı kolay uçtan uca Azure Depolama kod örnekleri lütfen Azure Depolama Örnekleri listemize bakın.

Sonraki adımlar

Daha fazla bilgi için bkz. Java geliştiricileri için Azure.