diff --git a/aws-modules/aws-dynamodb/.gitignore b/aws-modules/aws-dynamodb/.gitignore
new file mode 100644
index 0000000000..bf11a4cc38
--- /dev/null
+++ b/aws-modules/aws-dynamodb/.gitignore
@@ -0,0 +1,2 @@
+/target/
+.idea/
\ No newline at end of file
diff --git a/aws-modules/aws-dynamodb/README.md b/aws-modules/aws-dynamodb/README.md
new file mode 100644
index 0000000000..68a353e555
--- /dev/null
+++ b/aws-modules/aws-dynamodb/README.md
@@ -0,0 +1,7 @@
+## AWS DYNAMODB
+
+This module contains articles about AWS DynamoDB
+
+### Relevant articles
+- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests)
+
diff --git a/aws-modules/aws-dynamodb/pom.xml b/aws-modules/aws-dynamodb/pom.xml
new file mode 100644
index 0000000000..eee01badf3
--- /dev/null
+++ b/aws-modules/aws-dynamodb/pom.xml
@@ -0,0 +1,89 @@
+
+
+ 4.0.0
+ aws-dynamodb
+ 0.1.0-SNAPSHOT
+ aws-dynamodb
+ jar
+
+
+ com.baeldung
+ aws-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ com.google.code.gson
+ gson
+ ${gson.version}
+
+
+ com.amazonaws
+ DynamoDBLocal
+ ${dynamodblocal.version}
+ test
+
+
+ com.amazonaws
+ aws-java-sdk-dynamodb
+ ${aws-java-sdk.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ ${maven-shade-plugin.version}
+
+ false
+
+
+
+ package
+
+ shade
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ ${maven-plugins-version}
+
+
+ copy
+ compile
+
+ copy-dependencies
+
+
+
+ so,dll,dylib
+ native-libs
+
+
+
+
+
+
+
+
+ 2.8.0
+ 1.21.1
+ 1.10.L001
+ 0.9.4.0006L
+ 3.1.1
+
+
+
\ No newline at end of file
diff --git a/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java
new file mode 100644
index 0000000000..9af5d926c9
--- /dev/null
+++ b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/entity/ProductInfo.java
@@ -0,0 +1,51 @@
+package com.baeldung.dynamodb.entity;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
+
+@DynamoDBTable(tableName = "ProductInfo")
+public class ProductInfo {
+
+ private String id;
+ private String msrp;
+ private String cost;
+
+ public ProductInfo() {
+ }
+
+ public ProductInfo(String cost, String msrp) {
+ this.msrp = msrp;
+ this.cost = cost;
+ }
+
+ @DynamoDBHashKey
+ @DynamoDBAutoGeneratedKey
+ public String getId() {
+ return id;
+ }
+
+ @DynamoDBAttribute
+ public String getMsrp() {
+ return msrp;
+ }
+
+ @DynamoDBAttribute
+ public String getCost() {
+ return cost;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public void setMsrp(String msrp) {
+ this.msrp = msrp;
+ }
+
+ public void setCost(String cost) {
+ this.cost = cost;
+ }
+
+}
diff --git a/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java
new file mode 100644
index 0000000000..79934c17e9
--- /dev/null
+++ b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/AbstractRepository.java
@@ -0,0 +1,49 @@
+package com.baeldung.dynamodb.repository;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBScanExpression;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.util.List;
+
+public abstract class AbstractRepository {
+
+ protected DynamoDBMapper mapper;
+ protected Class entityClass;
+
+ protected AbstractRepository() {
+ ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
+
+ // This entityClass refers to the actual entity class in the subclass declaration.
+
+ // For instance, ProductInfoDAO extends AbstractDAO
+ // In this case entityClass = ProductInfo, and ID is String type
+ // which refers to the ProductInfo's partition key string value
+ this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[0];
+ }
+
+ public void save(T t) {
+ mapper.save(t);
+ }
+
+ public T findOne(ID id) {
+ return mapper.load(entityClass, id);
+ }
+
+ /**
+ * WARNING: It is not recommended to perform full table scan
+ * targeting the real production environment.
+ *
+ * @return All items
+ */
+ public List findAll() {
+ DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
+ return mapper.scan(entityClass, scanExpression);
+ }
+
+ public void setMapper(DynamoDBMapper dynamoDBMapper) {
+ this.mapper = dynamoDBMapper;
+ }
+
+}
diff --git a/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java
new file mode 100644
index 0000000000..0dfec8e05c
--- /dev/null
+++ b/aws-modules/aws-dynamodb/src/main/java/com/baeldung/dynamodb/repository/ProductInfoRepository.java
@@ -0,0 +1,6 @@
+package com.baeldung.dynamodb.repository;
+
+import com.baeldung.dynamodb.entity.ProductInfo;
+
+public class ProductInfoRepository extends AbstractRepository {
+}
diff --git a/aws-modules/aws-dynamodb/src/main/resources/db.properties b/aws-modules/aws-dynamodb/src/main/resources/db.properties
new file mode 100644
index 0000000000..e934611a2b
--- /dev/null
+++ b/aws-modules/aws-dynamodb/src/main/resources/db.properties
@@ -0,0 +1,4 @@
+db_hostname=
+db_username=username
+db_password=password
+db_database=mydb
\ No newline at end of file
diff --git a/aws-modules/aws-dynamodb/src/main/resources/logback.xml b/aws-modules/aws-dynamodb/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/aws-modules/aws-dynamodb/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java b/aws-modules/aws-dynamodb/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java
similarity index 91%
rename from aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java
rename to aws-modules/aws-dynamodb/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java
index 9fcf237599..617a35bd00 100644
--- a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java
+++ b/aws-modules/aws-dynamodb/src/test/java/com/baeldung/dynamodb/ProductInfoRepositoryUnitTest.java
@@ -49,10 +49,10 @@ public class ProductInfoRepositoryUnitTest {
@BeforeClass
public static void setupClass() {
Properties testProperties = loadFromFileInClasspath("test.properties")
- .filter(properties -> !isEmpty(properties.getProperty(AWS_ACCESSKEY)))
- .filter(properties -> !isEmpty(properties.getProperty(AWS_SECRETKEY)))
- .filter(properties -> !isEmpty(properties.getProperty(DYNAMODB_ENDPOINT)))
- .orElseThrow(() -> new RuntimeException("Unable to get all of the required test property values"));
+ .filter(properties -> !isEmpty(properties.getProperty(AWS_ACCESSKEY)))
+ .filter(properties -> !isEmpty(properties.getProperty(AWS_SECRETKEY)))
+ .filter(properties -> !isEmpty(properties.getProperty(DYNAMODB_ENDPOINT)))
+ .orElseThrow(() -> new RuntimeException("Unable to get all of the required test property values"));
String amazonAWSAccessKey = testProperties.getProperty(AWS_ACCESSKEY);
String amazonAWSSecretKey = testProperties.getProperty(AWS_SECRETKEY);
diff --git a/aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java b/aws-modules/aws-dynamodb/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
similarity index 100%
rename from aws-modules/aws-miscellaneous/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
rename to aws-modules/aws-dynamodb/src/test/java/com/baeldung/dynamodb/rule/LocalDbCreationRule.java
diff --git a/aws-modules/aws-miscellaneous/src/test/resources/test.properties b/aws-modules/aws-dynamodb/src/test/resources/test.properties
similarity index 100%
rename from aws-modules/aws-miscellaneous/src/test/resources/test.properties
rename to aws-modules/aws-dynamodb/src/test/resources/test.properties
diff --git a/aws-modules/aws-miscellaneous/pom.xml b/aws-modules/aws-miscellaneous/pom.xml
index e582ee6e4d..4126256fb9 100644
--- a/aws-modules/aws-miscellaneous/pom.xml
+++ b/aws-modules/aws-miscellaneous/pom.xml
@@ -30,17 +30,6 @@
gson
${gson.version}
-
- com.amazonaws
- DynamoDBLocal
- ${dynamodblocal.version}
- test
-
-
- com.amazonaws
- aws-java-sdk-dynamodb
- ${aws-java-sdk.version}
-
diff --git a/aws-modules/pom.xml b/aws-modules/pom.xml
index fa16e22c3a..66fa4bffa1 100644
--- a/aws-modules/pom.xml
+++ b/aws-modules/pom.xml
@@ -5,6 +5,14 @@
4.0.0
aws-modules
aws-modules
+
+
+ com.amazonaws
+ aws-java-sdk-dynamodb
+ 1.12.523
+ compile
+
+
pom
@@ -15,6 +23,7 @@
aws-app-sync
+ aws-dynamodb
aws-lambda-modules
aws-miscellaneous
aws-reactive