关联查询

一、Dao层各个关联查询的接口

//一对多关联查询
    public SmbmsRoleEntity getAllByRoleId(Integer id);

    //多对一关联查询 查询所有用户信息  包含角色信息
    public List<User> getUserList();

    //多对多关联查询
    //查询所有学生信息  以及授课教员
    public List<Student> getStudentInfo();


    //自查询
    //查询 河南省下的所有子集
    public City getCityAndChildCitys(Integer cid);

二、xml文件

<mapper namespace="com.marketsys.dao.ProviderTest">
    <!--由于是关联查询  返回的是多张表中的结果集 ,必须定义resultMap映射-->

    <!--一对多关联查询-->
    <!--查询经理角色以及该角色下的员工集合-->
    <resultMap id="ById" type="com.marketsys.entity.SmbmsRoleEntity">
        <id property="rid" column="rid"></id>
        <result property="roleName" column="roleName"></result>
        <!--此处使用的是collection节点 ,由于Role类中插入的是List集合  ofType:为集合中的泛型-->
        <collection property="getRoleEntitys"  ofType="com.marketsys.entity.User" select="getUser" column="rid">
            <!--在collection中声明Role中的属性与列的映射-->
            <!--<id  property="id" column="id"></id>
            <result property="userName" column="userName"></result>-->
        </collection>
    </resultMap>

   <!-- <select id="getAllByRoleId" parameterType="int" resultMap="ById">
    select r.rid,roleName,u.id,userName from smbms_role r inner join smbms_user u on r.rid=u.userRole where r.rid=#{id}
    </select>-->


    <select id="getAllByRoleId" parameterType="int" resultMap="ById">
        select * from smbms.smbms_role where rid=#{id}
    </select>
    <select id="getUser" resultType="com.marketsys.entity.User">
        select * from smbms.smbms_user where userRole=#{rid};
    </select>


    <!--多对一关联查询-->
    <!--查询所有用户信息  包含用户角色-->
    <resultMap id="userListAndRole" type="com.marketsys.entity.User">
        <id column="id" property="id"></id>
        <result column="userName" property="userName"></result>
        <association property="role" javaType="com.marketsys.entity.SmbmsRoleEntity" select="getRole" column="userRole">
            <id column="rid"  property="rid"></id>
            <result column="roleName" property="roleName"></result>
        </association>
    </resultMap>

    <!--<select id="getUserList" resultMap="userListAndRole">
       select  u.id,u.userName,u.userRole,r.rid,r.roleName from smbms.smbms_user as u ,smbms.smbms_role  as r where u.userRole=r.rid 
    </select>-->
    <select id="getUserList" resultMap="userListAndRole">
       select * from smbms.smbms_user
    </select>
<select id="getRole" resultType="com.marketsys.entity.SmbmsRoleEntity">
    select * from smbms.smbms_role where rid=#{userRole}
</select>


    <!--多对多关联查询-->
    <!--查询所有学生信息 以及授课教员-->
    <resultMap id="studentInfoMapper" type="com.marketsys.entity.Student">
        <id column="stuid" property="stuid"></id>
        <result column="stuname" property="stuname"></result>
        <collection property="teachers" ofType="com.marketsys.entity.Teacher">
            <id column="tid" property="tid"></id>
            <result column="tname" property="tname"></result>
        </collection>
    </resultMap>
    <select id="getStudentInfo" resultMap="studentInfoMapper">
        select * from student,teacher,stu_t where student.stuid=stu_t.stuid and teacher.tid=stu_t.tid;
    </select>



    <!--自关联查询-->
    <!--查询河南省下的所有子集-->
    <resultMap id="cityMapper" type="com.marketsys.entity.City">
        <id column="cid" property="cid"></id>
        <result column="cname" property="cname"></result>
        <result column="pid" property="pid"></result>
        <collection property="childCitys" ofType="com.marketsys.entity.City" select="getCity" column="cid">
            <id column="cid" property="cid"></id>
            <result column="cname" property="cname"></result>
            <result column="pid" property="pid"></result>
        </collection>
    </resultMap>
    <select id="getCityAndChildCitys" resultMap="cityMapper">
        select * from city where cid=#{cid}
    </select>
    <select id="getCity" resultMap="cityMapper">
        select * from city where pid=#{cid};
    </select>
</mapper>

三、各个关联查询测试类

//一对多
    @Test
    public void test1(){
      SmbmsRoleEntity allByRoleId = providerTest.getAllByRoleId(3);
        System.out.println("角色:"+allByRoleId.getRoleName());
            for (User user: allByRoleId.getGetRoleEntitys()) {
                System.out.print("姓名:"+user.getUserName()+"	");
            }
    }

    //多对一
    @Test
    public void test2(){
        List<User> userList = providerTest.getUserList();
        for (User user :userList)
            System.out.println("用户:"+user.getUserName()+"	角色:"+user.getRole().getRoleName());
        }


     //多对多
    @Test
    public void test3(){
        List<Student> studentInfo = providerTest.getStudentInfo();
        for (Student student:studentInfo){
            System.out.println("学生:"+student.getStuname());
            for (Teacher teacher:student.getTeachers()){
                System.out.println("	教员:"+teacher.getTname());
            }
        }
    }


    //自查询
    @Test
    public void test4(){
        City cityAndChildCitys = providerTest.getCityAndChildCitys(410000);
        System.out.println(cityAndChildCitys.toString());
    }

四、关联查询含义

  1.一对多关联查询

  一对多关联查询是指,在查询一对象的时候,同时将其所关联的多放对象也都查询出来。

  2.多对一关联查询

  这里的多对一关联查询是指,在查询多方对象的时候,同时将其所关联的一方对象也查询出来。

  由于查询多方对象时也是一个一个查询,所以多对一关联查询,其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。

  3.多对多关联查询

  多对多关联关系,例如一个学生可以选多门课程,而一门课程可以由多个学生选择。多对多关系,其实是由两个互反的一对多关系组成。一般情况下,多对多关系都会通过一个中间表来建立

  4.自关联查询

  所谓自关联查询是指,自己即充当一方,又充当多方,是1:n或n:1的变型。例如,对于新闻栏目NewsLabel,可以充当一方,即父栏目,也可以充当多方,即子栏目。而反映到DB表中,只有一张表,这张表中具有一个外键,用于表示该栏目的父栏目。一级栏目没有父栏目,所以可以将其外键值设为0,而子栏目则具有外键值。

将自关联分为两种情况。一种是当作1:n,即当前类作为一方,其包含多方的集合域属性。一种是当作n:1,即当前类作为多方,其包含一方的域属性。

原文地址:https://www.cnblogs.com/szhhhh/p/11662710.html