MyBatis级联查询
一、级联查询:多对一
1、实体类(多方表关联一方表)
// 员工表和部门表做逻辑外键关联
private Dept dept;
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
2、mapper接口
/**
* 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
* @param number
* @return
*/
EmpEntity selectEmpById(Integer number);
3、映射文件
<resultMap id="EmpSelDept" type="EmpEntity">
<id column="number" property="number"/>
<result column="name" property="name"/>
<result column="job" property="job"/>
<result column="mgr" property="mgr"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
<result column="deptno" property="deptno"/>
<association property="dept" javaType="Dept" >
<id column="deptno" property="deptno"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
</association>
</resultMap>
<!--级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称-->
<!--结果集中包含两个表的数据,结果集使用resultMap-->
<select id="selectEmpById" parameterType="integer" resultMap="EmpSelDept">
SELECT * FROM emp e INNER JOIN dept d ON e.deptno = d.deptno WHERE e.number = #{number}
</select>
4、测试类
// 级联查询多对一:根据员工表中员工编号查询部门表中对应的部门名称
@Test
public void findEmpById(){
EmpEntity emp = sqlSession.getMapper(EmpMapper.class).selectEmpById(1007);
// javaBean导航
System.out.println("员工部门:" + emp.getDept().getDname());
}
二、级联查询:一对多
1、实体类(一方表关联多方表)
// 部门表关联员工表
private List<EmpEntity> emps;
public List<EmpEntity> getEmps() {
return emps;
}
public void setEmps(List<EmpEntity> emps) {
this.emps = emps;
}
2、mapper接口层
/**
* 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
* @param deptno
* @return
*/
Dept selectEmpByDept(Integer deptno)
3、映射文件
<resultMap id="DeptSelEmp" type="Dept">
<id column="deptno" property="deptno" />
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<collection property="emps" ofType="EmpEntity" >
<id property="number" column="number"/>
<result column="name" property="name"/>
<result column="job" property="job"/>
<result column="mgr" property="mgr"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
<result column="deptno" property="deptno"/>
</collection>
</resultMap>
<!--级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息-->
<select id="selectEmpByDept" parameterType="int" resultMap="DeptSelEmp">
SELECT * FROM dept d LEFT JOIN emp e ON e.deptno = d.deptno WHERE d.deptno = #{deptno}
</select>
4、测试类
// 级联查询一对多:通过部门表中部门编号查询员工表中对应的员工信息
@Test
public void findEmpByDept(){
sqlSession.getMapper(EmpMapper.class).selectEmpByDept(70);
}
三、总结
一对多:以一的一方为主表; 多对一:以多的一方为主表
Association 封装一的一方的数据,固定类型搭配 :javaType
collection封装多的一方的数据,固定类型搭配:ofType