乐趣区

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

无需编程,基于 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 即可,代码同步更新。

退出移动版