ynamoDBMapper Kelas D - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

ynamoDBMapper Kelas D

Kelas DynamoDBMapper adalah titik masuk ke Amazon DynamoDB. Kelas ini menyediakan akses ke titik akhir DynamoDB dan memungkinkan Anda mengakses data Anda dalam berbagai tabel. Ini juga memungkinkan Anda untuk melakukan berbagai operasi create, read, update, dan delete (CRUD) pada item, dan menjalankan query dan scan terhadap tabel. Kelas ini menyediakan metode berikut agar berfungsi dengan DynamoDB.

Untuk dokumentasi Javadoc yang sesuai, lihat D ynamoDBMapper di Referensi.AWS SDK for Java API

save

Menyimpan objek tertentu ke tabel. Objek yang ingin Anda simpan adalah satu-satunya parameter yang diperlukan untuk metode ini. Anda dapat memberikan parameter konfigurasi opsional menggunakan objek DynamoDBMapperConfig.

Jika item yang memiliki kunci primer yang sama tidak ada, metode ini akan membuat item baru dalam tabel. Jika item yang memiliki kunci primer yang sama ada, item yang ada akan diperbarui. Jika kunci partisi dan kunci sortir bertipe String dan dianotasi@DynamoDBAutoGeneratedKey, mereka diberi pengidentifikasi unik universal acak (UUID) jika dibiarkan tidak diinisialisasi. Bidang versi yang diberi anotasi dengan @DynamoDBVersionAttribute bertambah satu. Selain itu, jika bidang versi diperbarui atau kunci dibuat, objek yang diteruskan akan diperbarui sebagai hasil operasi.

Secara default, hanya atribut yang sesuai dengan properti kelas yang dipetakan yang akan diperbarui. Atribut tambahan yang ada pada item tidak akan terpengaruh. Namun, jika menentukan SaveBehavior.CLOBBER, Anda dapat memaksa item untuk ditimpa sepenuhnya.

DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build(); mapper.save(item, config);

Jika penentuan versi diaktifkan, versi item sisi klien dan sisi server harus cocok. Namun, versi tidak harus cocok jika opsi SaveBehavior.CLOBBER digunakan. Untuk informasi selengkapnya tentang penentuan versi, lihat Penguncian Optimis dengan nomor versi.

muat

Mengambil item dari tabel. Anda harus menyediakan kunci primer item yang ingin Anda ambil. Anda dapat memberikan parameter konfigurasi opsional menggunakan objek DynamoDBMapperConfig. Misalnya, Anda secara opsional dapat meminta bacaan sangat konsisten untuk memastikan bahwa metode ini hanya mengambil nilai item terbaru seperti yang ditunjukkan dalam pernyataan Java berikut.

DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build(); CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);

Secara default, DynamoDB akan mengembalikan item yang memiliki nilai yang akhirnya konsisten. Untuk informasi tentang model konsistensi akhir DynamoDB, lihat Konsistensi baca.

hapus

Menghapus item dari tabel. Anda harus meneruskan instans objek dari kelas yang dipetakan.

Jika penentuan versi diaktifkan, versi item sisi klien dan sisi server harus cocok. Namun, versi tidak harus cocok jika opsi SaveBehavior.CLOBBER digunakan. Untuk informasi selengkapnya tentang penentuan versi, lihat Penguncian Optimis dengan nomor versi.

kueri

Mengkueri tabel atau indeks sekunder.

Misalnya, Anda memiliki tabel, Reply, yang menyimpan balasan utas forum. Setiap subjek utas dapat berisi nol atau beberapa balasan. Kunci primer tabel Reply terdiri dari bidang Id dan ReplyDateTime, dengan Id sebagai kunci partisi dan ReplyDateTime sebagai kunci urutan kunci primer.

Reply ( Id, ReplyDateTime, ... )

Misalnya, Anda membuat pemetaan antara kelas Reply dan tabel Reply yang sesuai di DynamoDB. Kode Java berikut menggunakan DynamoDBMapper untuk menemukan semua balasan dalam dua minggu terakhir untuk subjek utas tertentu.

contoh
String forumName = "&DDB;"; String forumSubject = "&DDB; Thread 1"; String partitionKey = forumName + "#" + forumSubject; long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L); Date twoWeeksAgo = new Date(); twoWeeksAgo.setTime(twoWeeksAgoMilli); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); String twoWeeksAgoStr = df.format(twoWeeksAgo); Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS(partitionKey)); eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString())); DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>() .withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2") .withExpressionAttributeValues(eav); List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);

Kueri ini mengembalikan koleksi objek Reply.

