Estrutura de programação eficiente - uma estrutura de programação de camada de persistência de dados de baixo código orientada semântica

I. Introdução

No trabalho de desenvolvimento real, o modelo de domínio do sistema geralmente é projetado para projetar a escalabilidade e a robustez do sistema. Ao mesmo tempo, o gerenciamento básico de dados não pode ser evitado, como adição, exclusão, modificação e consulta, definição e implementação de interface, etc. Algumas tarefas são realmente semelhantes e repetitivas e têm pouco a ver com a lógica de negócios. Essas tarefas geralmente podem ser concluídas automaticamente pelo sistema, e o custo de mão de obra pode ser concentrado principalmente no design e na implementação do modelo de domínio.

Para atingir esse pequeno objetivo, investigamos os melhores frameworks utilizados na indústria, sendo os mais amplamente utilizados o MybatisGenerator e o MyBatis-Plus BaseMapper. Os principais recursos dessas estruturas são reduzir a carga de trabalho de desenvolvimento das funções da camada de persistência. Acredito que os alunos que o usaram devem saber que, no uso real, deve ser o seguinte.

1.1 Como usar o MybatisGenerator para gerar código

private ProductParam buildSearchParam(ProductQueryParam productQueryParam){
    ProductParam param = new ProductParam();
    ProductParam.Criteria cr = param.createCriteria();
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getName() != null){
        cr.andNameEqual(productQueryParam.getName());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        cr.andUserIdEqualTo(productQueryParam.getUserId());
    }
    return param;

}

1.2 Como usar o MyBatis-Plus BaseMapper

public Condition buildCondition(ProductQueryParam productQueryParam){
    Condition condition = new Condition(ProductDO.class);
    condition.orderBy("gmtCreate").desc();
    Criteria criteria = condition.createCriteria();
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    if(productQueryParam.getUserName() != null){
        criteria.andEqualTo("userName", productQueryParam.getUserName());
    }
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    if(productQueryParam.getUserId() != null){
        criteria.andEqualTo("userId", productQueryParam.getUserId());
    }
    
    
}

Pode-se ver que os dois métodos de uso não são elegantes o suficiente, ambos requerem muitos blocos de código complicados para construir Condições e a legibilidade não é amigável o suficiente. Existem até muitos valores mágicos nas condições de construção do MyBatis-Plus BaseMapper, o que não é propício para a manutenção do código.

Como permitir que os desenvolvedores construam Condition graciosamente, até mesmo construam Condition de forma tão simples quanto construir POJO, e interajam graciosamente com a camada de persistência, este é o problema a ser resolvido por esta estrutura de desenvolvimento.

2. Introdução à estrutura da camada de persistência de dados de baixo código

2.1 Diagrama Geral de Arquitetura

2.2 Conceito Geral de Arquitetura

1) A camada aberta para desenvolvedores é composta por DataService, DataParam e DataObject. Os desenvolvedores precisam apenas se preocupar com as condições semânticas correspondentes à lógica de negócios e transmitir as condições semânticas para DataParam. Todo o processo de transmissão é muito simples, tão simples quanto construir um POJO simples. Em seguida, várias operações de armazenamento podem ser concluídas por meio do DataService. Os desenvolvedores não precisam se preocupar em como a camada subjacente usa as condições semânticas.

2) Não importa em que tipo de software o armazenamento é baseado, como mysql, mogodb, opensearch, etc., ele é transparente para os desenvolvedores do usuário. Os desenvolvedores precisam apenas de programação orientada à semântica.

3) Para a explicação dos métodos de interface do sistema, a semântica do próprio código é mais forte do que os comentários do código e os comentários do código são mais fortes do que a documentação externa. No passado, precisávamos construir constantemente condições de operação do Mapper complexas e redundantes, ou mesmo que algumas interfaces comumente usadas fossem encapsuladas para reutilização, quando outra pessoa usava essas interfaces encapsuladas, ela ainda ficava confusa ao ver os campos nos parâmetros de entrada, porque não sabia se esses campos suportavam consultas iguais, consultas notEqual ou consultas Like etc. Não está descartado que alguém possa escrever os comentários com clareza, mas à medida que o sistema itera, a confiabilidade dos comentários continuará diminuindo. É muito hostil para os usuários e a eficiência do desenvolvimento é muito baixa. Com esse conjunto de estruturas, esses problemas desaparecem para sempre.

3. Como implementar uma estrutura de camada de persistência de dados de baixo código

Usando esta ferramenta de desenvolvimento, uma estrutura de programação de camada de persistência de dados de baixo código orientada semântica pode ser implementada de forma muito rápida e fácil.

