我正在使用DynamoDB。我想创建一个数据库适配器类(而不是在程序的各个部分中查看一堆复制/粘贴的代码),该类可以执行以下操作:
DynamoDBMapper mapper = Dynamo.getMapper(SomeClassHere.TABLE_NAME);
DynamoDBQueryExpression<SomeClassHere> queryExpression = new DynamoDBQueryExpression<SomeClassHere>()
.withHashKeyValues(passedInObjectHere);
List<SomeClassHere> list = mapper.query(SomeClassHere, queryExpression);
因此SomeClassHere将作为类的名称作为其类型,也将用于映射DynamoDBMapper中的字段。
我想传递一个与此类似的对象参数:
public void getList(IDynamoDBModel model) {
DynamoDBMapper mapper = Dynamo.getMapper(GetTheClassTypeFromTheModel);
DynamoDBQueryExpression<GetTheClassTypeFromTheModel> queryExpression = new DynamoDBQueryExpression<GetTheClassTypeFromTheModel>()
.withHashKeyValues(model);
List<GetTheClassTypeFromTheModel> list = mapper.query(GetTheClassTypeFromTheModel, queryExpression);
}
通过这种方式,我可以简单地:
而不是在各处复制/粘贴“保存代码”,“删除代码”,“获取项目代码”。我意识到泛型是在编译时使用的,这可能是徒劳的,但我迫切希望清理此继承的代码库。
答案 0 :(得分:0)
我不熟悉DynomoDB。
但是根据我的理解,您想从DynamoDB实现通用数据访问层。它可以通过泛型实现,我在下面的代码中实现了您的知识,以了解如何实现这一目标。
请忽略DynamoDB规范,仅复制和粘贴此代码将不起作用。因此请确保进行相应的编辑。
实现DynamoTypeProvider接口。
@FunctionalInterface
public interface DynamoTypeProvider<DynamoType> {
Class<DynamoType> getDynamoType();
}
为DyanamoDB实施通用数据访问服务,如下所示。
public abstract class DynamoQueryService<DynamoType, DynamoDBModel extends DynamoTypeProvider<DynamoType>> {
public List<DynamoType> getList(DynamoDBModel model) {
DynamoDBMapper mapper = Dynamo.getMapper(model.getDynamoType());
DynamoDBQueryExpression<DynamoType> queryExpression = new DynamoDBQueryExpression<DynamoType>()
.withHashKeyValues(model);
return mapper.query(model.getDynamoType(), queryExpression);
}
}
假设Dynamo类型为UserType,而DynamoDBModel为User。 从User我们应该能够获得Dynamo DB类型UserType。
public class UserType {
//your code.
}
public class User implements DynamoTypeProvider<UserType>{
//your code
@Override
public Class<UserType> getDynamoType() {
return UserType.class;
}
然后执行指定模型类型数据访问服务的操作。这里是UserDynamoQueryService。
public class UserDynamoQueryService extends DynamoQueryService<UserType, User> {
}
然后您可以将UserType设置为
UserDynamoQueryService service = new UserDynamoQueryService();
List<UserType> types = service.getList(new User());
使用泛型可以实现此目的。 请确保对此进行相应的编辑。
或者您可以尝试以下示例。
public class DynamoQueryService {
public <T, X> List<T> getList(X x, Class<T> tClass) {
DynamoDBMapper mapper = Dynamo.getMapper(tClass);
DynamoDBQueryExpression<T> queryExpression = new DynamoDBQueryExpression<T>()
.withHashKeyValues(x);
return mapper.query(tClass, queryExpression);
}
}
并如下使用。
DynamoQueryService queryService = new DynamoQueryService();
List<UserType> userTypes = service.getList(new User(), UserType.class);
然后,用户无需实现DynamoTypeProvider。