RPC服务中数据CRUD的实现
在RPC服务中可以通过Repository构件提供的两个服务com.ibm.team.repository.service.IRepositoryItemService和com.ibm.team.repository.common.service.IQueryService来实现数据项的CRUD功能。IRepositoryItemService提供了Jazz存储库中数据项的持久化功能,IQueryService主要用于对数据项的查询。
下面将结合PetStore中ProductService的实现来介绍如何利用这两个服务实现数据的CRUD操作。
1.创建和保存宠物,如清单6所示
清单6. 创建并保存宠物
public IProduct createProduct(int id, String name, String description,
ICategoryHandle category, ISellerHandle seller, int price,
String tags) throws TeamRepositoryException {
IProduct product = (IProduct) IProduct.ITEM_TYPE.createItem();
product.setId(id);
product.setName(name);
product.setDescription(description);
product.setCategory(category);
product.setSeller(seller);
product.setPrice(price);
product.setTags(tags);
return product;
}
public IProduct saveProduct(IProduct workingCopy)
throws TeamRepositoryException {
……
IProduct product = getService(IRepositoryItemService.class).saveItem(
workingCopy);
return product;
}
在实现中,我们分别通过createProduct和saveProduct方法实现宠物信息的创建和保存。注意:我们在saveProduct中通过调用IRepositoryItemService的saveItem方法完成一个产品数据项的保存。Repository组件会以O-R映射的形式,在底层生成对应的insert into SQL语句,调用JDBC完成数据持久化。
2.根据ID获取宠物信息,如清单7所示
清单7. 查询宠物信息
public IProduct findProductById(int id) throws TeamRepositoryException {
Object[] parmValues = new Object[] { id };
IQueryService queryService = getService(IQueryService.class);
ProductQueryModel queryModel = BaseProductQueryModel.ProductQueryModel.ROOT;
IItemQuery itemQuery = IItemQuery.FACTORY.newInstance(queryModel);
IPredicate predicate = queryModel.id()._eq(itemQuery.newIntegerArg());
itemQuery.filter(predicate);
IItemQueryPage itemQueryPage = queryService.queryItems(itemQuery,
parmValues, 10);
IRepositoryItemService repositoryItemService =
getService(IRepositoryItemService.class);
IItem[] items = repositoryItemService.fetchItems(itemQueryPage
.handlesAsArray(), null);
if (items.length > 1) {
throw new TeamRepositoryException(
"More than one product found with id " + id);
} else if (items.length == 1) {
return (IProduct) items[0];
}
return null;
}
从findProductById方法的实现中,我们可以知道对数据的查询包含如下步骤:
· 首先根据数据模型ProductQueryModel构造了一个查询itemQuery,ProductQueryModel是在第一部分构建数据持久化模型时,由Jazz自动生成。它代表了实体的查询模型,例如描述了哪些字段是可以搜索的,以及这些字段的类型。
· 接着构造了一个查询谓词predicate设定查询条件。例如在findProductById中,查询条件为数据项的id值必须等于传入的参数。
· 然后使用IQueryService的queryItems方法进行查询,获得符合查询条件的数据项的句柄。在Jazz的底层会根据我们的数据存储模型和对应的查询条件,生成相应的SQL语句,并调用JDBC完成搜索过程。
· 最后调用IRepositoryItemService的fetchItems方法获取句柄对应的数据实体对象。
3.更新宠物数据
在Jazz中如果需要对数据实体进行更新,则需要在数据的工作拷贝上进行,一个数据项的更新包括几个步骤(如清单8所示):
· 获取数据项的工作拷贝,
· 并调用setter方法更新其内容
· 持久化数据项
清单8. 更新宠物数据
IProduct productWorkingCopy=productItemHandle. getWorkingCopy();
productWorkingCopy.setName("new name");
……
productService.saveProduct(productWorkingCopy);
4.删除宠物
上面介绍了IRepositoryItemService提供saveItem方法持久化一个数据项。类似的,它提供deleteItem方法删除一个数据项,如清单9所示。
清单9. 删除宠物
repositoryItemService.deleteItem(productItemHandle);