多对一关系实例:
员工表:
部门表:
员工-部门关系表中,多个员工对应一个部门,要想在员工表中查询出对应的部门名,就要解决多对一映射。
解决方法:
首先:Emp实体类中添加Dept属性
public class Emp {
private Integer empId;
private String empName;
private Integer age;
private String gender;
private Dept dept;
}
然后:有三种方式解决此问题
级联方式:多对一的映射关系
dept.deptId,dept.deptName这两个属性爆红没有影响
注意
- <resultMap id="getEmpAndDeptByEmpIdone" type="emp">
- <id column="emp_id" property="empId">id>
- <result column="emp_name" property="empName">result>
- <result column="age" property="age">result>
- <result column="gender" property="gender">result>
-
-
- <result column="dept_id" property="dept.deptId">result>
- <result column="dept_name" property="dept.deptName">result>
- resultMap>
- <select id="getEmpAndDept" resultMap="getEmpAndDeptByEmpIdone">
- select t_emp.*,t_dept.*
- from t_emp LEFT join t_dept
- on t_emp.dept_id = t_dept.dept_id
- where t_emp.emp_id = #{empId}
- select>
association : 专门处理多对一、一对一 的映射关系 处理实体类型属性
property:设置需要处理映射关系的属性的属性名
javaType:设置需要处理的属性的类型
- <resultMap id="getEmpAndDeptByEmpId" type="emp">
- <id column="emp_id" property="empId">id>
- <result column="emp_name" property="empName">result>
- <result column="age" property="age">result>
- <result column="gender" property="gender">result>
-
-
- <association property="dept" javaType="Dept">
- <id column="dept_id" property="deptId">id>
- <result column="dept_name" property="deptName">result>
- association>
- resultMap>
- <select id="getEmpAndDept" resultMap="getEmpAndDeptByEmpId">
- select t_emp.*,t_dept.*
- from t_emp LEFT join t_dept
- on t_emp.dept_id = t_dept.dept_id
- where t_emp.emp_id = #{empId}
- select>
通过分布查询,处理多对一的情况
分别通过两个mapper查询各自的实体类属性,然后在通过association标签做两个之间的关联
property:设置需要处理映射关系的属性的属性名
select: 表明当前属性是调用select指定的这个方法查询出来的结果
column: 上面select中指定方法sql中的查询条件为XXX
主要是通过resultMap中的assocation实现的。
优点:可以延迟加载(多部查询,如果只需要其中一个步的结果那么就可以通过延迟加载设置。)
全局配置:
在配置文件(mybatis-config.xml)中设置
- <settings>
-
- <setting name="lazyLoadingEnabled" value="true"/>
- <setting name="aggressiveLazyLoading" value="false"/>
- settings>
局部配置:
在某一个多步查询中设置延迟加载
fetchType="lazy"设置延迟加载
fetchType="eager"立即加载
- <association property="dept" fetchType="lazy"
- select="com.zt.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
- column="dept_id">
-
- association>
具体看代码:
EmpMapper:
- !-- 使用分布查询的方法处理多对
-
- Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
-
- -->
- <resultMap id="getEmpAndDeptByStepOne" type="emp">
- <id column="emp_id" property="empId">id>
- <result column="emp_name" property="empName">result>
- <result column="age" property="age">result>
- <result column="gender" property="gender">result>
-
-
- <association property="dept"
- select="com.zt.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
- column="dept_id">
-
- association>
- resultMap>
-
- <select id = "getEmpAndDeptByStepOne" resultMap="getEmpAndDeptByStepOne">
- select * from t_emp where emp_id = #{empId}
- select>
DeptMapper:
- <select id="getEmpAndDeptByStepTwo" resultType="dept">
-
- select *
- from t_dept where dept_id = #{deptId};
-
- select>
查询结果:
- Preparing: select * from t_emp where emp_id = ? (BaseJdbcLogger.java:137)
- Parameters: 1(Integer) (BaseJdbcLogger.java:137)
- Preparing: select * from t_dept where dept_id = ?; (BaseJdbcLogger.java:137)
- Parameters: 1(Integer) (BaseJdbcLogger.java:137)
- Total: 1 (BaseJdbcLogger.java:137)
- Total: 1 (BaseJdbcLogger.java:137)
- Emp(empId=1, empName=张三, age=12, gender=男, dept=Dept(deptId=1, deptName=A))