无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

回顾

通过之前一篇文章的介绍,采用抽象工厂设计模式,已经支持了大象数据库PostgreSQL。之前通过字符串拼接生成DDL SQL语句,比较繁琐。本文开始,引入了FreeMarker模版引擎,通过配置模版实现创建和修改物理表结构SQL语句,简化了大量代码,提高了效率,并且通过配置oracle数据库SQL模版,基于oracle数据库,零代码实现crud增删改查。

FreeMarker简介

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算,之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据。

UI界面

通过产品对象为例,无需编程,基于Oracle数据库,通过配置零代码实现CRUD增删改查RESTful API接口和管理UI。

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
创建产品

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
编辑产品数据

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
产品数据列表

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
通过Oracle SQL Developer查询Oracle数据

定义元数据对象模型

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
元数据表ca_meta_table,用于记录表的基本信息。

TableEntity对象

TableEntity为”元数据表”对象,和ca_meta_table字段对应

public class TableEntity {
    private Long id;

    private String name;

    private String caption;

    private String description;

    private Timestamp createdDate;

    private Timestamp lastModifiedDate;

    private String pluralName;

    private String tableName;

    private EngineEnum engine;

    private Boolean createPhysicalTable;

    private Boolean reverse;

    private Boolean systemable;

    private Boolean readOnly;

    private List columnEntityList;

    private List indexEntityList;
}

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
元数据列ca_meta_column,用于记录表字段信息,比如类型,长度,默认值等。

ColumnEntity对象

ColumnEntity为”元数据列”对象,和ca_meta_column字段对应

public class ColumnEntity {
  private Long id;

  private String name;

  private String caption;

  private String description;

  private Timestamp createdDate;

  private Timestamp lastModifiedDate;

  private Integer displayOrder;

  private DataTypeEnum dataType;

  private IndexTypeEnum indexType;

  private IndexStorageEnum indexStorage;

  private String indexName;

  private Integer length;

  private Integer precision;

  private Integer scale;

  private String defaultValue;

  private Long seqId;

  private Boolean unsigned;

  private Boolean autoIncrement;

  private Boolean nullable;

  private Boolean insertable;

  private Boolean updatable;

  private Boolean queryable;

  private Boolean displayable;

  private Boolean systemable;

  private Long tableId;
}

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
元数据索引ca_meta_index,用于记录表联合索引信息,比如索引类型,名称等。

IndexEntity对象

IndexEntity为”元数据索引”对象,和ca_meta_index字段对应

public class IndexEntity {
  private Long id;

  private String name;

  private String caption;

  private String description;

  private Timestamp createdDate;

  private Timestamp lastModifiedDate;

  private IndexTypeEnum indexType;

  private IndexStorageEnum indexStorage;

  private Long tableId;

  private List indexLineEntityList;
}

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
元数据索引行ca_meta_index_line,用于记录表联合索引行信息,一个联合索引可以对应多个联合索引行,表示由多个字段组成。

IndexLineEntity对象

IndexLineEntity”元数据索行”对象,和ca_meta_index_line字段对应

public class IndexLineEntity {
  private Long id;

  private Long columnId;

  private ColumnEntity columnEntity;

  private Long indexId;
}

定义FreeMarker模版

创建表create-table.sql.ftl

CREATE TABLE "${tableName}" (

    "${columnEntity.name}" NUMBER(1) DEFAULT 10 NOT NULL,

    "${columnEntity.name}" INT DEFAULT ${columnEntity.defaultValue} NOT NULL PRIMARY KEY,

    "${columnEntity.name}" INT DEFAULT ${columnEntity.defaultValue} NOT NULL PRIMARY KEY,

    "${columnEntity.name}" FLOAT DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" REAL DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" DECIMAL DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" DATE DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" CHAR(8) DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" DATE DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" TIMESTAMP DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" CHAR(${columnEntity.length}) DEFAULT '${columnEntity.defaultValue}' NOT NULL PRIMARY KEY,

    "${columnEntity.name}" VARCHAR(${columnEntity.length}) DEFAULT '${columnEntity.defaultValue}' NOT NULL PRIMARY KEY,

    "${columnEntity.name}" VARCHAR(200) DEFAULT '${columnEntity.defaultValue}' NOT NULL,

    "${columnEntity.name}" VARCHAR(4000) DEFAULT '${columnEntity.defaultValue}' NOT NULL,

    "${columnEntity.name}" VARCHAR(4000) DEFAULT '${columnEntity.defaultValue}' NOT NULL,

    "${columnEntity.name}" LONG DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" BLOB DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" BLOB DEFAULT ${columnEntity.defaultValue} NOT NULL,

    "${columnEntity.name}" VARCHAR(200) DEFAULT ${columnEntity.defaultValue} NOT NULL PRIMARY KEY,

);

    ALTER TABLE "${tableName}" ADD CONSTRAINT "${columnEntity.indexName}" UNIQUE("${columnEntity.name}");

    CREATE INDEX "${columnEntity.indexName}" ON "${tableName}" ("${columnEntity.name}");

      ALTER TABLE "${tableName}" ADD CONSTRAINT "${indexEntity.name}" UNIQUE("${indexLineEntity.columnEntity.name}",);

      CREATE INDEX "${indexEntity.name}" ON "${tableName}" ("${indexLineEntity.columnEntity.name}",);

