数据字典实现


前言

首先在写数据字典之前大家有必要了解一下数据字典是什么东西?

据字典是一种通用的程序设计方法。可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员、商品(超子)、网页、接口、数据库表、甚至需求分析等等。当主体有很多的属性,每种属性有很多的取值,而且属性的数量和属性取值的数量是不断变化的,特别是当这些数量的变化很快时,就应该考虑引入数据字典的设计方法。

数据字典拥有两种形式

一、把主体的属性代码化放入独立的表中,不是和主体放在一起,主体中只保留属性的代码。这里属性的数量是不变的,而属性取值的数量可以是变化的。

二、用一个表来放结构相同的所有属性信息,不同属性的不同取值统一编码,用“类型”来区别不同的属性,主体中保留属性代码的列表。这样主体所拥有的属性数量就是可变的了。

第二种数据字典比第一种更抽象,层级更高,也更具一般性、通用性。

为了方便大家更好的学习,我为大家准备了一份数据字典的sql数据库语句大家使用即可。

因为在这里无法直接上传sql文件大家在我的百度网盘下载,地址:

链接:https://pan.baidu.com/s/1lOkDIKhHZ91vStVFQ1iKkw 
提取码:yyds

一、创建springboot工程,pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>
    <groupId>com.hnzhzw</groupId>
    <artifactId>dict</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

二、实体类,mapper层,service层,controller层

1.实体类

代码如下(示例):

package com.hnzhzw.dict.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.List;
@Data
@TableName("dict")
public class Dict {

    @ApiModelProperty(value = "id")
    private Long id;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("create_time")
    private Date createTime;

    @TableField("update_time")
    private Date updateTime;

    @TableLogic
    @TableField("is_deleted")
    private Integer isDeleted;

    @TableField("parent_id")
    private Long parentId;

    @TableField("name")
    private String name;

    @TableField("value")
    private String value;

    @TableField("dict_code")
    private String dictCode;
 
    @TableField(exist = false)
    private boolean hasChildren;

    @TableField(exist = false)
    private List<Dict> dictList;
}

2.mapper层

代码如下(示例):

package com.hnzhzw.dict.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hnzhzw.dict.pojo.Dict;
import org.springframework.stereotype.Repository;

@Repository
public interface DictMapper extends BaseMapper<Dict> {
}

继承mybatisplus即可

3.service层

代码如下(示例):

package com.hnzhzw.dict.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hnzhzw.dict.pojo.Dict;

import java.util.List;

public interface DictService extends IService<Dict> {

    //根据id查询子数据列表
    List<Dict> findChildData(Long id);
}

4.service实现层简称(serviceImpl)

package com.hnzhzw.dict.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hnzhzw.dict.mapper.DictMapper;
import com.hnzhzw.dict.pojo.Dict;
import com.hnzhzw.dict.service.DictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, Dict> implements DictService {
    @Autowired
    private DictMapper dictMapper;

    //递归查询出数据字典父id下所有的子集
    @Override
    public List<Dict> findChildData(Long id) {
        List<Dict> dicts  = new ArrayList<>();

        QueryWrapper<Dict> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id",id);
        List<Dict> dictList = baseMapper.selectList(wrapper);

        for (Dict dict :
                dictList) {
            Long dictId = dict.getId();
            boolean isChild = this.isChildren(dictId);
            dict.setHasChildren(isChild);

            List<Dict> childData = findChildData(dictId);
            dict.setDictList(childData);
            dicts.add(dict);

        }
        return dicts;
    }


    //判断id下面是否有子节点
    private boolean isChildren(Long id) {
        QueryWrapper<Dict> wrapper = new QueryWrapper<>();
        wrapper.eq("parent_id",id);
        Integer count = baseMapper.selectCount(wrapper);
        // 0>0    1>0
        return count>0;
    }
}

5.controller层

package com.hnzhzw.dict.controller;

import com.hnzhzw.dict.common.CommonReturnType;
import com.hnzhzw.dict.pojo.Dict;
import com.hnzhzw.dict.service.DictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/dict/")
public class DictController {
    @Autowired
    private DictService dictService;


    /**
     * 根据数据id查询子数据列表
     * @param id
     * @return
     */
    @GetMapping("findChildData/{id}")
    public CommonReturnType findChildData(@PathVariable Long id
    ){
        List<Dict> list = dictService.findChildData(id);
        return CommonReturnType.create(list);
    }
}

在浏览器或postman测试都可行,测试地址:localhost:8080/dict/findChildData/0

下一期将教各位博友如何提高数据字典的性能,非常简单哦,创作不易希望大家觉得有用就给我点一个小赞吧!谢谢


实现效果:

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值