无需编程,基于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增加数据性能。
@Componentpublic 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中如果有须要重写的局部,间接笼罩同名办法即可。
@Componentpublic 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")@Componentpublic class CrudDatasourceProperties { private String driverClassName; public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; }}
依据spring.datasource.driverClassName的值,通过反射动态创建MySqlCrudFactory或者PostSqlCrudFactory工厂对象,
@Configurationpublic 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
须要依据须要配置数据库连贯驱动,无需从新公布,就能够切换不同的数据库。
#mysqlspring.datasource.driverClassName=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/crudapispring.datasource.username=spring.datasource.password=#postgresqlspring.datasource.driverClassName=org.postgresql.Driverspring.datasource.url=jdbc:postgresql://localhost:5432/crudapispring.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即可,代码同步更新。