mybatis mapper.xml 文件外键映射

1.业务背景

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

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

 2.代码实现 

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

package com.f2bpm.system.models;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.f2bpm.orm.mapper.BaseModel;
import lombok.Data;
import lombok.NonNull;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * @author 作 者:ljl
 * @title 标   题: 标签
 * @date 创建日期:2023-09-06
 * @copyright 版 权:null
 * @description 描 述:null
 */
@Data
@TableName("tb_tag")
@Accessors(chain = true)
public class Tag /*extends BaseModel */{

    /**
     * 标签ID,自增主键
     */
    @NotBlank
    @TableId(type = IdType.ASSIGN_UUID)
    private String tagId;

    /**
     * 标签名称
     */
    private String tagName;

    /**
     * 标签状态,0表示正常,1表示禁用
     */
    @Null(message = "输入类型错误")
    private Integer tagStatus;

    /**
     * 标签类型,0表示标签,1表示分组
     */
    @Null(message = "输入类型错误")
    private Integer tagType;


    /**
     * 创建人
     */
    private String createdBy;

    /**
     * 修改人
     */
    private String updatedBy;

    /**
     * 备注
     */
    private String remark;

    /**
     * 分组
     */
    private String groupId;

    /**
     * 是否支持多选 0 支持 1 不支持
     */
    private Integer multiple;

    /**
     * 创建时间
     */
    private Date createdTime;

    /**
     * 修改时间
     */
    private Date updatedTime;


    /**
     * 子节点
     */
    @TableField(exist = false)
    private List childs;

}

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



    
        
        
        
        
        
        
        
        
        
        
        
        

        
            
            
            
            
            
            
            
        
    


    
        SELECT t1.tag_id       as tag_id,
               t1.tag_name     as tag_name,
               t1.tag_status   as tag_status,
               t1.tag_type     as tag_type,
               t1.created_by   as created_by,
               t1.created_time as created_time,
               t1.multiple     as multiple,
               t1.group_id     as group_id,
               t2.tag_id       AS childTagId,
               t2.tag_name     AS childTagName,
               t2.tag_status   AS childTagStatus,
               t2.tag_type     AS childTagType,
               t2.created_by   AS childCreatedBy,
               t2.created_time AS childCreatedTime,
               t2.multiple     AS childIsMultiple
        FROM tb_tag t1
                 LEFT JOIN tb_tag t2 ON t1.tag_id = t2.group_id
    

    

        总结

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

你可能感兴趣的:(mybatis,xml)