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

use*_*533 15 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; 
Run Code Online (Sandbox Code Playgroud)

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

我给出了如下结果图.

<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>
Run Code Online (Sandbox Code Playgroud)

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

我对此感到困惑..

谢谢.

quu*_*x00 24

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

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

  1. Project对象可以包含分配给它的所有员工的列表
  2. Employee对象可以包含他/她被分配到的项目列表
  3. 创建一个Project Assignment对象,该对象具有每个项目与其员工和每个员工到他/她的项目的映射.

在您的示例中,您选择了最后一个选项.


协会

关联是"has-one"关系的单一映射.

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

public Project {
  int id;
  String name;
  String abc;
}
Run Code Online (Sandbox Code Playgroud)


采集

集合是关联的"列表"或"集合".

现在模拟逆 - 我们使项目成为主要焦点.项目与Employee有"has-many"关系,因此它将有一个列表或集合,因此我们使用"集合"映射:

<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>
Run Code Online (Sandbox Code Playgroud)

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

public Employee {
  int id;
  String firstName;
  String lastName
}

public Project {
  int id;
  String name;
  String abc;
  List<Employee> employees;
}
Run Code Online (Sandbox Code Playgroud)


项目协会

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

  1. 单个Project Association对象,将所有项目映射到员工,反之亦然
  2. 每个项目一个项目关联对象,将项目映射到其员工
  3. 每个员工一个项目关联对象,将员工映射到他/她的项目

第一个选项相当复杂和混乱 - 您将尝试使用对象图(最有可能的哈希表)进行关系映射.

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

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