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

Posted

技术标签:

【中文标题】如何使用 Apache DbUtils 获取一对多关联和父子类型关联?【英文标题】:How to use Apache DbUtils to fetch one to many associations and parent-child type associations? 【发布时间】:2013-03-02 12:37:12 【问题描述】:

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

例如

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

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

谢谢, 稻谷

【问题讨论】:

您能否提供一个您想使用的示例 SQL 语句以及您希望最终得到的 Java 对象/结构? 【参考方案1】:

DbUtils 有一些 proto Sql 映射能力。

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

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

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

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

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

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

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

【讨论】:

以上是关于如何使用 Apache DbUtils 获取一对多关联和父子类型关联?的主要内容,如果未能解决你的问题,请参考以下文章

Apache DBUtils 和标量值

使用没有语句的 apache dbutils 获取自动增量生成的密钥 [重复]

DBUtils框架

准备好的语句如何与 Apache DBUtils 一起使用?

第三十天-加强2-多表查询&JDBC&连接池&DBUtils&综合案例悟空教程

DBUtils框架的使用(上)