Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis连表查询之association与collection

Mybatis连表查询之association与collection

作者头像
九转成圣
发布于 2024-04-10 09:10:20
发布于 2024-04-10 09:10:20
14400
代码可运行
举报
文章被收录于专栏:csdncsdn
运行总次数:0
代码可运行

Mybatis连表查询之association与collection

association

实体类

不用再在EmpDept中将Dept的所有属性都挨个写一遍,只需要引用Dept这个对象即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Setter
@Getter
public class EmpDept extends Emp {
    private Dept dept;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

Mapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<resultMap id="EmpDeptResultMap" type="com.example.hello.entity.EmpDept" extends="com.example.hello.dao.EmpMapper.BaseResultMap">
    <association property="dept" resultMap="com.example.hello.dao.DeptMapper.BaseResultMap"></association>
</resultMap>

<select id="selectEmpDept" resultMap="EmpDeptResultMap">
    SELECT * from emp e left join dept d on d.deptno = e.deptno
</select>

xml说明

  1. resultMap标签的extends属性可以通过继承父结果映射来复用已定义的映射规则(不在同一个命名空间下需要指定命名空间,复用代码生成器生成的结果集映射,表字段变动之后,不再需要修改此处,一处定义处处使用,你品…如果此处再写一遍,一方面是麻烦,更让人郁闷的是,如果表字段修改了,此处需要手动维护,想想就头大)。

association的resultMap应用的BaseResultMap不在当前空间下,所以要加上命名空间

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootTest
class EmpDeptMapperTest {

    @Autowired
    EmpDeptMapper empDeptMapper;

    @Test
    void selectEmpDept() {
        List<EmpDept> empDepts = empDeptMapper.selectEmpDept();
        for (EmpDept empDept : empDepts) {
            System.out.println(empDept);
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"comm":20000.0,"createTime":1659164366000,"dept":{"deptno":1,"dname":"开发部","loc":"北京"},"deptno":1,"empno":6,"ename":"彭和尚","hiredate":351446400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4}
{"comm":10000.0,"createTime":1659164366000,"dept":{"deptno":1,"dname":"开发部","loc":"北京"},"deptno":1,"empno":7,"ename":"张中","hiredate":351619200000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4}
{"comm":15000.0,"createTime":1659164366000,"dept":{"deptno":1,"dname":"开发部","loc":"北京"},"deptno":1,"empno":8,"ename":"说不得","hiredate":370454400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4,"sal":1.0}
{"comm":10000.0,"createTime":1659164366000,"dept":{"deptno":1,"dname":"开发部","loc":"北京"},"deptno":1,"empno":9,"ename":"冷谦","hiredate":368726400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4}
{"comm":30000.0,"createTime":1659164366000,"dept":{"deptno":1,"dname":"开发部","loc":"北京"},"deptno":1,"empno":10,"ename":"周巅","hiredate":376156800000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4}
{"createTime":1659164366000,"dept":{"deptno":2,"dname":"测试部","loc":"上海"},"deptno":2,"empno":11,"ename":"殷野王","hiredate":545760000000,"job":"教主舅舅","lDelete":0,"lVersion":1,"mgr":3}
{"createTime":1659164366000,"dept":{"deptno":2,"dname":"测试部","loc":"上海"},"deptno":2,"empno":12,"ename":"殷素素","hiredate":376156800000,"job":"教主妈妈","lDelete":0,"lVersion":1,"mgr":3}
{"createTime":1659164366000,"dept":{"deptno":2,"dname":"测试部","loc":"上海"},"deptno":2,"empno":13,"ename":"小昭","hiredate":380563200000,"job":"神秘丫头","lDelete":0,"lVersion":1,"mgr":2}
{"createTime":1659164366000,"dept":{"deptno":3,"dname":"市场部","loc":"广州"},"deptno":3,"empno":2,"ename":"紫衫龙王","hiredate":360864000000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1}
{"createTime":1659164366000,"dept":{"deptno":3,"dname":"市场部","loc":"广州"},"deptno":3,"empno":3,"ename":"白眉鹰王","hiredate":354988800000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1}
{"createTime":1659164366000,"dept":{"deptno":3,"dname":"市场部","loc":"广州"},"deptno":3,"empno":4,"ename":"金毛狮王","hiredate":357494400000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1}
{"createTime":1659164366000,"dept":{"deptno":3,"dname":"市场部","loc":"广州"},"deptno":3,"empno":5,"ename":"青翼蝙王","hiredate":345830400000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1}
{"comm":200.0,"createTime":1659164366000,"dept":{"deptno":4,"dname":"运营部","loc":"杭州"},"deptno":4,"empno":1,"ename":"张无忌","hiredate":374774400000,"job":"教主","lDelete":0,"lVersion":2,"updateTime":1659194462000}

单条数据格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "comm": 200,
    "createTime": 1659164366000,
    "deptno": 4,
    "empno": 1,
    "ename": "张无忌",
    "hiredate": 374774400000,
    "job": "教主",
    "lDelete": 0,
    "lVersion": 2,
    "updateTime": 1659194462000,
    "dept": {
        "deptno": 4,
        "dname": "运营部",
        "loc": "杭州"
    }
}

collection

实体类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Setter
@Getter
public class DeptEmp extends Dept {
    private List<Emp> emps;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}

Mapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<resultMap id="DeptEmpResultMap" type="com.example.hello.entity.DeptEmp" extends="com.example.hello.dao.DeptMapper.BaseResultMap">
    <collection property="emps" ofType="Emp" resultMap="com.example.hello.dao.EmpMapper.BaseResultMap"></collection>
</resultMap>

注意:

