如何使用Apache DbUtils获取一对多关联和父子类型关联?

时间:2013-03-14 08:43:51

标签: apache-commons-dbutils


   有人可以解释一种使用Apache DbUtils获取一对多关联和父子类型关联的方法吗?我试过搜索,但找不到一对多关联的例子? DbUtils页面上的文档也没有显示这种情况的例子吗?

E.g。

class Category {
    String code;
    List<Product> products;
    List<Category> subCategories;
}

假设我categories表的父子关系有parent_category列,products表和仅包含category_code和product_code的关联表category_products表。假设我的查询有效,并希望一次性获取所有子类别和产品的类别。这可能与DbUtils有关吗?我有很多这样的情况,那么是否有一种通用的,更简洁的方式,或者我们必须在每种情况下编写大量的自定义代码?即便如此,你能告诉我一个例子吗?

谢谢,
稻谷

1 个答案:

答案 0 :(得分:2)

DbUtils具有一些proto Sql映射功能。

使用BeanHandler和BeanListHandler,您可以映射查询在传递给处理程序的类的实例上返回的行。

映射很容易实现,逻辑可以封装在传递给处理程序的类中。课程必须如下:

  • 这是一个JavaBean
  • 每个属性的名称必须映射select语句的列别名(因此在camelCase中写入别名作为JavaBean属性)
  • 每个属性的类型必须是从jdbc驱动程序管理的属性之一(如果您希望可以覆盖实现自己的bean行处理器的映射)

如果您的域模型设计为对象组合,但您希望优化查询执行(1:n或m:n),则可以按以下步骤操作:   - 创建一个JavaBean,它映射从查询返回的所有列,比如CategoryRelational   - 使用类似List<Category> mapCategory(List<CategoryRelational>)的方法创建数据映射器对象,该方法接收平面对象的集合并返回分层对象的集合

映射的逻辑很简单,但显然与查询相关:

  • 如果下一行代表新类别,则创建新的Category对象,其中第一个产品和同一行的第一个子类别(如果您使用左连接而不是加入第一个产品或第一个子类别)
  • 如果下一行代表上一行的相同类别,则只创建新产品和新类别(如果使用左连接...)

我在一个大项目中使用过这种方法,并且当数据库频繁更改时,我发现它非常灵活。