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 API, aktarım hızı için iyileştirilmiş tablolar, genel dağıtım ve otomatik ikincil dizinler sunan, tablo depolamaya yönelik premium bir tekliftir.

Bu makalede tablo oluşturma, verilerinizi depolama ve söz konusu veriler üzerinde CRUD işlemleri gerçekleştirme işlemleri gösterilmektedir. Ö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+ sürümüdür.

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 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österilmektedir, ancak bunlardan yalnızca birini kullanabilirsiniz.

Azure depolama hesabı oluşturma

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

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

Şu anda depolama hesabı oluşturmamak isterseniz, 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 Geliştirme Seti'ni (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. Bu depodan Sisteminize Java için Azure Depolama Kitaplıklarını indirip yüklemek için yönergeleri izleyin.
  5. Bu makaledeki örnekleri kullanan bir Java uygulaması oluşturun.

Uygulamanızı Tablo Depolama 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ı dizesi 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ı dizesi 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 depolama bağlantı dizesi kullanabilir. İstemci uygulamasında çalışırken, Depolama hesabınızın adını ve AccountName ve AccountKey değerleri için Azure portalında listelenen Depolama hesabının Birincil erişim anahtarını kullanarak Depolama bağlantı dizesi 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 bağlantı dizesi için Azure Cosmos DB 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ğerleri için Azure portalında listelenen hesabın birincil erişim anahtarını kullanarak Azure Cosmos DB bağlantı dizesi 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ındaki Bağlan ionString adlı bir Setting öğesinden bağlantı dizesi 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.

Tablo oluştur

Nesne TableServiceClient , tabloları oluşturmak, listelemek ve silmek için Tablolar hizmetiyle etkileşim kurmanızı sağlar. Aşağıdaki kod bir TableServiceClient nesne 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 yöntemini çağırarak TableServiceClient.listTables tablo adlarının yinelenebilir bir listesini alı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> nesne oluşturur ve ardından bu nesneye üç upsert işlemi ekler. Her işlem, yeni TableEntity bir nesne oluşturularak, özelliklerini ayarlayarak ve sonra 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 bir çağrısıyla listEntities yürütüldüğünde TableClient , bir Iterator döndürür TableEntity. Daha sonra Iterator sonuçları kullanmak için bir "ForEach" döngüsünde döndürülen kullanabilirsiniz. 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, "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; aynı işlemi yapmak için filtre ListEntitiesOptions oluşturmak ve kullanmak yerine. 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();
}

Varlığı silme

Bölüm anahtarını ve satır anahtarını aracılığıyla TableClient.deleteEntitysağlayarak bir 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();
}

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.