- Construção do ambiente de código-fonte MyBatis e análise geral da arquitetura

Da última vez, demonstrei o uso básico do MyBatis em projetos práticos por meio de um exemplo do sistema de pedidos para ajudá-lo a começar a usar o framework MyBatis rapidamente. Desta vez, vou levá-lo a construir um ambiente de depuração para o código-fonte do MyBatis e analisar a estrutura do código-fonte do MyBatis para você.Isso está abrindo o caminho para a análise do código-fonte mais tarde.

Instalação e inicialização do MySQL
Instalar e iniciar dados relacionais é a base para depurar o código-fonte do MyBatis. No momento, muitas empresas de Internet consideram o MySQL como o banco de dados preferido, então aqui também escolho o banco de dados MySQL para depurar o código-fonte do MyBatis

  1. Baixe o MySQL
    Primeiro, baixe a versão mais recente do MySQL Community Server do site oficial do MySQL. MySQL Community Server é uma versão comunitária do servidor MySQL, você pode testá-lo gratuitamente. Aqui eu escolho usar tar.gz para instalar, então preciso baixar o pacote de instalação tar.gz correspondente, conforme mostrado na caixa vermelha na figura a seguir:
    Insira a descrição da imagem aqui
    Interface de download do MySQL
  2. Depois de configurar o MySQL para
    baixar o pacote de instalação tar.gz, executo o seguinte comando para descompactar o pacote tar.gz e obter o diretório mysql-8.0.22-macos10.15-x86_64.
tar -zxf mysql-8.0.22-macos10.15-x86_64.tar.gz

Em seguida, execute o seguinte comando para entrar no diretório de arquivos de suporte:

cd ./mysql-8.0.22-macos10.15-x86_64/support-files

Execute o seguinte comando para abrir o arquivo mysql.server para edição:

vim mysql.server

Aqui, preciso definir as variáveis ​​basedir e datadir no diretório raiz do MySQL e o diretório de dados no diretório MySQL (conforme mostrado na figura abaixo) e, finalmente, executar o comando: wq para salvar as alterações em mysql.server e sair .
Insira a descrição da imagem aqui
Exemplo de modificação do arquivo mysql.server Figura
3. Depois de iniciar o MySQL
, executei o seguinte comando para entrar no diretório bin do MySQL:

cd ../bin/

E execute o seguinte comando mysqld para inicializar o MySQL, mas você precisa prestar atenção às informações de parâmetro adicionadas aqui, você pode especificar o diretório raiz e o diretório de dados através dos parâmetros basedir e datadir.

./mysqld --initialize --user=root --basedir=/Users/xxx/Downloads/mysql-8.0.22-macos10.15-x86_64 --datadir=/Users/xxx/Downloads/mysql-8.0.22-macos10.15-x86_64/data

Depois que o processo de inicialização for concluído normalmente, você pode obter a senha padrão inicial do MySQL na linha de comando, conforme mostrado na figura a seguir:

Insira a descrição da imagem aqui
Imagem de exemplo de inicialização bem-sucedida do MySQL
Com a senha padrão, posso iniciar e fazer login no serviço MySQL. Primeiro, preciso ir para o diretório support-files:

cd ../support-files/

Em seguida, execute o seguinte comando para iniciar o serviço MySQL:

./mysql.server start

Depois que o serviço MySQL é iniciado normalmente, você pode ver a saída conforme mostrado na figura a seguir:
Insira a descrição da imagem aqui
Exemplo de inicialização do MySQL com sucesso Figura
4. Faça login no MySQL e
vá para o diretório bin:

cd ../bin/

E execute o seguinte comando para fazer login no MySQL usando a senha padrão obtida anteriormente.

./mysql -uroot -p'rAUhw9e&VPCs'

Depois de fazer o login, você pode entrar no MySQL Shell, conforme mostrado na figura a seguir:
Insira a descrição da imagem aqui
Exemplo de login bem-sucedido no MySQL
Em seguida, posso alterar a senha no MySQL Shell, os comandos específicos são os seguintes:

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

Depois que a execução for bem-sucedida, da próxima vez que usar o MySQL Shell para se conectar, você precisará fazer login com a nova senha.

Finalmente, se você deseja fechar o serviço MySQL, pode pular para o diretório support-files e executar o seguinte comando:

cd ../support-files/

./mysql.server stop

Se você obtiver a seguinte saída, significa que o serviço MySQL foi encerrado com sucesso:
Insira a descrição da imagem aqui
Diagrama de amostra do desligamento MySQL com sucesso

