我正在从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>
有人可以用我的例子或你自己的例子来解释这个区别吗?
我对此感到困惑..
谢谢。
答案 0 :(得分:22)
我将假设您在Projects和Employees之间存在多对多的关系,这就是您创建Project Assignment表的原因。此项目分配表/对象可能只有两个字段/列:项目ID到员工ID的映射 - 经典的“桥表”(又名“连接”或“连接”表)。
将此模型映射到对象图时,您有三个选项:
在您的示例中,您选择了最后一个选项。
关联是“有一个”关系的单一映射。
假设员工一次只能分配到一个项目。有些模型称之为“有一个”或“属于”关系。如果您想让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对象,您需要:
第一个选项相当复杂和混乱 - 您将尝试使用对象图(最有可能是哈希表)进行关系映射。
我会选择将其中一个实体(项目或员工)作为主要焦点,然后按照上面的说明对其进行建模。我没有涉及的一个案例是,如果员工是您的主要关注点,而员工可以在多个项目上,那么使用collection
而不是association
我将其建立为“有很多”关系用于上面。
最终注释:如果有助于查看使用“has-one”association
和“has-many”collection
的示例,请参阅MyBatis Koans我创建了:https://github.com/midpeter444/mybatis-koans。 Koans 10和11证明了这一点。