代码之家  ›  专栏  ›  技术社区  ›  Alvin

iBatis如何解决更复杂的N+1问题

  •  0
  • Alvin  · 技术社区  · 16 年前

    我有一个类似以下的数据库:

    create table Store(storeId)
    create table Staff(storeId_fk, staff_id, staffName)
    create table Item(storeId_fk, itme_id, itemName)
    

    储物台很大。

    我已经创建了以下javabean

    public class Store
    {
        List<Staff> myStaff
        List<Item> myItem
    
       ....
    }
    
    public class Staff
    {
        ...
    }
    
    public class Item
    {
       ...
    }
    

    我的问题是如何使用iBatis的结果映射有效地从表映射到java对象?

    我试过:

    <resultMap id="storemap" class="my.example.Store">
      <result property="myStaff" resultMap="staffMap"/>
      <result property="myItem" result="itemMap"/>
    </resultMap>
    
    (other maps omitted)
    

    我试着按照克林顿的开发者指南中的N+1解决方案的例子,但我不能扭曲我的思想,如何使用“groupBy”为一个2列表的对象。。。

    感谢您的帮助!

    1 回复  |  直到 16 年前
        1
  •  1
  •   leonbloy    16 年前

    通常在这里实现一些延迟加载,或者显式加载相关对象。 不管怎样,我不知道你的目标是什么。你说“商店的桌子很大”。 现在,您打算加载许多存储对象吗?你真的需要相关的物品吗? 问问自己(在使用iBatis设计时)什么是理想的SQL执行方式。

    别忘了处理对象可能有不同的场景,不一定所有的对象都必须使用相同的映射。

    例如,通常有两种类型的用例与Store对象相关:在第一种类型中,需要加载完整的“对象图”,但只加载一个(或几个)根对象(一个) Store ); 在另一种类型中,必须加载许多“存储”(带有相关数据),但仅用于某些列表或报表。然后,您可以在每种场景中执行不同的操作:在第一种情况下,您可以用相关的对象加载完整的对象(可能是延迟加载,而不用太担心N+1问题);在第二种情况下,并不是真的满载 商场 对象图,但只是一个假人 StoreWithExtraData DTO对象(甚至可能是一个普通的HashMap!)它对应于列表的一行—在iBatis中,可以通过一个特殊的SQL查询和映射来实现这一点。

    推荐文章