若依代码生成器------数据库篇

简介: 若依代码生成器------数据库篇

继上一篇《若依代码自动生成器研究-表查询篇》,我们继续来学习若依系统中的代码生成逻辑。


导入表之Sql查询


在菜单栏点击“代码生成”,在右侧栏中点击“导入”按钮,在文章若依中的代码自动生成器研究-表查询篇中,我们已经一直到若依是通过查询数据库的information_schema.tables从而查询到数据库的所有表。


我们下一步的操作是,“勾选my_user表,点击确定”。操作路径示意图以及通过F12调试,查看接口请求,如下图所示。


所请求的接口是/tool/gen/importTable,我们通过idea检索后台接口,发现其位于ruoyi-generator/com.ruoyi.generator/controller/GenController下,如下图:


Controller中的代码源码如下:(我们通过调试,补充上各个值的获取数据)

/**
     * 导入表结构(保存)
     */
    @PreAuthorize("@ss.hasPermi('tool:gen:import')")
    @Log(title = "代码生成", businessType = BusinessType.IMPORT)
    @PostMapping("/importTable")
    public AjaxResult importTableSave(String tables)
    {
        // 通过调试,字符串tables格式为:"my_user,table_name_1,table_name_2...."
        String[] tableNames = Convert.toStrArray(tables);
        // tableNames: ["my_user", "table_name_1", "table_name_2"]
        // 查询表信息
        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
        // 见下图
        genTableService.importGenTable(tableList);
        return AjaxResult.success();
    }


我们来研究一下其中查询表的那句sql,通过在xml中搜索,其执行sql为:

SELECT
  table_name,
  table_comment,
  create_time,
  update_time
FROM
  information_schema. TABLES
WHERE
  table_name NOT LIKE 'qrtz_%'
AND table_name NOT LIKE 'gen_%'
AND table_schema = (SELECT DATABASE())
AND table_name IN ('my_user')


通过这个查询将my_user表的基本信息查询出来。


那么genTableService.importGenTable(tableList);这一句又执行了哪些操作呢?我们继续来看。


导入表之导入


同过定位importGenTable,我们查询到他的执行方法,我们补充上调试过程中的参数值

/**
     * 导入表结构
     * 
     * @param tableList 导入表列表
     */
    @Override
    @Transactional
    public void importGenTable(List<GenTable> tableList)
    {
        // tableList: [{my_user表的信息}]
        // admin
        String operName = SecurityUtils.getUsername();
        try
        {
            for (GenTable table : tableList)
            {
                String tableName = table.getTableName(); // tableName: my_user
                GenUtils.initTable(table, operName);
                int row = genTableMapper.insertGenTable(table);
                if (row > 0)
                {
                    // 保存列信息
                    List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
                    for (GenTableColumn column : genTableColumns)
                    {
                        GenUtils.initColumnField(column, table);
                        genTableColumnMapper.insertGenTableColumn(column);
                    }
                }
            }
        }
        catch (Exception e)
        {
            throw new ServiceException("导入失败:" + e.getMessage());
        }
    }


其中有一个关键的数据结构:GenTable,它位于Domain中,对应数据库中的表gen_table,字段截图如下所示:


类似的,另外一个表gen_table_column以及其对应的domain域类为GenTableColumn,保存生成数据库表的列信息,其字段结构如下截图:该表通过字段table_id与表gen_table中的某一行关联上。


那么查询数据库表的列用的什么sql呢?


通过检查,在xml中检索到sql为:

SELECT
  column_name,
  (
    CASE
    WHEN (
      is_nullable = 'no' && column_key != 'PRI'
    ) THEN
      '1'
    ELSE
      NULL
    END
  ) AS is_required,
  (
    CASE
    WHEN column_key = 'PRI' THEN
      '1'
    ELSE
      '0'
    END
  ) AS is_pk,
  ordinal_position AS sort,
  column_comment,
  (
    CASE
    WHEN extra = 'auto_increment' THEN
      '1'
    ELSE
      '0'
    END
  ) AS is_increment,
  column_type
FROM
  information_schema. COLUMNS
WHERE
  table_schema = (SELECT DATABASE())
AND table_name = 'my_user'
  ORDER BY
    ordinal_position


是通过查询information_schema. COLUMNS并约束 table_name 以及数据库来查询指定表my_user的所有列。


总结


通过导入操作,将my_user转换为了gen_tablegen_table_column中的几行数据,以便后续代码的生成。

目录
相关文章
|
2月前
|
数据可视化 API PHP
学生信息管理系统-可视化-科目管理CRUD代码生成器
学生信息管理系统-可视化-科目管理CRUD代码生成器
49 5
|
7月前
|
存储 Java 关系型数据库
数据库设计规约以及MP代码生成器
数据库设计规约以及MP代码生成器
|
SQL 设计模式 Oracle
无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口 的介绍,采用抽象工厂设计模式,已经支持了大象数据库PostgreSQL。之前通过字符串拼接生成DDL SQL语句,比较繁琐。本文开始,引入了FreeMarker模版引擎,通过配置模版实现创建和修改物理表结构SQL语句,简化了大量代码,提高了效率,并且通过配置oracle数据库SQL模版,基于oracle数据库,零代码实现crud增删改查。
257 0
无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
|
XML 运维 关系型数据库
使用MyBatis-Plus代码生成器(数据库MySQL/Sqlite)
使用MyBatis-Plus代码生成器(数据库MySQL/Sqlite)
使用MyBatis-Plus代码生成器(数据库MySQL/Sqlite)
|
SQL 存储 Oracle
无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口
通过之前一篇文章 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口 的介绍,引入了FreeMarker模版引擎,通过配置模版实现创建和修改物理表结构SQL语句,并且通过配置oracle数据库SQL模版,基于oracle数据库,零代码实现crud增删改查。本文采用同样的方式,很容易就可以支持微软SQL Server数据库。
214 0
无需编程,基于微软mssql数据库零代码生成CRUD增删改查RESTful API接口
|
SQL 算法 关系型数据库
|
数据可视化 关系型数据库 MySQL
Laravel-Gii 可视化代码生成工具 CRUD +GUI
Laravel-Gii 可视化代码生成工具 CRUD +GUI GIT:https://github.com/sunshinev/laravel-gii 适用于快速B端后台开发 根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件,通过简单点击鼠标即可自动创建完整的CRUD后台。
1405 0