mybatis关联查询一对多

一、实体类(getset方法,toString,构造方法忽略)

public class Dept {
	private Integer deptid;
	private String dname;
	private String dloc;
	private Set<Emp> emps= new HashSet<>();
}
public class Emp {
	private Integer empid;
	private String ename;
	private String esex;
	private Date ehiredate;
	private Double esal;
	private Dept dept;
}

二、接口方法,以下用了两种方法(推荐第一种)

public interface DeptMapper {
	public List<Dept> selectAllDept();
	public List<Dept> selectAllDept2();
}

三、xml文件

DeptMapper.xml

<mapper namespace="com.gx.mapper.DeptMapper">
	<!--  根据部门编号查询部门信息-->
	<select id="selectDeptById" resultType="Dept">
		select * from dept where deptid=#{deptid}
	</select>
	
	<resultMap type="Dept"  id="BaseDeptCloumn">
		<id property="deptid" column="deptid"/>
		<result property="dname" column="dname"/>
		<result property="dloc" column="dloc"/>
	</resultMap>
	
	<resultMap type="Dept"  id="MyDeptMap"  extends="BaseDeptCloumn">
		<collection property="emps" javaType="Emp">
		<id property="empid" column="empid" />
		<result property="ename" column="ename"/>
		<result property="esex" column="esex"/>
		<result property="ehiredate" column="ehiredate"/>
		<result property="esal" column="esal"/>
		
		</collection>
	</resultMap>
	
	<!-- 查询所有部门 1-->
	<select id="selectAllDept" resultMap="MyDeptMap">
		select * from dept inner join emp using(deptid)
	</select>
	
	<resultMap type="Dept"  id="MyDeptMap2"  extends="BaseDeptCloumn">
		<!-- 
			property="emps" 代表dept实体里面的emps属性
			ofType="Emp" emps集合里面存在的数据类型
			column="deptid"  传到com.gx.mapper.EmpMapper.selectEmpByDeptId去的参数
			select 调用的其他的接口
		 -->
		<collection property="emps" ofType="Emp" column="deptid" 
				select="com.gx.mapper.EmpMapper.selectEmpByDeptId">
	</collection>
	</resultMap>
	
	<!-- 查询所有部门2 -->
	<select id="selectAllDept2" resultMap="MyDeptMap2">
		select * from dept 
	</select>
	
</mapper>

EmpMapper.xml

<mapper namespace="com.gx.mapper.EmpMapper">
	<!-- 根据部门id查询员工的信息 -->
	<select id="selectEmpByDeptId"  resultType="Emp">
		select * from emp where deptid=#{deptid}
	</select>
	
</mapper>

测试

public class myTest {

	SqlSession session = MyBatisUtils.openSession();
	DeptMapper deptMapper = session.getMapper(DeptMapper.class);
	
	
	@Test
	public void selectAllDept() {
		List<Dept> list = deptMapper.selectAllDept();
		for (Dept dept : list) {
			System.out.println(dept);
		}
		MyBatisUtils.closeSession(session);
	}
	@Test
	public void selectAllDept2() {
		List<Dept> list = deptMapper.selectAllDept2();
		for (Dept dept : list) {
			System.out.println(dept);
		}
		MyBatisUtils.closeSession(session);
	}
}

提示:第二种方法根据部门表的id数量(n),就会执行n条查询语句,不推荐

posted @ 2020-04-25 20:01  青青子衿啊  阅读(296)  评论(0)    收藏  举报