• mybatis mapper.xml 文件外键映射


    1.业务背景

            最近负责标签管理业务,因为设计打标签功能就需要用到中间表。在之前的写法,将符合的数据先查询出来在应用层做匹配封装。如果是大表关联性复杂考虑到之后的扩展性,这种写法符合要求的,唯一缺点就是让你代码看的很臃肿,常规做法就是循环匹配,但是代码看起很烦。更好的方法就是将查 出的数据转map,这样时间复杂度会快很多基本上是只需要便利一次。

            但是考虑我负责业务背景,他的层级是固定的是两层,虽然我表设计可以无限层,但业务就只需要用到两层。如果是层级不定的还是需要使用上面的方式。

     2.代码实现 

            这是实体类,childs 属性不是数据库字段,用来存放子节点的,

    1. package com.f2bpm.system.models;
    2. import com.baomidou.mybatisplus.annotation.IdType;
    3. import com.baomidou.mybatisplus.annotation.TableField;
    4. import com.baomidou.mybatisplus.annotation.TableId;
    5. import com.baomidou.mybatisplus.annotation.TableName;
    6. import com.f2bpm.orm.mapper.BaseModel;
    7. import lombok.Data;
    8. import lombok.NonNull;
    9. import lombok.experimental.Accessors;
    10. import javax.validation.constraints.NotBlank;
    11. import javax.validation.constraints.NotNull;
    12. import javax.validation.constraints.Null;
    13. import javax.validation.constraints.Size;
    14. import java.time.LocalDateTime;
    15. import java.util.Date;
    16. import java.util.List;
    17. /**
    18. * @author 作 者:ljl
    19. * @title 标 题: 标签
    20. * @date 创建日期:2023-09-06
    21. * @copyright 版 权:null
    22. * @description 描 述:null
    23. */
    24. @Data
    25. @TableName("tb_tag")
    26. @Accessors(chain = true)
    27. public class Tag /*extends BaseModel */{
    28. /**
    29. * 标签ID,自增主键
    30. */
    31. @NotBlank
    32. @TableId(type = IdType.ASSIGN_UUID)
    33. private String tagId;
    34. /**
    35. * 标签名称
    36. */
    37. private String tagName;
    38. /**
    39. * 标签状态,0表示正常,1表示禁用
    40. */
    41. @Null(message = "输入类型错误")
    42. private Integer tagStatus;
    43. /**
    44. * 标签类型,0表示标签,1表示分组
    45. */
    46. @Null(message = "输入类型错误")
    47. private Integer tagType;
    48. /**
    49. * 创建人
    50. */
    51. private String createdBy;
    52. /**
    53. * 修改人
    54. */
    55. private String updatedBy;
    56. /**
    57. * 备注
    58. */
    59. private String remark;
    60. /**
    61. * 分组
    62. */
    63. private String groupId;
    64. /**
    65. * 是否支持多选 0 支持 1 不支持
    66. */
    67. private Integer multiple;
    68. /**
    69. * 创建时间
    70. */
    71. private Date createdTime;
    72. /**
    73. * 修改时间
    74. */
    75. private Date updatedTime;
    76. /**
    77. * 子节点
    78. */
    79. @TableField(exist = false)
    80. private List childs;
    81. }

             之前关联的其他表,所有只要将其他类的实体类和字段名对应上即可,但是我是自关联,他有是按照查询列的名字进行关系映射,所以下面采用的是给列起别名的方式。他会将查询的数据映射到我childs 属性里,这样我的sever 层 看起来就简单不少。

    1. "com.f2bpm.system.mapper.TagMapper">
    2. "TagResult" type="com.f2bpm.system.models.Tag">
    3. "tagId" column="tag_id"/>
    4. "tagName" column="tag_name"/>
    5. "tagStatus" column="tag_status"/>
    6. "tagType" column="tag_type"/>
    7. "createdBy" column="created_by"/>
    8. "updatedBy" column="updated_by"/>
    9. "remark" column="remark"/>
    10. "createdTime" column="created_time"/>
    11. "updatedTime" column="updated_time"/>
    12. "groupId" column="group_id"/>
    13. "multiple" column="multiple"/>
    14. "childs" ofType="com.f2bpm.system.models.Tag">
    15. "tagId" column="childTagId"/>
    16. "tagName" column="childTagName"/>
    17. "tagStatus" column="childTagStatus"/>
    18. "tagType" column="childTagType"/>
    19. "createdBy" column="childCreatedBy"/>
    20. "createdTime" column="childCreatedTime"/>
    21. "selectTagVo">
    22. SELECT t1.tag_id as tag_id,
    23. t1.tag_name as tag_name,
    24. t1.tag_status as tag_status,
    25. t1.tag_type as tag_type,
    26. t1.created_by as created_by,
    27. t1.created_time as created_time,
    28. t1.multiple as multiple,
    29. t1.group_id as group_id,
    30. t2.tag_id AS childTagId,
    31. t2.tag_name AS childTagName,
    32. t2.tag_status AS childTagStatus,
    33. t2.tag_type AS childTagType,
    34. t2.created_by AS childCreatedBy,
    35. t2.created_time AS childCreatedTime,
    36. t2.multiple AS childIsMultiple
    37. FROM tb_tag t1
    38. LEFT JOIN tb_tag t2 ON t1.tag_id = t2.group_id

            总结

            数据库 关联还是需要确定表的量级, 不然结果集过大必然导致查询数据变慢

  • 相关阅读:
    FP独立站该怎么运营?斗篷黑科技教您找对方法引流获客
    「程序员转型技术管理」必修的 10 个能力提升方向
    【C++ 程序设计】实战:C++ 实践练习题(21~30)
    Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上
    webpack和vite的区别?
    Docker的使用
    Go 并发可视化解释 - Semaphore
    浅析Spring事务实现原理
    北京君正客户应用案例:掌静脉3D人脸猫眼视屏智能锁
    【深度学习】卷积层填充和步幅以及其大小关系
  • 原文地址:https://blog.csdn.net/2201_75630288/article/details/132777045