首页 > 数据库 >java代码实现自动生成数据库表er图

java代码实现自动生成数据库表er图

时间:2024-02-04 15:02:45浏览次数:34  
标签:java String tableName 数据库 List 表名 new er

最近有同事看到字节跳动产品设计文档里有数据库表er图。就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有。因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具就算生成了也没有描述关系的连接线。那么为了满足需求,这边就略微出手写了个代码实现er关系的工具。(注意:这里只有后端部分,如需更直观使用请配合前端进行页面渲染)

一:首先获取数据库的所有表名和表的字段sql代码如下:

    <!--  获取所有表名  -->
    <select id="showTables" resultType="java.lang.String">
        SHOW TABLES;
    </select>

    <!--根据表名获取该表下的所有字段-->
    <select id="showColumns" resultType="com.alibaba.fastjson.JSONObject">
        SHOW COLUMNS  FROM ${tableName};
    </select>

二:mapper接口层代码如下:

    /**
     * 获取所有表名
     * @return  该数据库下的所有表名
     */
    List<String> showTables();

    /**
     * 根据表名获取该表下的所有字段
     * @param tableName 要获取字段的表名
     * @return          该表下的所有字段
     */
    List<JSONObject> showColumns(@Param("tableName") String tableName);

三:业务代码如下:(为了方便看这里省略业务层直接在controller实现)

   @Autowired
    private ERMapper erMapper;
    @GetMapping("/getEr")
    @ApiOperation(value = "获取er关系")
    public Map getEr(){
        List<String> list = erMapper.showTables();
        Map<String, List<String>> map = new HashMap<>();
        Map<String, String> tableMap = new HashMap<>();
        List<String> ts = new ArrayList<>();
        for (String s : list) {
            String table = s.replace("erp_", "");
            ts.add(table);
            tableMap.put(table, s);
        }
        for (String s : list) {
            List<JSONObject> jsonList = erMapper.showColumns(s);
            String erp_ = s.replace("erp_", "");
            ArrayList<String> tList = new ArrayList<>();
            for (JSONObject jsonObject : jsonList) {
                String field = jsonObject.getString("Field");
                if (field.endsWith("_id")){
                    String replaceId = field.replace("_id", "");
                    if (ts.contains(replaceId)){
                        tList.add(tableMap.get(replaceId));
                    }
                }
            }
            map.put(s, tList);
            log.info("s:{}", erp_);
        }

        return map;
    }

标签:java,String,tableName,数据库,List,表名,new,er
From: https://www.cnblogs.com/mingyi-wang/p/18006173

相关文章

  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(七)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第十六章:使用RNN和注意力进行自然语言处理当艾伦·图灵在1950年想象他著名的Turing测试时,他提出了一种评估机器匹配人类智能能力的方法。他本可以测试许多事情,比如......
  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(二)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第三章:分类在第一章中,我提到最常见的监督学习任务是回归(预测值)和分类(预测类)。在第二章中,我们探讨了一个回归任务,使用各种算法(如线性回归、决策树和随机森林)来预测房屋价......
  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(五)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第十二章:使用TensorFlow进行自定义模型和训练到目前为止,我们只使用了TensorFlow的高级API,Keras,但它已经让我们走得很远:我们构建了各种神经网络架构,包括回归和分类......
  • Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(六)
    原文:Hands-OnMachineLearningwithScikit-Learn,Keras,andTensorFlow译者:飞龙协议:CCBY-NC-SA4.0第十四章:使用卷积神经网络进行深度计算机视觉尽管IBM的DeepBlue超级计算机在1996年击败了国际象棋世界冠军加里·卡斯帕罗夫,但直到最近计算机才能可靠地执行看似......
  • Docker启动的容器设置开机自启动
    参考:https://www.cnblogs.com/hengdin/articles/17838930.htmldocker容器如果需要在开机实现自启动可以在启动的时候加以下参数--restart=always例如启动一个MySQL容器需要开机自启则使用以下命令启动容器#dockerrun-d--namemysql-p3306:3306--restart=alwaysalwa......
  • Android Handler使用方法
    目录: 1.前言本篇文章介绍AndroidHandler的基本使用方法,且Demo会以Java&Kotlin两种代码形式进行展示。在Android实际开发中,我们经常会遇到耗时任务,比如:网络请求API接口来获取数据、数据库CRUD操作等等,我们需要额外创建开启工作线程来处理这些耗时任务。由于A......
  • hsv颜色提取小工具jcpicker介绍
    jcpicker.exe是一款绿色免安装颜色拾取器软件,约为2M大小,可以用于提取RGB颜色、HSV、HSL颜色值。双击jcpicker.exe打开软件后,如下图所示:                                            ......
  • git如何将分支名由main改为master
    要将分支名从"main"改为"master",请按照以下步骤操作:首先,确保你已经在要重命名的分支上。通常,这是"main"分支。要检查当前分支,请运行以下命令:gitbranch这将显示所有本地分支,当前分支前会有一个星号(*)。如果你需要切换到"main"分支,请运行以下命令:gitcheckoutm......
  • Oracle向数据库插入日期格式数据
    插入系统日期insertintostudent(sno,sname,birthdate)values(007,'omit',sysdate);插入Oracle数据库指定格式的日期insertintostudent(sno,sname,birthdate)values(008,'Ding','18/11月/2022');使用todate()插入其他格式的日期(最常用)insertintostudent(sno,sname,......
  • Java AQS
    AQS介绍AQS的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。AQS就是一个抽象类,主要用来构建锁和同步器。publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizer......