Skip to main content

ddb-write-read-example-01

Description

This example's purpose is to support the LocalStack on using the platform with Java AWS applications.

Prerequisites

Run LocalStack

Create table

awslocal dynamodb create-table \
--table-name person \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

Project Structure

.
├── pom.xml
├── README.md
└── src
└── main
├── java
│   └── v2
│   └── dynamodb
│   ├── DynamoDBService.java
│   ├── PersonBirthdateConverter.java
│   └── Person.java
└── resources

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>cloud.localstack</groupId>
<artifactId>ddb-write-read-example-01</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<exec.cleanupDaemonThreads>false</exec.cleanupDaemonThreads>
</properties>

<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-enhanced</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.20.47</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>

Person.java

package v2.dynamodb;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbConvertedBy;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey;

@DynamoDbBean
public class Person {

private String id;
private String name;
private Date birthdate;

@DynamoDbPartitionKey
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@DynamoDbConvertedBy(PersonBirthdateConverter.class)
public Date getBirthdate() {
return birthdate;
}

public void setBirthdate(Date birthdate) {
this.birthdate = birthdate;
}

public String getBirthdateAsString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(birthdate);
}

public void setBirthdateFromString(String birthdateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
this.birthdate = sdf.parse(birthdateStr);
}

@Override
public String toString() {
return "Person{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", birthdate=" + birthdate +
'}';
}
}

DynamoDBService.java

package v2.dynamodb;

import java.net.URI;
import java.text.ParseException;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

public class DynamoDBService {

// credentials that can be replaced with real AWS values
private static final String ACCESS_KEY = "test";
private static final String SECRET_KEY = "test";
private static String TABLE_NAME = "person";
private static AwsCredentialsProvider credentials = StaticCredentialsProvider.create(
AwsBasicCredentials.create(ACCESS_KEY, SECRET_KEY));

// create the dynamoDB client using the credentials and specific region
private static Region region = Region.US_EAST_1;

// create a dynamoDB client
private static DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
.region(region)
.credentialsProvider(
credentials)
.endpointOverride(URI.create("https://localhost.localstack.cloud:4566"))
.build();

public static void main(String[] args) throws ParseException {
String personId1 = "100012356";

addEntryToDynamoDB(personId1);

readEntryFromDynamoDB(personId1);
}

private static void readEntryFromDynamoDB(String personId) {
try {

DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(dynamoDbClient)
.build();
DynamoDbTable<Person> table = enhancedClient.table(TABLE_NAME,
TableSchema.fromBean(Person.class));

Person person = table.getItem(Key.builder().partitionValue(personId).build());

// do something with the person object
if (person != null) {
System.out.println("Retrieved Person: " + person);
} else {
System.out.println("Person with ID " + personId + " not found.");
}
} catch (DynamoDbException exception) {
System.out.println("Something happened: " + exception.getMessage());
}
}

private static void addEntryToDynamoDB(String personID) throws ParseException {
try {
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(dynamoDbClient)
.build();

// create the Person object
Person person = new Person();
person.setId(personID);
person.setName("John Doe");
person.setBirthdateFromString("1979-01-01");

// use the enhanced client to interact with the table
DynamoDbTable<Person> table = enhancedClient.table(TABLE_NAME,
TableSchema.fromBean(Person.class));
table.putItem(person);

System.out.println("Entry added successfully!");
} catch (DynamoDbException exception) {
System.out.println("An error occurred: " + exception.getMessage());
}
}
}

Running and Testing

mvn clean package
mvn exec:java -Dexec.mainClass="v2.dynamodb.DynamoDBService"

Output:

Entry added successfully!
Retrieved Person: Person{id='100012356', name='John Doe', birthdate=Mon Jan 01 00:00:00 CET 1979}

awslocal dynamodb get-item --consistent-read \
--table-name person \
--key '{ "id": {"S": "100012356"}}'

Output:

{
"Item": {
"name": {
"S": "John Doe"
},
"birthdate": {
"S": "1979-01-01"
},
"id": {
"S": "100012356"
}
}
}

awslocal dynamodb execute-statement --statement "SELECT * FROM person"

Output:

{
"Items": [
{
"name": {
"S": "John Doe"
},
"birthdate": {
"S": "1979-01-01"
},
"id": {
"S": "100012356"
}
}
]
}

Source Code

https://github.com/ZbCiok/zjc-examples/tree/main/aws/aws/dynamodb/ddb-write-read-example-01