Também deve ser observado aqui que no processo de desenvolvimento real, clientes de interface gráfica MySQL são geralmente usados, como Navicat, MySQL Workbench Community Edition, etc. Geralmente, o MySQL só será usado diretamente na linha de comando do Linux da máquina online. O Shell realiza algumas operações.

Claro, eu pessoalmente recomendo que você use esses clientes de interface gráfica, que podem melhorar sua eficiência de desenvolvimento diário.
Construção do ambiente de código-fonte MyBatis
Após o MySQL ser instalado e iniciado, você pode começar a construir o ambiente de código-fonte MyBatis.

Em primeiro lugar, é necessário instalar o ambiente básico para desenvolvimento Java, como JDK, Maven e Git. A instalação desses softwares não será apresentada aqui. Você já deve estar familiarizado com eles.

Em seguida, execute o seguinte comando para baixar o código-fonte do MyBatis do GitHub:

git clone https://github.com/mybatis/mybatis-3.git

Dependendo da velocidade da rede, o processo demorado desse processo de download pode variar. Após a conclusão do download, você pode obter a seguinte saída:
Insira a descrição da imagem aqui
Diagrama de exemplo de download do MyBatis
Neste ponto, obtive um diretório mybatis-3 localmente e posso entrar no diretório executando o seguinte comando cd:

cd ./mybatis-3/

Em seguida, execute o seguinte comando git para alternar ramos (este curso é baseado no código da versão MyBatis 3.5.6 para análise):

git checkout -b mybatis-3.5.6 mybatis-3.5.6

Depois que a troca for concluída, também posso usar o seguinte comando git para verificar se a troca do branch foi bem-sucedida:

git branch -vv

Aqui eu obtenho a saída conforme mostrado na figura abaixo, o que significa que mudei para a tag mybatis-3.5.6.
Insira a descrição da imagem aqui
diagrama de exemplo do git branch

Por fim, abro o IDEA, seleciono Abrir ou Importar e importo o código-fonte do MyBatis, conforme mostrado na figura a seguir:
Insira a descrição da imagem aqui
Diagrama de opções de importação do IDEA Após a conclusão da
importação, você pode ver a estrutura do código-fonte do MyBatis, conforme mostrado a seguir figura:
Insira a descrição da imagem aqui
Introdução à arquitetura MyBatis
completa a configuração do ambiente de origem MyBatis Depois disso, vou levá-lo para analisar a arquitetura do MyBatis.

MyBatis é dividido em três camadas de arquitetura, ou seja, a camada de suporte básico, camada de processamento de núcleo e camada de interface, conforme mostrado na figura a seguir:
Insira a descrição da imagem aqui

  1. Camada de suporte
    básico A camada de suporte básico é a base de todo o framework MyBatis. Ela fornece funções muito básicas para todo o framework MyBatis. Cada módulo fornece uma capacidade única e coesa. A camada de suporte básico MyBatis pode ser baseada nesses recursos únicos. Dividido em nove módulos básicos, conforme mostrado na figura acima.

Como a função do módulo de carregamento de recursos é muito simples e a frequência de uso não é alta, não vou apresentá-lo aqui. Se você estiver interessado, pode consultar os materiais relevantes para entender e aprender. A seguir, descreverei resumidamente as funções básicas dos oito módulos restantes.No segundo módulo deste curso, vou levá-lo a analisar em detalhes a implementação específica desses módulos básicos.

O primeiro é o módulo de conversão de tipo. Na implementação do sistema de pedidos mostrado na aula anterior, podemos definir um apelido para uma classe através de tags no arquivo de configuração mybatis-config.xml O "mecanismo de apelido" usado aqui é o módulo de conversão de tipo na camada de suporte básico MyBatis. Alcançou.

Além do "mecanismo de alias", o módulo de conversão de tipo também implementa a conversão mútua entre tipos JDBC e tipos Java em MyBatis. Essa função é refletida na vinculação de parâmetros reais e mapeamento de cenários ResultSet:

No cenário em que o modelo SQL vincula o usuário para passar os parâmetros reais, o módulo de conversão de tipo converte dados de tipo Java em dados de tipo JDBC;

Ao mapear o ResultSet para o objeto de resultado, o módulo de conversão de tipo converte dados de tipo JDBC em dados de tipo Java.