3.1 Introduzir dependências relacionadas em aplicativos que precisam usar essa estrutura

<dependency>
   <artifactId>fast-frame</artifactId>
   <groupId>com.rhc</groupId>
   <version>1.0-SNAPSHOT</version>
</dependency>

3.2 Execute a configuração relevante no arquivo de configuração application.properties do aplicativo

Configuração única, multiplexação multi-tabela

#################################
## 低代码数据持久层编程框架相关配置 ##
#################################
connect.driver=com.mysql.jdbc.Driver
connect.url=jdbc:mysql://xxx:3306/aaa
connect.userId=xxx
connect.password=xxx

#需要自动生成代码的表名,多个表名用英文逗号分割
table.name=common_tenant,common_log,common_notice

# 重复执行时是否覆盖老的
sql.overwrite=true

## 配置相关文件生成的目标地址
## sqlMap的xml配置文件既可以放在resource资源目录下面,也可以放在源码目录下
## 当目录中含有'com'时,则默认放在源码目录下,否则默认放在resource资源目录下
#sql.xml.targetPackage=META-INF.sqlmap
sql.xml.targetPackage=com.rhc.exam4.sqlmap

# 配置生成的dataObject文件存放的package
data.object.package=com.rhc.exam4.data.internal.dataobject
# 配置查询条件的后缀名
criteria.suffix=Criteria
# 配置生成的Mapper文件存放的package
data.mapper.package=com.rhc.exam4.data.internal.dao

# 配置负责语义化转化的相关文件存放的package
criteria.convertor.package=com.rhc.exam4.data.internal.transfer
# 配置负责语义化转化的相关文件的后缀名
criteria.convertor.suffix=Transfer

# 配置数据层服务入参相关文件存放的package
data.param.package=com.rhc.exam4.data.param
# 配置数据层服务入参的后缀名
data.param.suffix=DataParam

# 配置数据层服务相关文件存放的package
data.service.package=com.rhc.exam4.data.service
data.service.suffix=DataService
data.service.impl.package=com.rhc.exam4.data.service.impl
data.service.impl.suffix=DataServiceImpl

3.3 Comece a gerar a estrutura de programação da camada de persistência de dados

public static void main(String[] args) {

     EffectiveDataBootStrap.runAuto();
}

3.4 O efeito do código gerado

Você pode encontrar o código relevante da estrutura da camada de persistência de dados gerada automaticamente no diretório relevante da configuração, conforme mostrado na figura a seguir.

3.5 Uso real

Na maioria dos casos, os desenvolvedores e usuários só precisam se preocupar com a interface na caixa vermelha na figura acima e importar diretamente os serviços de dados para uso, e o código é conciso e fácil de ler. Ele pode atender a 99% dos cenários de interação com o banco de dados. Para um pequeno número de cenários complexos que não são suportados, os desenvolvedores também podem expandi-lo como se escrevesse código normalmente.

CommonLogDbParam commonLogDbParam = new CommonLogDbParam();
commonLogDbParam.setIdIn(Arrays.asList(32L,43L));
commonLogDbParam.setOperatorLike("operator");
commonLogDbParam.setGmtModifyLessThanOrEqualTo(new Date());
commonLogDbParam.setGmtCreateGreaterThanOrEqualTo(new Date());
List<CommonLog> result = commonLogDataServ.select(commonLogDbParam);

Em quarto lugar, o princípio de realização de ferramentas de desenvolvimento de baixo código

4.1 Diagrama esquemático de implementação

4.2 Descrição da Implementação

Todo o conjunto de ferramentas implementa o núcleo de código baixo usando o MybatisGenerator. Com base no conceito acima e na capacidade de extensão do plug-in, é realizada a capacidade de programação de baixo código de todo o conjunto de serviços da camada de dados.

A implementação deste conjunto de ferramentas de desenvolvimento low-code segue os seguintes conceitos:

1) Adaptação da camada dataService e camada Mapper

2) Adaptação da conexão entre a camada do mapeador e o meio de armazenamento específico

3) Condições de consulta semântica, veja o nome e saiba o significado

4) O código geral da estrutura é gerado automaticamente, o caminho do arquivo de classe é configurável e o sufixo do modelo é configurável

5) Modo de programação conectável plug-in

6) Suporta vários drivers de conexão de banco de dados 

4.3 Diagrama de classe principal

Se você precisar do código-fonte do framework, poderá obtê-lo no endereço abaixo 

Endereço de coleta de informações

Acho que você gosta

Origin blog.csdn.net/qq_42672856/article/details/117843398
Recomendado
Clasificación