数据表中经常存在的多对一以及一对多的情况,例如多个员工属于一个部门(多对一), 一个部门有多个员工(一对多)。在Mybatis中普通的查询返回值为实体类对象不能实现以上操作。这就有了xml文件中 自定义映射resultMap的应用。
一、 resultMap处理字段和属性的映射关系resultMap:设置自定义映射属性:
id:表示自定义映射的唯一标识,不能重复
type:查询的数据要映射的实体类的类型子标签:
id:设置主键的映射关系result:设置普通字段的映射关系子标签属性:
property:设置映射关系中实体类中的属性名column:设置映射关系中表中的字段名 应用:
二、多对一查询select * from t_emp
三种方法可以实现多对一查询:
- 级联属性赋值使用association处理映射关系分步查询
员工信息:
public class Emp {
private Integer eid;
private String empName;
private Integer age;
private String sex;
private String email;
private Dept dept;
//...构造器、get、set方法等
}
部门类:
public class Dept {
private Integer did;
private String deptName;
private List emps;
//...构造器、get、set方法等
2.1 级联属性赋值
通过左连接将两个表进行连接,并通过resultMap属性为两个表赋值,其中员工表中的部门信息采用 类.属性名作为 property值。
Emp selectEmpAndDept(@Param("eid") Integer eid);
2.2 使用association处理映射关系
2.3 分步查询
分步查询无可厚非就是将查询分为两步,一 先通过eid查询员工的所有信息,二 通过员工信息中的did属性再去部门表中查询部门的所有信息,然后再进行输出。
Emp getEmpAndDeptByStepOne(@Param("eid")Integer eid);
Dept getEmpAndDeptByStepTwo(@Param("did") Integer did);
EmpMapper 的xml文件,实现第一步查询
DeptMapper.xml实现第二步查询
三、一对多查询
两种方法可以实现多对一查询:
- collection集合属性 (ofType)分步查询
Dept getDeptAndEmp(@Param("did") Integer did);
3.2 分步查询
Dept getDeptAndEmpOne(@Param("did")Integer did);
List getDeptAndEmpTwo(@Param("did")Integer did);



