如何使用 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<Category> mapCategory(List<CategoryRelational>)
的方法创建数据映射器对象,该方法接收平面对象的集合并返回分层对象的集合
映射的逻辑很简单但显然与查询耦合:
如果下一行代表新类别,则创建新的 Category 对象,其中第一个产品和第一个子类别位于同一行(如果您使用左连接而不是连接第一个产品或第一个子类别) 如果下一行代表与上一行相同的类别,则仅创建新产品和新类别(如果您使用左连接...)我在一个大型项目中使用过这种方法,当您的数据库频繁更改时,我发现它非常灵活。
【讨论】:
以上是关于如何使用 Apache DbUtils 获取一对多关联和父子类型关联?的主要内容,如果未能解决你的问题,请参考以下文章
使用没有语句的 apache dbutils 获取自动增量生成的密钥 [重复]
准备好的语句如何与 Apache DBUtils 一起使用?