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);
- }
MyBatis 多表查询的更多相关文章
- Mybatis多表查询出现null字段
写在前面 今天使用mybatis实现多表查询,记录一下其中遇到的坑 mybatis多表查询简介 mybatis多表查询主要有两个方式,通俗易懂的来说就是一个是查询少量属性(association),一 ...
- 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)
在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...
- mybatis 关联表查询
这段时间由于项目上的需求:需要将数据库中两表关联的数据查询出来展示到前端(包含一对一,一对多): (1)一对一: 在实体类中维护了另一个类的对象: 这里我以用户(User)和产品(Product)为例 ...
- mybatis 联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Mybatis多表查询之一对一查询的多种实现-XML配置
Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素 ...
- mybatis 多表查询sql
在使用spring,spring mvc,mybatis时,mybatis链接数据库做多表查询的时候,sql语句中直接使用left join等链接字符就可以 链接多个表,参数类型是parameterT ...
- Mybatis多表查询(一对一、一对多、多对多)
Mybatis的多表级联查询 . 一对一可以通过<association>实现,一对多和多对多通过<collection>实现. <discriminator> 元 ...
- mybatis多表查询之多对多关系查询的实现-xml方式
Mybatis对于多对多关系下的查询提供了集合(collection)的概念来解决,collection属性是resultMap高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...
随机推荐
- C++学习(十八)(C语言部分)之 指针2
指针1.指针的概述 指针是什么? 指针是一个地址 是一个常量 int 整型 int a a是变量 指针用来做什么? 方便使用数组或者字符串 像汇编语言一样处理内存地址2.指针变量 什么是指针变量? 是 ...
- 实验吧—隐写术——WP之 我喜欢培根
打开解题链接: 有一点点基础的同学大概都知道这是摩尔斯电码,那么我们对他进行解密: 解密后得到: MORSEnullISnullCOOLnullBUTnullBACONnullISnullCOOLER ...
- linux----磁盘介绍
1.磁盘简图: 2.常见分区 mbr:主引导区,共512byte 扩展分区 逻辑分区
- 理解--->Java中的值传递&引用传递
转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...
- Go Example--变参函数
package main import "fmt" func main() { sum(1,2) sum(1,2,3) nums := []int{1,2,3,4} //nums. ...
- WebService 学习记录
-------------------------------------------PS:这个WebService 服务必须一直开着,关闭就没法访问了 Web Service 教程 一.webser ...
- python可变类型和不可变类型
原文地址:http://www.cnblogs.com/huamingao/p/5809936.html 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutab ...
- 简单webpack plugin 开发
重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...
- Jenkins发布后自动通知【钉钉】
阅读目录 一.前言 二.使用钉钉推送的优势 三.配置 一.前言 最近使用Jenkins进行自动化部署,但是发布署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于大家接受的设置,导致不能及 ...
- day 26 网络通讯流程 初识socke
一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...