1.多表设计 多表查询

a.多表设计

(1)一对一

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

(2)一对多

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

(3)多对多

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

b.多表查询

笛卡尔积查询

内连接查询

外连接查询

  左外连接查询

  右外连接查询

  全外连接查询

2.MyBatis中的一对一查询

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

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

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

配置方式:

  1. <!-- 一对一查询 -->
  2. <resultMap type="cn.tedu.mybatis.beans.Grade" id="gradeRM">
  3. <id column="gid" property="id"/>
  4. <result column="gname" property="name"/>
  5. <association property="room" javaType="cn.tedu.mybatis.beans.Room">
  6. <id column="rid" property="id"/>
  7. <result column="rname" property="name"/>
  8. </association>
  9. </resultMap>
  10.  
  11. <select id="queryO2O" resultMap="gradeRM">
  12. select grade.id as gid,grade.name as gname
  13. ,room.id as rid,room.name as rname
  14. from
  15. room,grade
  16. where
  17. room.id = grade.rid;
  18. </select>

测试类:

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

3.MyBatis中的一对多查询

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

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

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

  1. <!-- 一对多查询 -->
  2. <resultMap type="cn.tedu.mybatis.beans.Dept" id="deptRM">
  3. <id column="did" property="id"/>
  4. <result column="dname" property="name"/>
  5. <collection property="empList" ofType="cn.tedu.mybatis.beans.Emp">
  6. <id column="eid" property="id"/>
  7. <result column="ename" property="name"/>
  8. </collection>
  9. </resultMap>
  10.  
  11. <select id="queryO2M" resultMap="deptRM">
  12. select
  13. dept.id as did,
  14. dept.name as dname,
  15. emp.id as eid,
  16. emp.name as ename
  17. from
  18. dept inner join emp on dept.id = emp.deptid;
  19. </select>

测试类:

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

3.MyBatis中的多对多查询

  1. create table stu(id int primary key,name varchar(255));
  2. insert into stu values (1,'小新'),(2,'小白'),(3,'美伢'),(4,'风间');
  3. create table teacher(id int primary key,name varchar(255));
  4. insert into teacher values (999,'孙悟空'),(888,'猪八戒'),(777,'萨达姆'),(666,'哈利波特');
  5. create table stu_teacher (sid int,tid int);
  6. 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标签来声明映射方式

  1. <!-- 多对多查询 -->
  2. <resultMap type="cn.tedu.mybatis.beans.Teacher" id="teacherRM">
  3. <id column="tid" property="id"/>
  4. <result column="tname" property="name"/>
  5. <collection property="stuList" ofType="cn.tedu.mybatis.beans.Stu">
  6. <id column="sid" property="id"/>
  7. <result column="sname" property="name"/>
  8. </collection>
  9. </resultMap>
  10.  
  11. <select id="queryM2M" resultMap="teacherRM">
  12. select
  13. stu.id as sid,
  14. teacher.id as tid,
  15. stu.name as sname,
  16. teacher.name as tname
  17. from
  18. stu,teacher,stu_teacher
  19. where
  20. stu.id = stu_teacher.sid
  21. and
  22. teacher.id = stu_teacher.tid;
  23. </select>

测试类:

  1. /**
  2. * 多表查询:多对多
  3. */
  4. @Test
  5. public void test15(){
  6. //1.创建sqlSession
  7. SqlSession session = factory.openSession();
  8. //2.执行操作
  9. List<Teacher> list = session.selectList(
  10. "cn.tedu.mybatis.beans.UserMapper.queryM2M");
  11. //3.打印结果
  12. System.out.println(list);
  13. }

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. C++学习(十八)(C语言部分)之 指针2

    指针1.指针的概述 指针是什么? 指针是一个地址 是一个常量 int 整型 int a a是变量 指针用来做什么? 方便使用数组或者字符串 像汇编语言一样处理内存地址2.指针变量 什么是指针变量? 是 ...

  2. 实验吧—隐写术——WP之 我喜欢培根

    打开解题链接: 有一点点基础的同学大概都知道这是摩尔斯电码,那么我们对他进行解密: 解密后得到: MORSEnullISnullCOOLnullBUTnullBACONnullISnullCOOLER ...

  3. linux----磁盘介绍

    1.磁盘简图: 2.常见分区 mbr:主引导区,共512byte 扩展分区 逻辑分区

  4. 理解--->Java中的值传递&引用传递

    转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...

  5. Go Example--变参函数

    package main import "fmt" func main() { sum(1,2) sum(1,2,3) nums := []int{1,2,3,4} //nums. ...

  6. WebService 学习记录

    -------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了 Web Service 教程 一.webser ...

  7. python可变类型和不可变类型

    原文地址:http://www.cnblogs.com/huamingao/p/5809936.html 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutab ...

  8. 简单webpack plugin 开发

    重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...

  9. Jenkins发布后自动通知【钉钉】

    阅读目录 一.前言 二.使用钉钉推送的优势 三.配置 一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及 ...

  10. day 26 网络通讯流程 初识socke

    一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...