• 【SSM框架】Mybatis详解11(源码自取)之表关联关系


    • 🧛‍♂️个人主页:杯咖啡
    • 💡进步是今天的活动,明天的保证!
    • ✨目前正在学习:SSM框架,算法刷题
    • 👉本文收录专栏:SSM框架解析
    • 🙌牛客网,刷算法过面试的神级网站,用牛客你也牛。 👉免费注册和我一起学习刷题👈
    • 🐳希望大家多多支持🥰一起进步呀!
    • 😎The man who fears losing has already lost.
      怕输的人已经输了。 - 《权力的游戏》

    ✨前言

    上一节我们学习了入参、返回值map
    本节我们将复习表的关联关系,用一个小例子呈现。
    和我一起复习下去你可以获得一个比较完美框架demo,并且深刻体会框架
    坚持到最后的源码解析你会收获更多哦,加油坚持!!!



    表之间的关联关系

    关联关系是有方向的.
    1)一对多关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在老师方,就是一对多关联.
    2)多对一关联:一个老师可以教多个学生,多个学生只有一个老师来教,站在学生方,就是多对一关联.
    3)一对一关联:一个老师辅导一个学生,一个学生只请教一个老师.学生和老师是一对一.
    4)多对多关联:园区划线的车位和园区的每一辆车.任意一个车位可以停任意一辆车.任意一车辆车可以停在任意一个车位上.

    一对多关联关系

    客户和订单就是典型的一对多关联关系.
    一个客户名下可以有多个订单.
    客户表是一方,订单表是多方.客户一中持有订单的集合.
    使用一对多的关联关系,可以满足查询客户的同时查询该客户名下的所有订单.

    首先修改实体类,添加无参构造方法,有参构造方法,tostring方法,setter,getter方法(下面代码省略

    public class Customer {
        //customer表中的三个列
        private Integer id;
        private String name;
        private Integer age;
        //该客户名下的多有订单,一方持有多方的集合
        private List<Orders> ordersList;
    //------------------------------------------------------
    public class Orders {
        private Integer id;
        private String orderNumber;
        private Double orderPrice;
    
        //包含客户对象,多对一,多方持有一方的对象
        private Customer customer;
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    修改CustomerMapper.xml文件,这里在绑定数据的时候使用了resultMap,这里主要关注一下resultmap的绑定过程

    <mapper namespace="com.bjpowernode.mapper.CustomerMapper">
       
        <resultMap id="customermap" type="customer">
            
            <id property="id" column="cid">id>
            
            <result property="name" column="name">result>
            <result property="age" column="age">result>
    
            
            <collection property="ordersList" ofType="orders">
                
                <id property="id" column="oid">id>
                
                <result property="orderNumber" column="orderNumber">result>
                <result property="orderPrice" column="orderPrice">result>
            collection>
        resultMap>
        <select id="getById" parameterType="int" resultMap="customermap">
            select c.id cid,name,age,o.id oid,orderNumber,orderPrice,customer_id
            from customer c left  join orders o on c.id = o.customer_id
            where c.id=#{id}
        select>
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    编写测试类

    @Test
        public void testGetCustomerById(){
           Customer customer = customerMapper.getById(1);
           System.out.println(customer);
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    这里可以看到,我们查询用户,该用户的订单也显示出来了。

    多对一关联关系

    订单和客户就是多对一关联.
    站在订单的方向查询订单的同时将客户信息查出.
    订单是多方,会持有一方的对象.客户是一方.

    修改OdersMapper.xml文件

    <mapper namespace="com.bjpowernode.mapper.OrdersMapper">
        
    
        
        <resultMap id="ordersmap" type="orders">
            
            <id property="id" column="oid">id>
            
            <result property="orderNumber" column="orderNumber">result>
            <result property="orderPrice" column="orderPrice">result>
            
            <association property="customer" javaType="customer">
                <id property="id" column="cid">id>
                <result property="name" column="name">result>
                <result property="age" column="age">result>
    
            association>
        resultMap>
        <select id="getById" parameterType="int" resultMap="ordersmap">
            select o.id oid,orderNumber,orderPrice,customer_id,c.id cid,name,age
            from orders o inner join customer c on o.customer_id = c.id
            where o.id=#{id}
        select>
      mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    添加测试方法

    @Test
        public void testGetOrdersById(){
            Orders orders = ordersMapper.getById(11);
            System.out.println(orders);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    这里我们看到,查询订单的时候,用户的信息也随着查出来了。

    一对一关联

    下面的一对一以及多对多就不再写例子了,直接上总结。

    多对多关联

    园区划线的车位和园区的每一辆车.任意一个车位可以停任意一辆车.任意一车辆车可以停在任意一个车位上.
    具体例子不在详细写了。看总结。


    ✨总结

    无论是什么关联关系,如果某方持有另一方的集合,则使用标签完成映射,如果某方持有另一方的对象,则使用标签完成映射。
    表关联在用途中,一对多,多对一比较常用,其余的比较少用。
    下一节将会复习到事务,缓存,ORM

    本次源码放在代码仓库gitee,自取链接

    原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

    点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

    收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

    评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

  • 相关阅读:
    2024蓝桥杯每日一题(最短路径)
    .netcore 连接 apache doris
    Gcware Python 接口(8)
    linux中的find查找文件或者目录、locate快速定位文件路径
    自己写个网盘系列:② 看我用不到700行代码,完成了个网盘后端编码
    uniapp实时获取当前位置
    【机器学习300问】33、决策树是如何进行特征选择的?
    LTE、NR载波聚合(CA)-- 等级划分
    【10】Spring源码-分析篇-AOP源码分析
    【活体检测】“深度学习驱动的人脸反欺诈检测系统:性能提升与多模型支持“
  • 原文地址:https://blog.csdn.net/muzi_longren/article/details/126654597