A situação específica é mostrada na figura abaixo: A
Insira a descrição da imagem aqui
segunda é o módulo de log. Os logs são a principal fonte de dicas para solução de problemas, localização de bugs e bloqueio de gargalos de desempenho em nossa prática de produção. Em qualquer sistema maduro, haverá módulos de log com níveis razoáveis ​​e informações completas, e MyBatis não é exceção. MyBatis fornece um módulo de registro para integrar estruturas de registro de terceiros no ecossistema Java. Este módulo pode integrar estruturas de registro excelentes, como Log4j, Log4j2 e slf4j.

O terceiro é o módulo da ferramenta de reflexão. A função de reflexão em Java é muito poderosa. Muitas estruturas de software livre contam com reflexão para atingir alguns requisitos relativamente flexíveis, mas a maioria dos programadores Java raramente usa a tecnologia de reflexão diretamente em seu trabalho real. A caixa de ferramentas de reflexão de MyBatis é uma camada de encapsulamento baseada em reflexão Java, fornecendo uma interface de API mais flexível e conveniente para usuários superiores e, ao mesmo tempo, o cache de metadados relacionados à reflexão nativa de Java, o que melhora a eficiência da execução do código de reflexão o desempenho da operação de reflexão.

O quarto é o módulo Binding. No exemplo de sistema de pedidos apresentado na aula anterior, podemos obter o proxy da interface do Mapper por meio do SqlSession e, em seguida, executar as operações do banco de dados no arquivo Mapper.xml associado por meio desse proxy. Desta forma, alguns erros podem ser avançados para o tempo de compilação, e esta função é completada pelo módulo Binding.

É especificamente afirmado aqui que ao usar MyBatis, não precisamos escrever uma implementação específica da interface do Mapeador, mas usar o módulo Binding para gerar automaticamente um objeto proxy dinâmico para a interface do Mapeador. Para algumas operações de dados simples, também podemos usar anotações diretamente na interface do Mapper. Mesmo o arquivo de configuração Mapper.xml não precisa ser escrito, mas se o mapeamento ResultSet e SQL dinâmico forem muito complicados, é recomendado mantê-lo em o arquivo de configuração Mapper.xml Conveniência.

O quinto é o módulo de fonte de dados. Um dos principais componentes da estrutura da camada de persistência é a fonte de dados.Uma fonte de dados com excelente desempenho pode dobrar o desempenho do sistema. O próprio MyBatis fornece um conjunto de boas implementações de fonte de dados, que também é a implementação padrão do MyBatis. Além disso, no ecossistema Java, existem muitas fontes de dados de código aberto excelentes para escolher. O módulo de fonte de dados do MyBatis também fornece interfaces relacionadas para integração com fontes de dados de terceiros, o que também fornece aos usuários mais opções. Maior flexibilidade de comutação de fonte de dados.

O sexto é o módulo de cache. O banco de dados é um armazenamento central na geração prática, e muitos dados de negócios cairão no banco de dados, portanto, os prós e os contras do desempenho do banco de dados afetam diretamente os prós e os contras do sistema de negócios de nível superior. Muitos de nossos negócios online estão no cenário de ler mais e escrever menos. Quando o banco de dados encontra um gargalo, o armazenamento em cache é um dos métodos mais eficazes e comumente usados ​​(conforme mostrado na figura abaixo). O uso correto do armazenamento em cache pode interceptar algumas solicitações de banco de dados no cache. Nesse nível, isso pode reduzir a pressão em uma parte do banco de dados e melhorar o desempenho do sistema.
Insira a descrição da imagem aqui
Além de usar caches de terceiros externos, como Redis e Memcached, os frameworks de persistência geralmente também vêm com caches integrados. Por exemplo, MyBatis fornece caches de primeiro e segundo nível. A implementação específica está localizada no módulo de cache de a camada de suporte básico.

Sétimo, o módulo analisador. No exemplo do sistema de pedidos na aula anterior, podemos ver que existem dois arquivos de configuração principais no MyBatis que precisam ser analisados, um é o arquivo de configuração mybatis-config.xml e o outro é o arquivo de configuração Mapper.xml. Ambos os arquivos são analisados ​​pelo módulo analisador do MyBatis, que se baseia principalmente no XPath para obter uma análise eficiente dos arquivos de configuração XML e várias expressões.

O oitavo módulo de gerenciamento de transações. A estrutura da camada de persistência geralmente fornece um conjunto de mecanismos de gerenciamento de transações para implementar o controle de transações do banco de dados.MyBatis fornece uma abstração simples das transações no banco de dados e fornece interfaces e implementações de transações simples e fáceis de usar. Em circunstâncias normais, os projetos Java serão integrados ao Spring e a estrutura do Spring gerenciará os negócios. Em cursos posteriores, também explicarei em profundidade os princípios de integração MyBatis e Spring, incluindo integração relacionada ao gerenciamento de transações.

  1. Camada de processamento do núcleo Depois de
    introduzir a camada de suporte básico do MyBatis, vamos analisar a camada de processamento do núcleo do MyBatis.

