mybatis 3中的集合和关联映射之间的区别

时间:2012-09-14 13:16:41

标签: mysql associations mybatis

我正在从mybatis3执行mysql查询执行。 我是新来的。 mybatis 3中的集合和关联映射有什么区别?

下面的具体例子。

SELECT e.empid AS empid,e.empname AS empname,
       e.empsalary AS empsalary,p.proname AS proname,p.proid AS proid 
FROM projects p,employees e,projectassigns pa 
WHERE pa.empid=e.empid AND pa.proid=p.proid; 

我需要员工和项目的所有细节。

我已经给出了如下结果图。

<resultMap id="resultProjects" type="com.pratap.model.ProjAssigns"> 
  <association property="employee" javaType="com.pratap.model.Employee"
               resultMap="resultEmployees" />
  <association property="project" javaType="com.pratap.model.Project"     
               resultMap="resultProjects" />  
</resultMap>

有人可以用我的例子或你自己的例子来解释这个区别吗?

我对此感到困惑..

谢谢。

1 个答案:

答案 0 :(得分:22)

我将假设您在Projects和Employees之间存在多对多的关系,这就是您创建Project Assignment表的原因。此项目分配表/对象可能只有两个字段/列:项目ID到员工ID的映射 - 经典的“桥表”(又名“连接”或“连接”表)。

将此模型映射到对象图时,您有三个选项:

  1. 项目对象可以包含分配给它的所有员工的列表
  2. 一个Employee对象可以有一个他/她被分配到
  3. 的项目列表
  4. 创建一个Project Assignment对象,该对象具有每个项目与其员工和每个员工到他/她项目的映射。
  5. 在您的示例中,您选择了最后一个选项。


    协会

    关联是“有一个”关系的单一映射。

    假设员工一次只能分配到一个项目。有些模型称之为“有一个”或“属于”关系。如果您想让Employee成为对象图中的“主要”焦点,那么您可以使用与他/她的项目的关联来映射它:

    <resultMap id="employeeResultMap" type="Employee">
      <constructor>
        <idArg column="employee_id" javaType="_integer"/>
      </constructor>
      <result property="firstName"  column="first_name"/>
      <result property="lastName" column="last_name"/>
      <!-- etc. for other simple properties of Employee -->
    
      <!-- Project is a "complex property" of Employee, so we use an -->
      <!-- association to grab all of the Projects properties also -->
      <association property="assignedProject" resultMap="projectResultMap"/>
    </resultMap>
    

    在这种情况下,您的对象将如下所示:

    public Employee {
      int id;
      String firstName;
      String lastName
      Project assignedProject;
    }
    
    public Project {
      int id;
      String name;
      String abc;
    }
    


    收藏

    集合是关联的“列表”或“集合”。

    现在对逆向建模 - 我们将Project作为主要焦点。项目与Employee有“很多”的关系,所以它会有一个列表或集合,所以我们使用“集合”映射:

    <resultMap id="projectResultMap" type="Project">
      <constructor>
        <idArg column="project_id" javaType="_integer"/>
        <arg column="name" javaType="String"/>
      </constructor>
      <result property="abc" column="abc"/>
    
      <!-- This tells mybatis that there can be multiple Employees -->
      <!-- to look up and get their properties -->
      <collection property="employees" ofType="Employee">
        <constructor>
          <idArg column="employee_id" javaType="_integer"/>
        </constructor>
        <result property="firstName"  column="first_name"/>
        <result property="lastName" column="last_name"/>
      </collection>
    </resultMap>
    

    现在你的对象看起来像这样:

    public Employee {
      int id;
      String firstName;
      String lastName
    }
    
    public Project {
      int id;
      String name;
      String abc;
      List<Employee> employees;
    }
    


    项目协会

    要拥有Project Association对象,您需要:

    1. 将所有项目映射到员工的单个Project Association对象,反之亦然
    2. 每个项目一个项目关联对象,将项目映射到其员工
    3. 每位员工一个项目关联对象,将员工映射到他/她的项目
    4. 第一个选项相当复杂和混乱 - 您将尝试使用对象图(最有可能是哈希表)进行关系映射。

      我会选择将其中一个实体(项目或员工)作为主要焦点,然后按照上面的说明对其进行建模。我没有涉及的一个案例是,如果员工是您的主要关注点,而员工可以在多个项目上,那么使用collection而不是association我将其建立为“有很多”关系用于上面。

      最终注释:如果有助于查看使用“has-one”association和“has-many”collection的示例,请参阅MyBatis Koans我创建了:https://github.com/midpeter444/mybatis-koans。 Koans 10和11证明了这一点。