ddb-write-read-example-01
Description
This example's purpose is to support the LocalStack on using the platform with Java AWS applications.
Prerequisites
- Maven 3.8.5+ & Java 17
- LocalStack
- Docker - for running LocalStack
- AWS CLI and awslocal
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
📄️ ddb-create-table-example-01
Description
📄️ ddb-write-read-example-01
Description
📄️ ddb-delete-table-example-01
Description
📄️ ddb-enh-client-spring-boot-1
We will describe two ways for accessing DynamoDB from Spring applications:
📄️ ddb-spring-data-1
We will describe two ways for accessing DynamoDB from Spring applications:
📄️ Spring Boot SNS Lambda DynamoDB
Description