zoukankan      html  css  js  c++  java
  • 关联查询

    一、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,即当前类作为多方,其包含一方的域属性。

  • 相关阅读:
    cocos2dx的发展的例子2048(加入动画版)
    Hibernate操作Clob数据类型
    json级联城市
    Ubuntu Linux 永山(mount)分
    C++出现计算机术语5
    Cocos2d-x 3.0 红孩儿私人义务教育
    大页(huge pages) 三大系列 ---计算大页配置参数
    EJB_消息驱动发展bean
    HDU5086Revenge of Segment Tree(数论)
    第五章_JSTL
  • 原文地址:https://www.cnblogs.com/szhhhh/p/11662710.html
Copyright © 2011-2022 走看看