回顾
在前面文章中,已经介绍了crudapi主要功能和使用方式,crudapi1.2.0只支持MySQL数据库,为了支持更多数据库,对代码进行了重构,采用抽象工厂设计模式,可以无缝切换不同类型的数据库,从crudapi1.3.0版本开始,添加了对大象数据库PostgreSQL的支持。
#抽象工厂模式
抽象工厂模式(AbstractFactoryPattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
#UI界面
通过学生对象为例,无需编程,基于PostgreSQL数据库,通过配置零代码实现CRUD增删改查RESTfulAPI接口和管理UI。
创建学生表
编辑学生数据
学生数据列表
通过pgadmin查询postsql数据
#实现原理
#基类
CrudAbstractRepository为抽象类,主要功能为数据库表的crud增删改查操作。
publicabstractclassCrudAbstractRepository{publicLongcreate(StringtableName,MapString,Objectmap){log.info("CrudAbstractRepository-create");}}
CrudAbstractFactory为工厂类,用于创建CrudAbstractRepository。
publicabstractclassCrudAbstractFactory{publicabstractCrudAbstractRepositorygetCrudRepository();publicLongcreate(StringtableName,MapString,Objectmap){log.info("CrudAbstractFactory-create");CrudAbstractRepositoryrepository=this.getCrudRepository();returnrepository.create(tableName,map);}}
#MySql子类
CrudAbstractRepository实现了通用数据库处理功能,MySql中如果有不同的处理方法,可以通过Override复写对应的方法,最终子类覆盖父类方法,比如MySqlCrudRepository重新实现了create添加数据功能。
ComponentpublicclassMySqlCrudRepositoryextendsCrudAbstractRepository{
OverridepublicLongcreate(StringtableName,MapString,Objectmap){log.info("MySqlCrudRepository-create");returnsuper.create(tableName,map);}}publicclassMySqlCrudFactoryextendsCrudAbstractFactory{
AutowiredprivateMySqlCrudRepositorymySqlCrudRepository;OverridepublicCrudAbstractRepositorygetCrudRepository(){returnmySqlCrudRepository;}}#PostSql子类
和MySql类似,PostSqlCrudRepository中如果有需要重写的部分,直接覆盖同名方法即可。
ComponentpublicclassPostSqlCrudRepositoryextendsCrudAbstractRepository{
OverridepublicLongcreate(StringtableName,MapString,Objectmap){log.info("PostSqlCrudRepository-create");returnsuper.create(tableName,obj);}}publicclassPostSqlCrudFactoryextendsCrudAbstractFactory{
AutowiredprivatePostSqlCrudRepositorypostSqlCrudRepository;OverridepublicCrudAbstractRepositorygetCrudRepository(){returnpostSqlCrudRepository;}}#CrudTemplate
通过CrudDatasourceProperties读取spring.datasource.driverClassName
ConfigurationProperties(prefix="spring.datasource")
ComponentpublicclassCrudDatasourceProperties{privateStringdriverClassName;publicStringgetDriverClassName(){returndriverClassName;}publicvoidsetDriverClassName(StringdriverClassName){this.driverClassName=driverClassName;}}根据spring.datasource.driverClassName的值,通过反射动态创建MySqlCrudFactory或者PostSqlCrudFactory工厂对象,
ConfigurationpublicclassCrudTemplateConfig{publicstaticfinalStringMYSQL_DRIVER_NAME="