DynamodDb access in Java(Code)

By | December 31, 2021
Share the joy
  •  
  •  
  •  
  •  
  •  
  •  

Assume we have below data in DynamoDb. All fields are String type. PK is ID, SK is name.

ddb_data

We useĀ DynamoDbEnhancedAsyncClient to access DynamoDb data.

To get a specific record with (PK, SK):

public static void testGetItem() throws Exception {
    CompletableFuture<Record> recordFuture = table.getItem(Key.builder()
            .partitionValue("001")
            .sortValue(33)
            .build());
    System.out.println(recordFuture.get());
}

To query only on PK:

public static void testQueryNormal() throws Exception {
    QueryConditional queryConditional = QueryConditional.keyEqualTo(Key.builder()
            .partitionValue("003")
            .build());
    PagePublisher<Record> pagePublisher = table.query(queryConditional);
    Flux<Page<Record>> recordFlux = Flux.from(pagePublisher);
    recordFlux.subscribe(record -> {
        System.out.println(record.items());
    });
    Thread.sleep(2000l);
}

To query on (PK, SK prefix):

public static void testQuerySomeSortKey() throws Exception {
    QueryConditional queryConditional = QueryConditional.sortBeginsWith(Key.builder()
            .partitionValue("002")
            .sortValue("pp")
            .build());
    PagePublisher<Record> pagePublisher = table.query(queryConditional);
    Flux<Page<Record>> recordFlux = Flux.from(pagePublisher);
    recordFlux.subscribe(record -> {
        System.out.println(record.items());
        System.out.println(record.lastEvaluatedKey());
    });
    Thread.sleep(2000l);
}

To query with pagination:

public Mono<RecordWithLastKey> queryPagination1stCall() throws Exception {
    QueryConditional queryConditional = QueryConditional.keyEqualTo(Key.builder()
            .partitionValue("003")
            .build());
    QueryEnhancedRequest enhancedRequest = QueryEnhancedRequest.builder()
            .queryConditional(queryConditional)
            .limit(2)
            .build();
    PagePublisher<Record> pagePublisher = table.query(enhancedRequest);
    Flux<Page<Record>> recordFlux = Flux.from(pagePublisher);

    return recordFlux.next()
            .map(record -> new RecordWithLastKey(record.items(), getRecordKey(record.lastEvaluatedKey())));
}

public Mono<RecordWithLastKey> queryPaginationNextCall(String pk, String sk) throws Exception {
    QueryConditional queryConditional = QueryConditional.keyEqualTo(Key.builder()
            .partitionValue("003")
            .build());
    Map<String, AttributeValue> lastEvaluatedKey = new HashMap<>();
    lastEvaluatedKey.put("ID", AttributeValue.builder().s(pk).build());
    lastEvaluatedKey.put("NAME", AttributeValue.builder().s(sk).build());
    QueryEnhancedRequest enhancedRequest = QueryEnhancedRequest.builder()
            .queryConditional(queryConditional)
            .exclusiveStartKey(lastEvaluatedKey)
            .limit(2)
            .build();

    PagePublisher<Record> pagePublisher = table.query(enhancedRequest);
    Flux<Page<Record>> recordFlux = Flux.from(pagePublisher);

    return recordFlux.next()
            .map(record -> new RecordWithLastKey(record.items(), getRecordKey(record.lastEvaluatedKey())));
}

private RecordKey getRecordKey(Map<String, AttributeValue> valueMap) {
    RecordKey recordKey = null;
    if (valueMap != null) {
        recordKey = RecordKey.builder()
                .pk(valueMap.get("ID").s())
                .sk(valueMap.get("NAME").s())
                .build();
    }
    return recordKey;
}

record1

record2

record3

see code on github.