一、dynamo local
1、建表
aws dynamodb create-table --table-name t_user --attribute-definitions AttributeName=user_account,AttributeType=S AttributeName=user_name,AttributeType=S --key-schema AttributeName=user_account,KeyType=HASH AttributeName=user_name,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 --table-class STANDARD --endpoint-url http://localhost:8000
2、pom依赖
<?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>org.example</groupId><artifactId>dynamo-demo</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><dependency><groupId>software.amazon.awssdk</groupId><artifactId>bom</artifactId><version>2.17.230</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--dynamo v1--><dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-dynamodb</artifactId><version>1.12.310</version> <!-- 请替换为合适的版本号 --></dependency><!--dynamo v2--><dependency><groupId>software.amazon.awssdk</groupId><artifactId>dynamodb</artifactId><version>2.20.44</version> <!-- 请使用最新的版本 --></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>dynamodb-enhanced</artifactId><version>2.17.123</version></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>kms</artifactId></dependency><dependency><groupId>software.amazon.awssdk</groupId><artifactId>dynamodb</artifactId></dependency></dependencies>
</project>
3、config
package com.demo.dynamo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;import java.net.URI;@Configuration
public class DynamoClientConfig {@Bean("dynamoDbClient")public DynamoDbClient dynamoDbClient() {// 使用自定义的 Access Key 和 Secret KeyAwsBasicCredentials credentials = AwsBasicCredentials.create("wtyyA", // 替换为你的 Access Key"wtyyB" // 替换为你的 Secret Key);return DynamoDbClient.builder().region(Region.US_WEST_2).endpointOverride(URI.create("http://localhost:8000"))//.credentialsProvider(DefaultCredentialsProvider.create()) // 默认凭证.credentialsProvider(StaticCredentialsProvider.create(credentials)).build();}@Bean("dynamoDbEnhancedClient")public DynamoDbEnhancedClient dynamoDbEnhancedClient() { // enhanced versionDynamoDbClient dynamoDbClient = dynamoDbClient();return DynamoDbEnhancedClient.builder().dynamoDbClient(dynamoDbClient).build();}
}
4、实体
package com.demo.dynamo.entity;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.*;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@DynamoDbBean
@DynamoDBTable(tableName = "t_user")
public class UserEntity {private String userAccount;private String userName;@DynamoDbAttribute(value = "user_account")@DynamoDbPartitionKeypublic String getUserAccount() {return userAccount;}@DynamoDbAttribute(value = "user_name")@DynamoDbSortKeypublic String getUserName() {return userName;}
}
5、dao层
package com.demo.dynamo.repository;import com.demo.dynamo.entity.UserEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Expression;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.PageIterable;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryConditional;
import software.amazon.awssdk.enhanced.dynamodb.model.QueryEnhancedRequest;
import software.amazon.awssdk.enhanced.dynamodb.model.UpdateItemEnhancedRequest;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;import java.util.Map;@Repository
@Slf4j
public class UserRepository {@Autowiredprivate DynamoDbEnhancedClient enhancedClient;public void saveUser(UserEntity userEntity) {// 获取表格映射DynamoDbTable<UserEntity> mappedTable = enhancedClient.table("t_user", TableSchema.fromBean(UserEntity.class));// 插入数据mappedTable.putItem(userEntity);}public void delete(UserEntity userEntity) {// 获取表格映射DynamoDbTable<UserEntity> mappedTable = enhancedClient.table("t_user", TableSchema.fromBean(UserEntity.class));mappedTable.deleteItem(userEntity);}
}
6、单元测试
package com.demo.dynamo;
import com.demo.dynamo.entity.UserEntity;
import com.demo.dynamo.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest(classes = {DynamoApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class MyTest {@Autowiredprivate UserRepository userRepository;/*** 保存*/@Testpublic void testSave(){UserEntity user = UserEntity.builder().userAccount("ls").userName("lisi1").build();userRepository.saveUser(user);}/*** 更新*/@Testpublic void testDelete(){UserEntity user = UserEntity.builder().userAccount("ls").userName("lisi1").build();userRepository.delete(user);}
}
(1)新增:执行 testSave,查看数据生成
再执行一次,没有插入,因为account值重复了,而改成不一样的userName又可以插入了:
(2)删除:执行testDelete,执行成功