無需編程,基于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即可,代碼同步更新,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431009.html
標籤:其他
上一篇:python之推導式
