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条查询语句,不推荐