  1. resultMap标签的type只写DeptEmp会报错,collection的ofType只写Emp是可以的(猜测指定了DeptEmp,应该可以根据属性推断出来),不写也不会报错

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootTest
class EmpDeptMapperTest {

    @Autowired
    EmpDeptMapper empDeptMapper;

    @Test
    void selectDeptEmp() {
        List<DeptEmp> deptEmps = empDeptMapper.selectDeptEmp();
        for (DeptEmp deptEmp : deptEmps) {
            System.out.println(deptEmp);
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"deptno":4,"dname":"运营部","emps":[{"comm":200.0,"createTime":1659164366000,"deptno":4,"empno":1,"ename":"张无忌","hiredate":374774400000,"job":"教主","lDelete":0,"lVersion":2,"updateTime":1659194462000}],"loc":"杭州"}
{"deptno":3,"dname":"市场部","emps":[{"createTime":1659164366000,"deptno":3,"empno":2,"ename":"紫衫龙王","hiredate":360864000000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1},{"createTime":1659164366000,"deptno":3,"empno":3,"ename":"白眉鹰王","hiredate":354988800000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1},{"createTime":1659164366000,"deptno":3,"empno":4,"ename":"金毛狮王","hiredate":357494400000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1},{"createTime":1659164366000,"deptno":3,"empno":5,"ename":"青翼蝙王","hiredate":345830400000,"job":"护教法王","lDelete":0,"lVersion":1,"mgr":1}],"loc":"广州"}
{"deptno":1,"dname":"开发部","emps":[{"comm":20000.0,"createTime":1659164366000,"deptno":1,"empno":6,"ename":"彭和尚","hiredate":351446400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4},{"comm":10000.0,"createTime":1659164366000,"deptno":1,"empno":7,"ename":"张中","hiredate":351619200000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4},{"comm":15000.0,"createTime":1659164366000,"deptno":1,"empno":8,"ename":"说不得","hiredate":370454400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4,"sal":1.0},{"comm":10000.0,"createTime":1659164366000,"deptno":1,"empno":9,"ename":"冷谦","hiredate":368726400000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4},{"comm":30000.0,"createTime":1659164366000,"deptno":1,"empno":10,"ename":"周巅","hiredate":376156800000,"job":"五散人","lDelete":0,"lVersion":1,"mgr":4}],"loc":"北京"}
{"deptno":2,"dname":"测试部","emps":[{"createTime":1659164366000,"deptno":2,"empno":11,"ename":"殷野王","hiredate":545760000000,"job":"教主舅舅","lDelete":0,"lVersion":1,"mgr":3},{"createTime":1659164366000,"deptno":2,"empno":12,"ename":"殷素素","hiredate":376156800000,"job":"教主妈妈","lDelete":0,"lVersion":1,"mgr":3},{"createTime":1659164366000,"deptno":2,"empno":13,"ename":"小昭","hiredate":380563200000,"job":"神秘丫头","lDelete":0,"lVersion":1,"mgr":2}],"loc":"上海"}

单条数据格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "deptno": 4,
    "dname": "运营部",
    "loc": "杭州",
    "emps": [
        {
            "comm": 200,
            "createTime": 1659164366000,
            "deptno": 4,
            "empno": 1,
            "ename": "张无忌",
            "hiredate": 374774400000,
            "job": "教主",
            "lDelete": 0,
            "lVersion": 2,
            "updateTime": 1659194462000
        }
    ]
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyBatis 多对一关联和一对多关联
关联关系,体现的是两个类之间的一种强依赖关系。比如在员工类中,有一个属性是部门类的对象;先看第一种 嵌套查询:
张哥编程
2024/12/17
1440
MySQL 多表查询与复杂查询技巧实战
实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。
用户11286421
2025/03/24
1960
MySQL 多表查询与复杂查询技巧实战
MySQL系列之自连接用法简介
这里使用左连接比较合适,因为顶级员工,也就是公司的总裁,是没有最上级的,用inner join的话,是不能获取数据的
SmileNicky
2022/05/07
6860
MySQL系列之自连接用法简介
mysql中select子查(select中的select子查询)询探索
通过执行计划可以看出,先执行的是DEPENDENT SUBQUERY这部分(id大的优先执行),也就是select dname from dept d where e.deptno = d.deptno但是这部分是不能单独执行的,所以猜测mysql对这部分做了处理,处理成类似这种select d.dname,e.deptno from dept d join emp e on d.deptno = e,deptno,生成了一个临时表,然后再执行主表和临时表的连表查询(临时表的意思是啥?比如dept表有很多列,同时又很多行,其中还有一大部分不满足d.deptno = e,deptno这个条件,此时临时表相对于对大表做了一个精简)
九转成圣
2024/05/24
4800
MySQL复合查询全解析:从基础到多表关联与高级技巧
这里‘J_’和‘J%’的主要区别在于它们所代表的字符串匹配模式的严格程度和范围。‘J_’更为严格,只匹配特定长度的字符串;而‘J%’则更为灵活,能匹配任意长度的字符串(只要以‘J’开头)。 
用户11316056
2025/05/05
960
MySQL复合查询全解析:从基础到多表关联与高级技巧
MyBatis框架(二)
导包, 配置mybatis的总配置文件: mybatis-config.xml, 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE con
二十三年蝉
2018/02/28
7640
MyBatis框架(二)
MyBatis--多表查询
resultMap标签为处理关联关系的父标签,后续关联关系定义都是在该标签下进行的
aruba
2022/05/17
2550
DBMS_UTILITY.EXPAND_SQL_TEXT
视图可以是一个有用的方法来隐藏开发人员的复杂性,但可能会导致问题。 使用视图很容易编写明显简单的语句,最终可能导致极其复杂的SQL被发送到服务器。 DBMS_UTILITY.EXPAND_SQL_TEXT过程展开对视图的引用,将它们转换为原始语句中的子查询。 一个简单的例子如下所示。
Yunjie Ge
2022/04/24
5620
大数据必学Java基础(一百):员工管理系统开发
​员工管理系统开发一、DAO接口package com.lanson.dao;import com.lanson.pojo.Emp;import java.util.List;/** * @Author: Lansonli * @Description: MircoMessage:Mark_7001 */public interface EmpDao { /** * 向数据库Emp表中增加一条数据的方法 * @param emp 要增加的数据封装成的Emp类的对象 * @ret
Lansonli
2022/12/16
6640
大数据必学Java基础(一百):员工管理系统开发
初体验Spring Boot 2支持的HikariCP连接池
Hikari,没错,听着就不像英文,是一句日语,最初是由一个居住在日本的老外开发的一款数据库连接池。 (这单词怎么读呢?hi·ka·'lē。注意最后的ri读成le才会有感觉。) 它,超快,快到连Spr
ImportSource
2018/04/03
2.6K0
初体验Spring Boot 2支持的HikariCP连接池
初识MySQL · 复合查询(内外连接)
在前文我们学习了MySQL的基本查询,就是简单的套用了select语句,最多不过是加上了一些聚合函数,使用了group by或者是having等。
_lazy
2025/04/11
1610
初识MySQL · 复合查询(内外连接)
MySQL经典练习题+解题思路(一)
(2)再将查询结果当做一张临时表,与emp表进行表连接(因为有的最高薪水是相同的人,需要将他们都显示出来)
啵啵鱼
2022/11/23
6620
MySQL经典练习题+解题思路(一)
MySQL基础之STRAIGHT JOIN用法简介
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SmileNicky
2019/11/12
8530
SQL员工部门表综合查询60题
CREATE DATABASE oa; USE oa; CREATE TABLE dept( deptno INT PRIMARY KEY, dname VARCHAR(20), loc VARCHAR(20) ) DROP TABLE emp CREATE TABLE emp( empno INT PRIMARY KEY, ename VARCHAR(20) NOT NULL, job VARCHAR(20) CHECK (job IN ('CLERK','SALESMAN','MANAGER','
Albert陈凯
2018/04/04
5.4K0
Oracle 数据库查询专题 (select * from emmmm 80 T)
传送门: Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】) Oracle数据库学习笔记 (四 —— select 从入门到放弃 【下】)
Gorit
2021/12/09
4900
MyBatis--初入MyBatis
我这边是建了一个Maven主工程,以及Maven的Module,后续依赖导入直接放入主工程pom中,方便其他Module使用
aruba
2022/05/13
3230
MyBatis--初入MyBatis
Oracle学习(五):多表查询
1.知识点:可以对照下面的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,dname 2 from emp,dept 3 where emp.deptno=dept.deptno; SQL> --不等值连接 SQL> --查询员工信息: 姓名 月薪 工资级别 SQL> select ename,sal,grade 2 from emp e,salgrade s 3 wh
Java架构师必看
2021/05/17
4290
使用Oracle中的emp,dept来学习Django ORM
学习Django的时候,总是觉得这部分内容和实际的应用有一定的差别或者距离。一方面Django自带的ORM对于底层数据库来说是一种适配性很强的组件,可以不强依赖于某一种数据库,sqlite,MySQL,Oracle,PG等等都可以,学习起来需要一定的周期。另外一方面是因为这种方式是通用的API,一下子没有了SQL语句,要理解并接受这种思想,需要一点时间,对很多DBA来说需要适应。第三点就是没有融会贯通,好像看明白了,但是实际写的时候发现还是摸黑,不知道从何入手。 所以我就换个思路,从数据库
jeanron100
2018/03/22
9290
使用Oracle中的emp,dept来学习Django ORM
Oracle 查询练习
1.已知Oracle的Scott用户中提供了三个测试数据库表,名称分别为dept,emp和salgrade。使用SQL语言完成以下操作
Arebirth
2019/09/24
1.4K0
MYSQLg高级------批量插入百万级数据量
上面的作用就是为了下的 $$ (函数;的表达式)更好的执行;重启或者重新连接即可恢复默认
默 语
2024/11/20
390
MYSQLg高级------批量插入百万级数据量
相关推荐
MyBatis 多对一关联和一对多关联
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验