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高级结果映射的子集,首先,在本例中我们使用的是集合元素来解决多对多的查询 ...
随机推荐
- (15)模型层-什么是ORM
ORM是什么 1.MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发 ...
- C++学习(十一)(C语言部分)之 练习
/* 1.if 输入一个成绩 进行分级 输入一个数字 判断是否是水仙花数 比如 153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3 2.switch 提示 先对数字做处理 ...
- win10安装系统后,提示initializing and establishing link无法启动系统
使用老毛桃安装系统前,先对硬盘进行分区,分区时选择mbr格式分区就可以了,安装好系统重启进入系统时将boot安全启动关闭,模式改为legal(那个单词大概长这样,不记得了,反正那里就两个模式,可以都试 ...
- auto sudo password in shell
here is the example how to implement the auto password in shell script. Echo yourpasswordhere | sudo ...
- 普林斯顿数学指南(第二卷) (Timothy Gowers 著)
第IV部分 数学的各个分支 IV.1 代数数 IV.2 解析数论 IV.3 计算数论 IV.4 代数几何 IV.5 算术几何 IV.6 代数拓扑 IV.7 微分拓扑 IV.8 模空间 IV.9 表示理 ...
- 算法导论 (Thomas H.Cormen / Charles E.Leiserson / Ronald L.Rivest / Clifford Stein 著)
第一部分 基础知识 第1章 算法在计算中的作用 第2章 算法基础 第3章 函数的增长 第4章 分治策略 第5章 概率分析和随机算法 第二部分 排序和顺序统计量 第6章 堆排序 第7章 快速排序 第8章 ...
- IBM websphere MQ使用说明
百度文库: IBM websphere MQ使用说明 IBM MQ安装和配置
- 客户端代码压缩成zip和服务器开启gzip
1.我说的zip是打包完的js代码,用压缩工具压缩为zip文件,这样放CDN上,下载量会进一步缩小,提高进入游戏的速度 嗯,需要在游戏页用js解压zip文件 2.最简单的就服务器开启gzip
- pri 知识点
pri github:https://github.com/prijs/pri 添加路由后动态导入,使用的是 react-loadable:https://github.com/jamiebuilds ...
- MongoDB从3.0.6升级到MongoDB3.4.9
最初进入公司的时候,有些爬虫数据需要存储在mongo数据库里面,当时看到最新的数据库版本是3.0.6,现在公司开展了新的项目需要使用到Mongo,使用到了Mongo的一些表关联查询的方法,但是只有在最 ...