A camada de processamento central é a implementação central do MyBatis, que envolve a inicialização do MyBatis e todo o processo de execução de uma instrução SQL. Abaixo, apresentarei a implementação de cada parte da camada de processamento principal.

O primeiro é a análise de configuração. Sabemos que MyBatis possui três locais onde você pode adicionar informações de configuração, a saber: arquivo de configuração mybatis-config.xml, arquivo de configuração Mapper.xml e informações de anotação na interface do Mapper. Durante a inicialização do MyBatis, as informações de configuração serão carregadas, e o objeto de configuração obtido após a análise será salvo no objeto Configuração.

Por exemplo, as tags usadas no exemplo do sistema de pedidos (ou seja, as regras de mapeamento do conjunto de resultados da consulta customizada) serão analisadas em objetos ResultMap. Podemos usar o objeto Configuration obtido para criar o objeto SqlSessionFactory (ou seja, o objeto fábrica que cria o objeto SqlSession) e, em seguida, criar o objeto SqlSession para executar operações de banco de dados.

O segundo é o módulo de análise e script SQL. O maior destaque do MyBatis deve ser sua função SQL dinâmica.Você só precisa usar as tags fornecidas pelo MyBatis para gerar dinamicamente as instruções SQL executadas de acordo com as condições operacionais reais. As tags SQL dinâmicas fornecidas por MyBatis são muito ricas, incluindo tags, tags, tags, tags, etc.

O módulo de script no MyBatis é o módulo principal responsável por gerar SQL dinamicamente. Ele analisará as tags no SQL dinâmico de acordo com os parâmetros reais passados ​​pelo usuário no tempo de execução e formará um modelo SQL, em seguida, processará os marcadores no modelo SQL, preencherá os marcadores com os parâmetros reais em tempo de execução e obterá o banco de dados para ser uma instrução SQL verdadeiramente executável.

O terceiro é a execução SQL. Em MyBatis, para executar uma instrução SQL, vários componentes estão envolvidos, os principais são: Executor, StatementHandler, ParameterHandler e ResultSetHandler.

Entre eles, o Executor chamará o módulo de gerenciamento de transações para implementar o controle relacionado à transação e, ao mesmo tempo, gerenciará o cache de primeiro nível e o cache de segundo nível por meio do módulo de cache. A execução real da instrução SQL será implementada pelo StatementHandler. Como exatamente isso é feito? O StatementHandler primeiro dependerá do ParameterHandler para vincular os parâmetros reais do modelo SQL, então o objeto java.sql.Statement passará a instrução SQL e os parâmetros reais vinculados ao banco de dados para execução, obterá o ResultSet do banco de dados e, finalmente, o ResultSetHandler vinculará o ResultSet mapeado a objetos Java e retornará ao chamador, este é o núcleo do módulo de execução SQL.

A figura a seguir mostra o processo central de MyBatis executando uma instrução SQL:

Insira a descrição da imagem aqui
O quarto é o plug-in. Muitas estruturas de código aberto maduras fornecem recursos de expansão de várias maneiras. Quando os recursos nativos da estrutura não podem atender a determinados cenários, alguns plug-ins podem ser implementados para esses cenários para atender às necessidades, de modo que a estrutura possa ter vitalidade suficiente. Este também é o significado da interface do plug-in MyBatis.

Ao mesmo tempo, no aplicativo real, você também pode estender o MyBatis por meio de plug-ins personalizados ou alterar o comportamento padrão do MyBatis. Como os plug-ins podem afetar o comportamento do kernel MyBatis, antes de personalizar os plug-ins, você deve entender os princípios operacionais internos do MyBatis para evitar escrever plug-ins que não atendam às expectativas, introduzindo alguns bugs funcionais estranhos ou problemas de desempenho.

  1. Camada de
    interface A camada de interface é uma coleção de interfaces expostas a chamadas por MyBatis. Essas interfaces são algumas das interfaces mais comumente usadas ao usar MyBatis, por exemplo, a interface SqlSession, a interface SqlSessionFactory e assim por diante. Entre eles, o mais importante é a interface SqlSession, por meio da qual você pode realizar várias funções, como obter agentes Mapper, executar instruções SQL e controlar switches de transação.

Acho que você gosta

Origin blog.csdn.net/Rinvay_Cui/article/details/113833353
Recomendado
Clasificación