MyBatis关联查询

关联查询分为五种:

1.一对一

一个中国公民对应一张身份证,在实际开发中,一对一这种情况基本很少用到,这里不做具体解释

2.一对多

例子:根据一个老师的编号来查询这个老师下所有学生的集合

一对多分为单条SQL和一对多多条SQL

一对多单条SQL:

    //一对多单条sql
public dept findAlldeptName(int  deptNo);
    <!--一对多单条SQL-->
    <resultMap id="deptMapper" type="dept">
        <result property="deptName" column="deptname"></result>
        <collection property="emps" ofType="emp">
            <id property="empNo" column="empno"></id>
            <result column="empname" property="empName"></result>
        </collection>
    </resultMap>
    
    <select id="findAlldeptName" resultMap="deptMapper">
      SELECT deptName,empName FROM dept,emp WHERE dept.`deptNo`=emp.`deptNo` AND dept.`deptNo`=#{deptNo}
    </select>

一对多多条SQL:

//一对多条sql
    public dept findAllMoreDeptName(int deptNo);
   <!--一对多多条SQL-->
    <resultMap id="deptMappers" type="dept">
        <id property="deptNo" column="deptno"></id>
        <result property="deptName" column="deptname"></result>
        <collection property="emps" ofType="emp" select="empselect" column="deptNo">
    </collection>
</resultMap>

    <select id="empselect" resultType="emp">
        SELECT * from emp where deptNo=#{deptNo}
    </select>

    <select id="findAllMoreDeptName" resultMap="deptMappers">
        select * from dept where deptNo=#{deptNo}
    </select>

3.多对一

多对一分为单条SQL和多条SQL

多对一单条SQL:

  //多对一单条sql
    public emp findAllemp(int empNo);
    <!--多对一单条SQL-->

    <resultMap id="empMapper" type="emp">
        <id property="empNo" column="empno"></id>
        <result property="empName" column="empname"></result>
        <association property="depts" javaType="dept" >
            <id property="deptNo" column="deptno"></id>
            <result property="deptName" column="deptname"></result>
        </association>
    </resultMap>
<select id="findAllemp" resultMap="empMapper">
  SELECT deptName,empName,empno,emp.deptNo FROM dept,emp WHERE dept.deptNo=emp.deptNo AND empNo=#{empNo}
</select>

多对一多条SQL:

    //多对一多条sql
    public emp findAllemps(int empNo);
    <!--多对一多条SQL-->
    <resultMap id="empMappers" type="emp">
        <id property="empNo" column="empno"></id>
        <result property="empName" column="empname"></result>
        <association property="depts" javaType="dept" select="getdept" column="deptNo" >
        </association>
    </resultMap>
    <select id="getdept" resultType="dept">
        SELECT * from dept where deptNo=#{deptNo}
    </select>
    <select id="findAllemps" resultMap="empMappers">
        SELECT * from emp where empNo=#{empNo}
    </select>

4.多对多

同时满足一对多,多对一的条件就是多对多

例如:一个老师可以有多个学生,反过来则一个学生可以有多个老师

  //根据老师编号查询所属学生集合
    public Teacher findAllStudent(int tid);
    <!--根据老师编号查询学生集合-->
    <resultMap id="TeacherMapper" type="Teacher">
        <id property="tid" column="tid"></id>
        <result property="tname" column="tname"></result>
        <collection property="stu" ofType="Student">
            <id property="sid" column="sid"></id>
            <result property="sname" column="sname"></result>
        </collection>
    </resultMap>
    <select id="findAllStudent" resultMap="TeacherMapper">
        SELECT * FROM students AS s,teacher AS t,Teacher_Student AS ts
        WHERE s.`sid`=ts.`sid` AND t.`tid`=ts.`tid` AND t.`tid`=#{tid}
    </select>

5.自关联

既可以充当一方,也可以充当多方,是1:n或n:1的原型

例如:查询某个pid对应的所有分类的集合

    //自关联
    public List<category> findAllById(int pid);
    <!--自关联-->
    <resultMap id="categoryMapper" type="category">
        <id property="cid" column="cid"></id>
        <result property="cname" column="cname"></result>
        <collection property="sets" ofType="category" select="findAllById" column="cid">
        </collection>
    </resultMap>
    <select id="findAllById" resultMap="categoryMapper">
        select * from category where pid=#{pid}
    </select>

测试类的代码书写:

    //自关联
    @Test
    public void test15(){

        SqlSession sqlSession= MyBatisUtil.getSession();
        IdeptDao mapper = sqlSession.getMapper(IdeptDao.class);
        List<category> lists = mapper.findAllById(0);
        for (category item:lists){
            System.out.println(item);
        }
        sqlSession.close();
    }
根据一个一级id查询到此id下的所有子id
原文地址:https://www.cnblogs.com/1234AAA/p/8476982.html