zoukankan      html  css  js  c++  java
  • MyBatis 多表查询

    1.多表设计 多表查询

    a.多表设计

    (1)一对一

      在任意一方设计外键保存另一张表的主键,维系表和表的关系

    (2)一对多

      在多的一方设计外键保存一的一方的主键,维系表和表的关系

    (3)多对多

      设计一张第三方关系表,存储两张表的主键的对应关系,将一个多对多拆成两个一对多来存储

    b.多表查询

    笛卡尔积查询

    内连接查询

    外连接查询

      左外连接查询

      右外连接查询

      全外连接查询

    2.MyBatis中的一对一查询

    create table room(id int primary key,name varchar(255));
    insert into room values (1,'mhw'),(2,'兰花屋'),(3,'桃花屋');
    create table grade(id int primary key,name varchar(255), rid int);
    insert into grade values (999,'向日葵班',2),(888,'玫瑰花班',3),(777,'菊花班',1);

    在通过MyBatis实现一对一的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,

    在一对一的bean中,如果包含了另一个表的对应对象,则可以在resultMap中通过association标签来声明映射方式:

    配置方式:

        <!-- 一对一查询 -->
        <resultMap type="cn.tedu.mybatis.beans.Grade" id="gradeRM">
            <id column="gid" property="id"/>
            <result column="gname" property="name"/>
            <association property="room" javaType="cn.tedu.mybatis.beans.Room">
                <id column="rid" property="id"/>
                <result column="rname" property="name"/>
            </association>
        </resultMap>
        
        <select id="queryO2O" resultMap="gradeRM">
            select grade.id as gid,grade.name as gname
                    ,room.id as rid,room.name as rname 
            from 
                room,grade 
            where 
                room.id = grade.rid;
        </select>
        

    测试类:

        // 根据配置文件创建sqlSessionFactory
        private SqlSessionFactory factory = null;
        @Before
        public void before() throws Exception{
            //1.读取MyBatis核心配置文件
            InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
            //2.根据配置文件创建sqlSessionFactory
            factory = new SqlSessionFactoryBuilder().build(in);
        }
        
        /**
         * 多表查询:一对一
         */
        @Test
        public void test13(){
            //1.创建sqlSession
            SqlSession session = factory.openSession();
            //2.执行操作
            List<Grade> list = session.selectList(
                    "cn.tedu.mybatis.beans.UserMapper.queryO2O");
            //3.打印结果
            System.out.println(list);
        }

    3.MyBatis中的一对多查询

    create table dept(id int primary key,name varchar(255));
    insert into dept values (1,'财务部'),(2,'行政部'),(3,'人事部'),(4,'销售部');
    create table emp(id int primary key,name varchar(255), deptid int);
    insert into emp values (999,'孙悟空',4),(888,'萨达姆',3),(777,'哈利波特',1),(666,'特朗普',2);

    在通过MyBatis实现一对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在一对多的bean中,

    如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式:

        <!-- 一对多查询 -->
        <resultMap type="cn.tedu.mybatis.beans.Dept" id="deptRM">
            <id column="did" property="id"/>
            <result column="dname" property="name"/>
            <collection property="empList" ofType="cn.tedu.mybatis.beans.Emp">
                <id column="eid" property="id"/>
                <result column="ename" property="name"/>
            </collection>
        </resultMap>
    
        <select id="queryO2M" resultMap="deptRM">
            select 
                dept.id as did,
                dept.name as dname,
                emp.id as eid,
                emp.name as ename 
            from 
                dept inner join emp on dept.id = emp.deptid;
        </select>

    测试类:

        /**
         * 多表查询:一对多
         */
        @Test
        public void test14(){
            //1.创建sqlSession
            SqlSession session = factory.openSession();
            //2.执行操作
            List<Dept> list = session.selectList(
                    "cn.tedu.mybatis.beans.UserMapper.queryO2M");
            //3.打印结果
            System.out.println(list);
        }

    3.MyBatis中的多对多查询

    create table stu(id int primary key,name varchar(255));
    insert into stu values (1,'小新'),(2,'小白'),(3,'美伢'),(4,'风间');
    create table teacher(id int primary key,name varchar(255));
    insert into teacher values (999,'孙悟空'),(888,'猪八戒'),(777,'萨达姆'),(666,'哈利波特');
    create table stu_teacher (sid int,tid int);
    insert into stu_teacher values (1,999),(1,888),(2,999),(2,777),(3,666),(4,888),(4,666);

    在通过MyBatis实现多对多的查询时,需要通过resultMap指定如何将结果集中的列名对应到目标bean中,在多对多的bean中,

    如果包含了另一个表的对应对象的集合,则可以在resultMap中通过collection标签来声明映射方式

        <!-- 多对多查询  -->
        <resultMap type="cn.tedu.mybatis.beans.Teacher" id="teacherRM">
            <id column="tid" property="id"/>
            <result column="tname" property="name"/>
            <collection property="stuList" ofType="cn.tedu.mybatis.beans.Stu">
                <id column="sid" property="id"/>
                <result column="sname" property="name"/>
            </collection>
        </resultMap>
        
        <select id="queryM2M" resultMap="teacherRM">
            select 
                stu.id as sid,
                teacher.id as tid,
                stu.name as sname,
                teacher.name as tname 
            from 
                stu,teacher,stu_teacher 
            where 
                stu.id = stu_teacher.sid 
                and
                teacher.id = stu_teacher.tid;
        </select>

    测试类:

        /**
         * 多表查询:多对多
         */
        @Test
        public void test15(){
            //1.创建sqlSession
            SqlSession session = factory.openSession();
            //2.执行操作
            List<Teacher> list = session.selectList(
                    "cn.tedu.mybatis.beans.UserMapper.queryM2M");
            //3.打印结果
            System.out.println(list);
        }
  • 相关阅读:
    Windows Server 2012 R2搭键域环境
    JS节点的属性: nodeType, nodeName, nodeValue
    JS获取文本节点
    JS获取元素节点的子节点
    读写属性节点
    获取指定的元素节点
    JAVA学习--反射之动态代理模式
    JAVA学习--反射之静态代理模式
    JAVA学习--反射其他操作
    JAVA学习--反射构造器操作
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9860708.html
Copyright © 2011-2022 走看看