COMMENT ON TABLE "${tableName}" IS '${caption}';

  COMMENT ON COLUMN "${tableName}"."${columnEntity.name}" IS '${columnEntity.caption}';

模版解析SQL

首先保存元数据信息,下一步传递模版名称和元数据model,动态解析成创建表SQL语句,然后创建物理表,这样元数据和物理表就关联上了。运行时通过解析元数据动态生成insert,select,update,delete等SQL语句,零代码实现业务数据crud功能。

public String processTemplateToString(String database, String templateName, Object dataModel) {
    String str = null;
    StringWriter stringWriter = new StringWriter();
    try {
        Configuration config = new Configuration(Configuration.VERSION_2_3_31);
        config.setNumberFormat("#");
        String templateValue = getTemplate(database, templateName);
        if (templateValue == null) {
          return str;
        }

        Template template = new Template(templateName, templateValue, config);
        template.process(dataModel, stringWriter);

        str = stringWriter.getBuffer().toString().trim();
        log.info(str);
    } catch (Exception e) {
        e.printStackTrace();
        throw new BusinessException(ApiErrorCode.DEFAULT_ERROR, e.getMessage());
    }

    return str;
}

public List toCreateTableSql(TableEntity tableEntity) {
  String createTableSql = processTemplateToString("create-table.sql.ftl", tableEntity);

  if (createTableSql == null) {
    throw new BusinessException(ApiErrorCode.DEFAULT_ERROR, "create-table.sql is empty!");
  }

  List sqls = new ArrayList();
  String[] subSqls = createTableSql.split(";");
  for (String t : subSqls) {
    String subSql = t.trim();
    if (!subSql.isEmpty()) {
      sqls.add(t);
    }
  }

  return sqls;
}

public Long create(TableDTO tableDTO) {
  TableEntity tableEntity = tableMapper.toEntity(tableDTO);
  //TODO
  Long tableId = crudService.create(TABLE_TABLE_NAME, tableEntity);
  List sqlList = crudService.toCreateTableSql(tableEntity);
  for (String sql: sqlList) {
    execute(sql);
  }
  //TODO
  return tableId;
}

修改表

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
包括表结构和索引的修改,删除等,和创建表原理类似。

application.properties

需要根据需要配置数据库连接驱动,无需重新发布,就可以切换不同的数据库。

#oracle
spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
spring.datasource.username=crudapi
spring.datasource.password=crudapi
spring.datasource.initialization-mode=always
spring.datasource.schema=classpath:schema.sql

小结

本文主要介绍了crudapi支持oracle数据库实现原理,并且以产品对象为例,零代码实现了CRUD增删改查RESTful API,后续介绍更多的数据库,比如MSSQL Server,Mongodb等。

实现方式 代码量 时间 稳定性 传统开发 1000行左右 2天/人 5个bug左右 crudapi系统 0行 1分钟 基本为0

综上所述,利用crudapi系统可以极大地提高工作效率和节约成本,让数据处理变得更简单!

crudapi简介

crudapi是crud+api组合,表示增删改查接口,是一款零代码可配置的产品。使用crudapi可以告别枯燥无味的增删改查代码,让您更加专注业务,节约大量成本,从而提高工作效率。
crudapi的目标是让处理数据变得更简单,所有人都可以免费使用!
无需编程,通过配置自动生成crud增删改查RESTful API,提供后台UI管理业务数据。基于主流的开源框架,拥有自主知识产权,支持二次开发。

demo演示

crudapi属于产品级的零代码平台,不同于自动代码生成器,不需要生成Controller、Service、Repository、Entity等业务代码,程序运行起来就可以使用,真正0代码,可以覆盖基本的和业务无关的CRUD RESTful API。

官网地址:https://crudapi.cn
测试地址:https://demo.crudapi.cn/crudapi/login

附源码地址

GitHub地址

https://github.com/crudapi/crudapi-admin-web

Gitee地址

https://gitee.com/crudapi/crudapi-admin-web

由于网络原因,GitHub可能速度慢,改成访问Gitee即可,代码同步更新。

Original: https://www.cnblogs.com/crudapi/p/16118275.html
Author: crudapi
Title: 无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574281/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球