Secara default, metode query mengembalikan koleksi "lazy-loaded". Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, iterasikan ke koleksi latestReplies.

Perhatikan bahwa memanggil metode size() pada koleksi akan memuat setiap hasil untuk memberikan jumlah yang akurat. Hal ini dapat mengakibatkan banyak throughput yang disediakan dikonsumsi, dan pada meja yang sangat besar bahkan bisa menghabiskan semua memori di Anda. JVM

Untuk mencari indeks, Anda harus membuat model indeks sebagai kelas pemeta terlebih dahulu. Misalkan Reply tabel memiliki indeks sekunder global bernama PostedBy-Message-Index. Kunci partisi untuk indeks ini adalah PostedBy, dan kunci urutannya adalah Message. Definisi kelas untuk item dalam indeks akan tampak seperti berikut ini.

@DynamoDBTable(tableName="Reply") public class PostedByMessage { private String postedBy; private String message; @DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "PostedBy") public String getPostedBy() { return postedBy; } public void setPostedBy(String postedBy) { this.postedBy = postedBy; } @DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "Message") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } // Additional properties go here. }

Anotasi @DynamoDBTable menunjukkan bahwa indeks ini terkait dengan tabel Reply. @DynamoDBIndexHashKeyAnotasi menunjukkan kunci partisi (PostedBy) dari indeks, dan @DynamoDBIndexRangeKey menunjukkan kunci sortir (Pesan) dari indeks.

Sekarang, Anda dapat menggunakan DynamoDBMapper untuk mengkueri indeks, mengambil subset pesan yang diposting oleh pengguna tertentu. Anda tidak perlu menentukan nama indeks jika Anda tidak memiliki pemetaan yang bertentangan di seluruh tabel dan indeks serta pemetaan sudah dibuat di mapper. Pemeta akan menyimpulkan berdasarkan kunci primer dan kunci urutan. Kode berikut mengkueri indeks sekunder global. Karena indeks sekunder global mendukung bacaan akhir konsisten tetapi bukan bacaan sangat konsisten, Anda harus menentukan withConsistentRead(false).

HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("User A")); eav.put(":v2", new AttributeValue().withS("DynamoDB")); DynamoDBQueryExpression<PostedByMessage> queryExpression = new DynamoDBQueryExpression<PostedByMessage>() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false) .withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)") .withExpressionAttributeValues(eav); List<PostedByMessage> iList = mapper.query(PostedByMessage.class, queryExpression);

Kueri ini mengembalikan koleksi objek PostedByMessage.

queryPage

Mencari tabel atau indeks sekunder dan mengembalikan satu halaman dari hasil yang cocok. Seperti metode query, Anda harus menentukan nilai kunci partisi dan filter kueri yang diterapkan pada atribut kunci urutan. Namun, queryPage hanya mengembalikan “halaman” pertama data, yaitu jumlah data yang sesuai dalam ukuran 1 MB

scan

Memindai seluruh tabel atau indeks sekunder. Anda dapat menentukan FilterExpression untuk memfilter kumpulan hasil secara opsional.

Misalnya, Anda memiliki tabel, Reply, yang menyimpan balasan utas forum. Setiap subjek utas dapat berisi nol atau beberapa balasan. Kunci primer tabel Reply terdiri dari bidang Id dan ReplyDateTime, dengan Id sebagai kunci partisi dan ReplyDateTime sebagai kunci urutan kunci primer.

Reply ( Id, ReplyDateTime, ... )

Jika memetakan kelas Java ke tabel Reply, Anda dapat menggunakan DynamoDBMapper untuk memindai tabel. Misalnya, kode Java berikut memindai seluruh tabel Reply, sehingga hanya mengembalikan balasan untuk tahun tertentu.

contoh
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":v1", new AttributeValue().withS("2015")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("begins_with(ReplyDateTime,:v1)") .withExpressionAttributeValues(eav); List<Reply> replies = mapper.scan(Reply.class, scanExpression);

Secara default, metode scan mengembalikan koleksi "lazy-loaded". Metode ini awalnya hanya mengembalikan satu halaman hasil, lalu membuat panggilan layanan untuk halaman berikutnya jika diperlukan. Untuk mendapatkan semua item yang cocok, iterasikan ke koleksi replies.

Perhatikan bahwa memanggil metode size() pada koleksi akan memuat setiap hasil untuk memberikan jumlah yang akurat. Hal ini dapat mengakibatkan banyak throughput yang disediakan dikonsumsi, dan pada meja yang sangat besar bahkan bisa menghabiskan semua memori di Anda. JVM

