java - iBatis - 标题细节问题

标签 java ibatis

我正在尝试将一些新功能添加到使用 iBatis 的现有应用程序中,但我对其中一个设计决策有些犹豫。

有一个现有的类(称之为 A 类),我想向其添加一些新字段。这些字段将是 B 类型。

查询将通过外部连接连接 B。

所以它会是这样的

public class A {

   //... existing fields
   private List<B> bList; // may use a Map rather than a list?

   // etc.
}

public class B {
   private int id; // primary key
   private int type;
   private String description;

   // etc.

我在网络应用程序中使用它。在第一页上,我想返回“A”列表,然后在旁边放置 B 的链接。

例如:

LinktoRecordA1 - LinktoB1 LinktoB2 LinktoB3
LinktoRecordA2 - LinktoB1          LinktoB3
LinktoRecordA3 - LinktoB1 LinktoB2 LinktoB3
LinktoRecordA4 

等等

(注意:记录 A4 没有指向任何 B 的链接 - 因此是上面提到的外部连接)

在“A”的初始提取中,我只想知道 B 记录是否存在,它的主键是显示 B 详细记录的链接。所以我的问题是,如果不在“A”对象上创建一个完全填充的“B”列表,我该如何做到这一点?

最佳答案

关于您的评论:

How else should I do it? I think what I'm having trouble understading is 
this- should I return a list of "A" objects with only minimal data 
populated, or would should I create some kind of new object?

在您描述的情况下(当返回列表并且用户可以从中选择内容时),我注意到用户通常选择一两个记录以查看更多详细信息。在这种情况下,您最终会白白返回一个完全填充的对象列表。

在那种情况下,我所做的是回退到只选择对象标识符而不是完整的对象。

所以你可以创建一个只有这些数据的新类:

public class C {
  private Integer idForA;
  private List<Integer> listOfIdsForB = new ArrayList<Integer>();
  //...
}

然后您使用外连接编写查询以返回 A 和 B 的标识符并返回类似于此的结果:

IDtoRecordA1 | IDtoB1 
IDtoRecordA1 | IDtoB2 
IDtoRecordA1 | IDtoB3

IDtoRecordA2 | IDtoB1          
IDtoRecordA2 | IDtoB3
IDtoRecordA3 | IDtoB1 

IDtoRecordA3 | IDtoB2 
IDtoRecordA3 | IDtoB3

IDtoRecordA4 | null

在这个阶段,resultMap 标签的 groupBy 属性会派上用场,可以将结果转换为包含以下内容的 C 对象列表:

C1: IDtoRecordA1, [IDtoB1, IDtoB2, IDtoB3]
C2: IDtoRecordA2, [IDtoB1, IDtoB3]
C3: IDtoRecordA3, [IDtoB1, IDtoB2, IDtoB3]
C4: IDtoRecordA4, []

这对于避免 N+1 查询也非常有用。当您返回带有 B 列表的 A 对象时,您可能已经这样做了,但是如果您使用单独的查询来检索列表(即 result 标记上的 select 属性),我建议您查看 iBatis Data Mapper 开发人员指南中的“避免 N+1 选择”部分,以最大程度地减少返回数据所需的查询数量。

底线是...

...如果您处理大量数据,那么返回完全加载的对象只是为了显示少量信息,这可能有点矫枉过正。

..另一方面,如果您处理少量数据,引入另一个处理 ID 的类可能会使事情复杂化,因此您最好返回 A 的完整对象和 B(当然要避免 N+1 查询)。

关于java - iBatis - 标题细节问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061004/

相关文章:

java - 当传递给需要对象类型的方法时,整数将变为 Long

java - 如何在不知道格式的情况下映射 json 对象的值?

java - Spring Data Jpa findBy... 和 findBy...Equals 之间的区别

spring - MyBatis-Spring 设置不使用事务

java - 在 Postgres 数据库中使用 ArrayList 成员保存 POJO

Java Swing TableModel fireTableRowsInserted on EDT

java - 为什么我看到的所有代码都仅限于几行?

java - 如何在mybatis中获取值为列表的 map

java - 使用 Java、iBatis 和 Oracle 处理 UTC 日期时间的正确方法是什么?

upgrade - iBatis 3 不向后兼容?