1


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

例如

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

假设我有categories一个表,其中包含一个parent_category父子关系列、一个表和一个仅包含 category_code 和 product_codeproducts的关联表。category_products假设我的查询正常工作,并且想一次性获取所有子类别和产品的类别。DbUtils 有可能吗?我有很多这样的情况,那么是否有一种通用的、更简洁的方法,或者我们必须在每种情况下编写大量自定义代码?即便如此,你能给我举个例子吗?

谢谢,
稻田

4

1 回答 1

2

DbUtils 有一些 proto Sql 映射能力。

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

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

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

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

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

  • 如果下一行代表新类别,则在同一行上创建具有第一个产品和第一个子类别的新类别对象(如果您使用左连接而不是连接第一个产品或第一个子类别)
  • 如果下一行代表与前一行相同的类别,则仅创建新产品和新类别(如果您使用左连接...)

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

于 2014-01-19T20:39:41.847 回答