Untuk memindai indeks, Anda harus membuat model indeks sebagai kelas pemeta terlebih dahulu. Misalkan tabel Reply memiliki indeks sekunder global bernama PostedBy-Message-Index. Kunci partisi untuk indeks ini adalah PostedBy, dan kunci urutannya adalah Message. Kelas pemeta untuk indeks ini ditampilkan di bagian kueri. Kelas ini menggunakan anotasi @DynamoDBIndexHashKey dan @DynamoDBIndexRangeKey untuk menentukan kunci partisi indeks dan kunci urutan.

Contoh kode berikut memindai PostedBy-Message-Index. Contoh kode ini tidak menggunakan filter pemindaian, sehingga semua item dalam indeks dikembalikan kepada Anda.

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withIndexName("PostedBy-Message-Index") .withConsistentRead(false); List<PostedByMessage> iList = mapper.scan(PostedByMessage.class, scanExpression); Iterator<PostedByMessage> indexItems = iList.iterator();

scanPage

Memindai tabel atau indeks sekunder dan mengembalikan satu halaman yang berisi hasil yang cocok. Seperti halnya metode scan, Anda dapat menentukan FilterExpression untuk memfilter kumpulan hasil secara opsional. Namun, scanPage hanya mengembalikan “halaman” pertama untuk data, yaitu jumlah data yang sesuai dalam ukuran 1 MB.

parallelScan

Melakukan pemindaian paralel dari seluruh tabel atau indeks sekunder. Anda menentukan sejumlah segmen logis untuk tabel, beserta ekspresi pemindaian untuk memfilter hasil. parallelScan membagi tugas pemindaian antara beberapa pekerja, satu tugas untuk setiap segmen logis; pekerja akan memproses data secara paralel dan mengembalikan hasilnya.

Contoh kode Java berikut melakukan pemindaian paralel pada tabel Product.

int numberOfThreads = 4; Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":n", new AttributeValue().withN("100")); DynamoDBScanExpression scanExpression = new DynamoDBScanExpression() .withFilterExpression("Price <= :n") .withExpressionAttributeValues(eav); List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression, numberOfThreads);

Untuk contoh kode Java yang menggambarkan penggunaan parallelScan, lihat Operasi kueri dan pindai DynamoDBMapper.

batchSave

Menyimpan objek ke satu atau beberapa tabel menggunakan satu atau beberapa panggilan ke metode AmazonDynamoDB.batchWriteItem. Metode ini tidak memberikan jaminan transaksi.

Kode Java berikut menyimpan dua item (buku) ke tabel ProductCatalog.

Book book1 = new Book(); book1.setId(901); book1.setProductCategory("Book"); book1.setTitle("Book 901 Title"); Book book2 = new Book(); book2.setId(902); book2.setProductCategory("Book"); book2.setTitle("Book 902 Title"); mapper.batchSave(Arrays.asList(book1, book2));

batchLoad

Mengambil beberapa item dari satu atau beberapa tabel menggunakan kunci primernya.

Kode Java berikut akan mengambil dua item dari dua tabel yang berbeda.

ArrayList<Object> itemsToGet = new ArrayList<Object>(); ForumItem forumItem = new ForumItem(); forumItem.setForumName("Amazon DynamoDB"); itemsToGet.add(forumItem); ThreadItem threadItem = new ThreadItem(); threadItem.setForumName("Amazon DynamoDB"); threadItem.setSubject("Amazon DynamoDB thread 1 message text"); itemsToGet.add(threadItem); Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);

batchDelete

Menghapus objek dari satu atau beberapa tabel menggunakan satu atau beberapa panggilan ke metode AmazonDynamoDB.batchWriteItem. Metode ini tidak memberikan jaminan transaksi.

Kode Java berikut akan menghapus dua item (buku) dari tabel ProductCatalog.

Book book1 = mapper.load(Book.class, 901); Book book2 = mapper.load(Book.class, 902); mapper.batchDelete(Arrays.asList(book1, book2));

batchWrite

Menyimpan objek ke dan menghapus objek dari satu atau beberapa tabel menggunakan satu atau bebrapa panggilan ke metode AmazonDynamoDB.batchWriteItem. Metode ini tidak memberikan jaminan transaksi atau penentuan versi dukungan (penempatan atau penghapusan bersyarat).

Kode Java berikut menulis item baru ke tabel Forum, menulis item baru ke tabel Thread, dan menghapus item dari tabel ProductCatalog.

