1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        基于抽象工廠模式支持多數(shù)據(jù)源MySQL和PostgreSQL

        共 5544字,需瀏覽 12分鐘

         ·

        2022-04-01 20:44

        基于抽象工廠模式支持多數(shù)據(jù)源MySQL和PostgreSQL回顧

        在前面文章中,已經(jīng)介紹了crudapi主要功能和使用方式,crudapi 1.2.0只支持MySQL數(shù)據(jù)庫,為了支持更多數(shù)據(jù)庫,對代碼進行了重構,采用抽象工廠設計模式,可以無縫切換不同類型的數(shù)據(jù)庫,從crudapi 1.3.0版本開始,添加了對大象數(shù)據(jù)庫PostgreSQL的支持。

        抽象工廠模式

        抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。在抽象工廠模式中,接口是負責創(chuàng)建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

        UI界面

        通過學生對象為例,無需編程,基于PostgreSQL數(shù)據(jù)庫,通過配置零代碼實現(xiàn)CRUD增刪改查RESTful API接口和管理UI。

        955c5d9cbcfcc869e438c087c1da4569.webp


        創(chuàng)建學生表

        67b827f610692ea66aaa4922cdb0a04c.webp?

        編輯學生數(shù)據(jù)

        1049053398c1a1153cc6f4a23f7ccf23.webp?

        學生數(shù)據(jù)列表

        cb40d336be72ffed50358414c1e17fca.webp?通過pgadmin查詢postsql數(shù)據(jù)

        實現(xiàn)原理

        基類

        CrudAbstractRepository為抽象類,主要功能為數(shù)據(jù)庫表的crud增刪改查操作。

        public abstract class CrudAbstractRepository {  public Long create(String tableName, Map map) {    log.info("CrudAbstractRepository->create");  }}
        CrudAbstractFactory為工廠類,用于創(chuàng)建CrudAbstractRepository。public abstract class CrudAbstractFactory { public abstract CrudAbstractRepository getCrudRepository();
        public Long create(String tableName, Map map) { log.info("CrudAbstractFactory->create"); CrudAbstractRepository repository = this.getCrudRepository(); return repository.create(tableName, map); }}
        MySql子類

        CrudAbstractRepository實現(xiàn)了通用數(shù)據(jù)庫處理功能,MySql中如果有不同的處理方法,可以通過Override復寫對應的方法,最終子類覆蓋父類方法,比如MySqlCrudRepository重新實現(xiàn)了create添加數(shù)據(jù)功能。

        @Componentpublic class MySqlCrudRepository extends CrudAbstractRepository {  @Override  public Long create(String tableName, Map 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 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; }}

        根據(jù)spring.datasource.driverClassName的值,通過反射動態(tài)創(chuàng)建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最終實現(xiàn)了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 map) { log.info("CrudTemplate->create"); return crudFactory.create(tableName, map); }}

        application.properties

        需要根據(jù)需要配置數(shù)據(jù)庫連接驅動,無需重新發(fā)布,就可以切換不同的數(shù)據(jù)庫。

        #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支持多數(shù)據(jù)庫實現(xiàn)原理,并且以學生對象為例,零代碼實現(xiàn)了CRUD增刪改查RESTful API,后續(xù)計劃支持更多的數(shù)據(jù)庫,比如Oracle,MSSQL Server,Mongodb等。

        實現(xiàn)方式代碼量時間穩(wěn)定性
        傳統(tǒng)開發(fā)1000行左右2天/人5個bug左右
        crudapi系統(tǒng)0行1分鐘基本為0

        綜上所述,利用crudapi系統(tǒng)可以極大地提高工作效率和節(jié)約成本,讓數(shù)據(jù)處理變得更簡單!

        crudapi簡介

        crudapi是crud+api組合,表示增刪改查接口,是一款零代碼可配置的產(chǎn)品。使用crudapi可以告別枯燥無味的增刪改查代碼,讓您更加專注業(yè)務,節(jié)約大量成本,從而提高工作效率。crudapi的目標是讓處理數(shù)據(jù)變得更簡單,所有人都可以免費使用!無需編程,通過配置自動生成crud增刪改查RESTful API,提供后臺UI管理業(yè)務數(shù)據(jù)?;谥髁鞯拈_源框架,擁有自主知識產(chǎn)權,支持二次開發(fā)。

        demo演示

        crudapi屬于產(chǎn)品級的零代碼平臺,不同于自動代碼生成器,不需要生成Controller、Service、Repository、Entity等業(yè)務代碼,程序運行起來就可以使用,真正0代碼,可以覆蓋基本的和業(yè)務無關的CRUD RESTful API。

        官網(wǎng)地址:https://crudapi.cn

        測試地址:https://demo.crudapi.cn/crudapi/login

        注公眾號回復:crudapi,即可獲得源碼地址!


        瀏覽 117
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲精品国偷拍自产在线观看蜜桃 | 大乳boobs性大乳bbw | 囯产精品久久久久久久久搜平片 | 亚洲人精品 电 | av在线观看中文字幕日韩精品 | 性生活免费在线观看 | free性中国hd国语page1 | 欧美一级婬片免费视频日日木 | 精品一区二区三区的天堂 | 香蕉三级片 |