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);
}

MyBatis 多表查询的更多相关文章

  1. Mybatis多表查询出现null字段

    写在前面 今天使用mybatis实现多表查询,记录一下其中遇到的坑 mybatis多表查询简介 mybatis多表查询主要有两个方式,通俗易懂的来说就是一个是查询少量属性(association),一 ...

  2. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

  3. MyBatis联表查询

    MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...

  4. mybatis 关联表查询

    这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...

  5. mybatis 联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. Mybatis多表查询之一对一查询的多种实现-XML配置

    Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素 ...

  7. mybatis 多表查询sql

    在使用spring,spring mvc,mybatis时,mybatis链接数据库做多表查询的时候,sql语句中直接使用left join等链接字符就可以 链接多个表,参数类型是parameterT ...

  8. Mybatis多表查询(一对一、一对多、多对多)

    Mybatis的多表级联查询 . 一对一可以通过<association>实现,一对多和多对多通过<collection>实现. <discriminator> 元 ...

  9. mybatis多表查询之多对多关系查询的实现-xml方式

    Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...

随机推荐

  1. 牛客国庆集训派对Day4 I-连通块计数(思维,组合数学)

    链接:https://www.nowcoder.com/acm/contest/204/I 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  2. C++学习(二十六)(C语言部分)之 结构体3(联合,枚举)

    结构体 struct 类型定义点运算符 . 变量名.成员 成员是数组的时候不能用等于号赋值箭头运算符 -> 指针->成员 作用 存放多个不同类型的有关联的数据 与结构体类似的类型1.联合作 ...

  3. da shu mo ban

    #include<bits/stdc++.h> using namespace std; ;/*精度位数,自行调整*/ //1.如果需要控制输出位数的话,在str()里面把len调成需要的 ...

  4. struts2参数转换器用法

    贴代码 struts的action中接收简单类型参数,struts2可以自动转化,但是复杂类型需要自定义转换器转换 public class ConvertAction extends ActionS ...

  5. c的动态内存管理

    在linux系统下使用malloc提示警告,解决方法,加入头文件<stdlib.h> 首先来个基本的例子 int *p=(int *)malloc(sizeof(int));(当mallo ...

  6. [转]从OSI网络模型到TCP/IP协议族简介

    OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...

  7. 与左侧的 圆括号“(”(位于“e:\大二上课程课件、作业和答案\数据结构\chapter4\sqstack\sqstack\mysqstack.h(23)”)匹配之前遇到文件结束

    错误原因是“某对圆括号只打了左括号而没有右括号”,debug方法是:直接根据报错提示:“与左侧的 圆括号“(”(位于“e:\大二上课程课件.作业和答案\数据结构\chapter4\sqstack\sq ...

  8. RSA 加密算法 Java 公钥加密私钥解密 和 私钥加密公钥解密 的特点

    package com.smt.cipher.unsymmetry; import org.apache.commons.codec.binary.Base64; import org.apache. ...

  9. php路径常量

    我们知道PHP中提供了一个魔术常量(magic constant)__FILE__,用来指向当前执行的PHP脚本.但PHP没有直接提供该脚本所在目录的常量.也就是说如果我们要得到当前PHP脚本所在的目 ...

  10. spring-配置事务

    使用注解方式配置事务: 一.事物管理 事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的状态,避免出现由于数据不一致而导致的 ...