// Create a Forum item to save Forum forumItem = new Forum(); forumItem.setName("Test BatchWrite Forum"); // Create a Thread item to save Thread threadItem = new Thread(); threadItem.setForumName("AmazonDynamoDB"); threadItem.setSubject("My sample question"); // Load a ProductCatalog item to delete Book book3 = mapper.load(Book.class, 903); List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem); List<Book> objectsToDelete = Arrays.asList(book3); mapper.batchWrite(objectsToWrite, objectsToDelete);

transactionWrite

Menyimpan objek ke dan menghapus objek dari satu atau beberapa tabel menggunakan satu panggilan ke metode AmazonDynamoDB.transactWriteItems.

Untuk daftar pengecualian khusus transaksi, lihat kesalahan. TransactWriteItems

Untuk informasi selengkapnya tentang transaksi DynamoDB dan jaminan atomisitas, konsistensi, isolasi, dan daya tahan ACID () yang disediakan, lihat Amazon DynamoDB Transactions.

catatan

Metode ini tidak mendukung hal berikut:

Kode Java berikut akan menulis item baru untuk setiap tabel Forum dan Thread, secara transaksional.

Thread s3ForumThread = new Thread(); s3ForumThread.setForumName("S3 Forum"); s3ForumThread.setSubject("Sample Subject 1"); s3ForumThread.setMessage("Sample Question 1"); Forum s3Forum = new Forum(); s3Forum.setName("S3 Forum"); s3Forum.setCategory("Amazon Web Services"); s3Forum.setThreads(1); TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest(); transactionWriteRequest.addPut(s3Forum); transactionWriteRequest.addPut(s3ForumThread); mapper.transactionWrite(transactionWriteRequest);

transactionLoad

Memuat objek dari satu atau beberapa tabel menggunakan satu panggilan ke metode AmazonDynamoDB.transactGetItems.

Untuk daftar pengecualian khusus transaksi, lihat kesalahan. TransactGetItems

Untuk informasi selengkapnya tentang transaksi DynamoDB dan jaminan atomisitas, konsistensi, isolasi, dan daya tahan ACID () yang disediakan, lihat Amazon DynamoDB Transactions.

Kode Java berikut akan memuat satu item dari setiap tabel Forum dan Thread, secara transaksional.

Forum dynamodbForum = new Forum(); dynamodbForum.setName("DynamoDB Forum"); Thread dynamodbForumThread = new Thread(); dynamodbForumThread.setForumName("DynamoDB Forum"); TransactionLoadRequest transactionLoadRequest = new TransactionLoadRequest(); transactionLoadRequest.addLoad(dynamodbForum); transactionLoadRequest.addLoad(dynamodbForumThread); mapper.transactionLoad(transactionLoadRequest);

count

Mengevaluasi ekspresi pemindaian yang ditentukan dan mengembalikan jumlah item yang cocok. Tidak ada data item yang dikembalikan.

generateCreateTablePermintaan

Parsing POJO kelas yang mewakili tabel DynamoDB, dan mengembalikan CreateTableRequest untuk tabel itu.

Membuat tautan ke objek di Amazon S3. Anda harus menentukan nama bucket dan nama kunci, yang secara unik mengidentifikasi objek di bucket.

Untuk menggunakan createS3Link, kelas pemeta Anda harus menentukan metode getter dan setter. Contoh kode berikut mengilustrasikan hal ini dengan menambahkan atribut baru dan metode getter/setter untuk kelas CatalogItem.

@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { ... public S3Link productImage; .... @DynamoDBAttribute(attributeName = "ProductImage") public S3Link getProductImage() { return productImage; } public void setProductImage(S3Link productImage) { this.productImage = productImage; } ... }

Kode Java berikut mendefinisikan item baru yang akan ditulis ke tabel Product. Item tersebut termasuk link ke gambar produk; data gambar diunggah ke Amazon S3.

CatalogItem item = new CatalogItem(); item.setId(150); item.setTitle("Book 150 Title"); String myS3Bucket = "myS3bucket"; String myS3Key = "productImages/book_150_cover.jpg"; item.setProductImage(mapper.createS3Link(myS3Bucket, myS3Key)); item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg")); mapper.save(item);

Kelas S3Link menyediakan banyak metode lain untuk memanipulasi objek di Amazon S3. Untuk informasi selengkapnya, lihat Javadocs untuk S3Link.

GetS3 ClientCache

Mengembalikan S3ClientCache yang mendasarinya untuk mengakses Amazon S3. S3ClientCache adalah Peta cerdas untuk objek AmazonS3Client. Jika Anda memiliki banyak klien, an S3ClientCache dapat membantu Anda menjaga klien tetap terorganisir berdasarkan AWS Wilayah, dan dapat membuat klien Amazon S3 baru sesuai permintaan.