关于javascript:无需编程基于PostgreSQL零代码生成CRUD增删改查RESTful-API接口

37次阅读

共计 5278 个字符,预计需要花费 14 分钟才能阅读完成。

无需编程,基于 PostgreSQL 零代码生成 CRUD 增删改查 RESTful API 接口

回顾

在后面文章中,曾经介绍了 crudapi 次要性能和应用形式,crudapi 1.2.0 只反对 MySQL 数据库,为了反对更多数据库,对代码进行了重构,采纳形象工厂设计模式,能够无缝切换不同类型的数据库,从 crudapi 1.3.0 版本开始,增加了对大象数据库 PostgreSQL 的反对。

形象工厂模式

形象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创立其余工厂。该超级工厂又称为其余工厂的工厂。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。在形象工厂模式中,接口是负责创立一个相干对象的工厂,不须要显式指定它们的类。每个生成的工厂都能依照工厂模式提供对象。

UI 界面

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


创立学生表


编辑学生数据


学生数据列表


通过 pgadmin 查问 postsql 数据

实现原理

基类

CrudAbstractRepository 为抽象类,次要性能为数据库表的 crud 增删改查操作。

public abstract class CrudAbstractRepository {public Long create(String tableName, Map<String, Object> map) {log.info("CrudAbstractRepository->create");
  }
}

CrudAbstractFactory 为工厂类,用于创立 CrudAbstractRepository。

public abstract class CrudAbstractFactory {public abstract CrudAbstractRepository getCrudRepository();

  public Long create(String tableName, Map<String, Object> map) {log.info("CrudAbstractFactory->create");
    CrudAbstractRepository repository = this.getCrudRepository();
    return repository.create(tableName, map);
  }
}

MySql 子类

CrudAbstractRepository 实现了通用数据库解决性能,MySql 中如果有不同的解决办法,能够通过 Override 复写对应的办法,最终子类笼罩父类办法,比方 MySqlCrudRepository 从新实现了 create 增加数据性能。

@Component
public class MySqlCrudRepository extends CrudAbstractRepository {
  @Override
  public Long create(String tableName, Map<String, Object> map) {log.info("MySqlCrudRepository->create");

    return super.create(tableName, map);
  }
}
public class MySqlCrudFactory extends CrudAbstractFactory {
  @Autowired
  private MySqlCrudRepository mySqlCrudRepository;
  
  @Override
  public CrudAbstractRepository getCrudRepository() {return mySqlCrudRepository;}
}

PostSql 子类

和 MySql 相似,PostSqlCrudRepository 中如果有须要重写的局部,间接笼罩同名办法即可。

@Component
public class PostSqlCrudRepository extends CrudAbstractRepository {
  @Override
  public Long create(String tableName, Map<String, Object> map) {log.info("PostSqlCrudRepository->create");
    return super.create(tableName, obj);
  }
}
public class PostSqlCrudFactory extends CrudAbstractFactory {
  @Autowired
  private PostSqlCrudRepository postSqlCrudRepository;
  
  @Override
  public CrudAbstractRepository getCrudRepository() {return postSqlCrudRepository;}
}

CrudTemplate

通过 CrudDatasourceProperties 读取 spring.datasource.driverClassName

@ConfigurationProperties(prefix = "spring.datasource")
@Component
public class CrudDatasourceProperties {
  private String driverClassName;

  public String getDriverClassName() {return driverClassName;}

  public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}
}

依据 spring.datasource.driverClassName 的值,通过反射动态创建 MySqlCrudFactory 或者 PostSqlCrudFactory 工厂对象,

@Configuration
public class CrudTemplateConfig {
  public static final String MYSQL_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
   
  Map<String, String> driverClassNameMap = new HashMap<String, String>() {
    private static final long serialVersionUID = 1L;
    {put("com.mysql.cj.jdbc.Driver", "cn.crudapi.core.repository.mysql.MySqlCrudFactory");
      put("org.postgresql.Driver", "cn.crudapi.core.repository.postsql.PostSqlCrudFactory");
    }
  };

  
  @Autowired
  private CrudDatasourceProperties crudDatasourceProperties;
  
  @Bean
  public CrudTemplate crudTemplate(CrudAbstractFactory factory) {CrudTemplate crudTemplate =  new CrudTemplate(factory);
    return crudTemplate;
  }
    
  @Bean
  public CrudAbstractFactory crudAbstractFactory() {
    CrudAbstractFactory crudAbstractFactory = null;
    String driverClassName = crudDatasourceProperties.getDriverClassName();
    log.info("CrudTemplateConfig->driverClassName:" + driverClassName);
    
    try {String factoryClassName = driverClassNameMap.get(driverClassName);
      if (factoryClassName == null) {factoryClassName = driverClassNameMap.get(MYSQL_DRIVER_NAME);
      }
      log.info("CrudTemplateConfig->factoryClassName:" + factoryClassName);
      
      Class<?> cls = Class.forName(factoryClassName);
      Object obj = cls.newInstance();
      
      crudAbstractFactory = (CrudAbstractFactory)obj;
    } catch (Exception e) {e.printStackTrace();
    }
    
    return crudAbstractFactory;
  }
}

相似 RestTemplate,CrudTemplate 最终实现了 crud 增删改查性能

public class CrudTemplate {
  @Nullable
  private volatile CrudAbstractFactory crudFactory;

  public CrudTemplate() {super();
    log.info("CrudTemplate->Constructor");
  }
  
  public CrudTemplate(CrudAbstractFactory crudFactory) {super();
    log.info("CrudTemplate->Constructor crudFactory");
    this.crudFactory = crudFactory;
  }
  
  public Long create(String tableName, Map<String, Object> map) {log.info("CrudTemplate->create");
    return crudFactory.create(tableName, map);
  }
}

application.properties

须要依据须要配置数据库连贯驱动,无需从新公布,就能够切换不同的数据库。

#mysql
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crudapi
spring.datasource.username=
spring.datasource.password=

#postgresql
spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/crudapi
spring.datasource.username=
spring.datasource.password=

小结

本文次要介绍了 crudapi 反对多数据库实现原理,并且以学生对象为例,零代码实现了 CRUD 增删改查 RESTful API,后续打算反对更多的数据库,比方 Oracle,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 即可,代码同步更新。

正文完
 0