技术开发 频道

基于Jazz技术构建企业级Web2.0应用(2)

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);

0
相关文章