Interpretação do código-fonte de 2020 Mybatis

Por que você precisa do framework ORM Mybatis

  • JDBC tem uma carga de trabalho pesada e requer pelo menos cinco etapas para operar o banco de dados
  • Acoplamento de código comercial e código técnico
  • O recurso de conexão é fechado manualmente, o que traz perigos ocultos
  • Os três gigantes
    Connection obtêm uma conexão
    PreparedStatement para pré-compilar a instrução sql
    ResultSet retorna o resultado

Estrutura ORM - anteriormente Ibatis

Três elementos do arquivo de mapeamento Mysql:

  • SQL
  • Regra de mapeamento
  • POJO

Desenvolvimento independente de Mybatis - início rápido

  • 1. Adicionar dependência mybatis
  • 2. Adicionar arquivo de configuração mybatis
  • 3. Introdução de cena
  • 4. Escreva classes de entidade, mapeador e mapper.xml
  • 5. Escreva o código de exemplo

configuração do núcleo mybatis xml

  • mybatis-config.xml
  • Interface do mapeador de classe de entidade mapper.xml;
  • Correspondente a diferentes interfaces por meio de namespace e métodos correspondentes a diferentes ids;

Princípio : Leia o arquivo de configuração para criar a SqlSessionFactory, obtenha a Sqlsession, obtenha o arquivo de configuração do mapeador correspondente e execute a instrução SQL correspondente.
Classe principal : SqlsessionFactoryBuilder: ler informações de configuração
Modo Builder : construir SqlsessionFactory, ciclo de vida no nível do método.

SqlsessionFactory : Criar sessão sqlsession, o modo singleton de fábrica existe em todo o ciclo de vida do programa
Sqlsession : thread não é seguro, thread de garantia exclusiva (nível de método)
SQLMapper : consiste em uma interface Java e um arquivo XML, contém a instrução SQL a ser executada e o resultado definir Mapeamento, ciclo de vida em nível de método;

relacionamento de mapeamento resultType ou resultMap

  • resultType corresponde a um POJO
  • Atributos do resultMap:
    • id de identificação única
    • digite o POJO correspondente
    • O autoMapping é verdadeiro por padrão e mapeia automaticamente os campos e atributos
    • Subelementos:
      id: marcar o id pode melhorar o desempenho geral de recuperação, um para muitos para a coleção de
      resultados e resultado: correspondência um
      para um com a associação de tipo de atributo JavaBean
      : coleção de consulta um para um : um -para-muitos consulta
  • ResultMap pode simplificar a configuração por meio de herança; é um bom hábito prefixar tabelas associadas;
  • O resultMap de outros arquivos xml pode ser referenciado por meio do namespace completo;
  • O resultMap é obrigatório no manual de desenvolvimento do Ali:
    Motivo : desacoplamento, se o banco de dados for modificado um dia, apenas o arquivo de configuração precisa ser alterado, sem a necessidade de alterar o código para recompilar, etc.

Como passar vários parâmetros?

  • 1. Classe de entidade comumente usada
  • 2. A transmissão do mapa é pobre em legibilidade e manutenção, por isso é proibido usar
  • 3. Transferência de anotação @Param simples e clara, é recomendado usar menos de 5 parâmetros

Como obter a chave primária?

  • useGeneratedKeys : true
  • keyProperty : id

Elementos SQL e parâmetros SQL

A pré-compilação # {} é pré-compilada e trata o parâmetro passado como uma string (com aspas simples), o que pode evitar a injeção de SQL em grande medida; os dados passados ​​pelo
valor $ {} são exibidos diretamente no SQL declaração, não é possível evitar injeção de SQL;

SQL Dinâmico

  • se julgamento de ramo único condicional
  • escolher / quando / de outra forma julgamento de ramo multi-condicional
  • trim alças inserir / onde pesquisar / definir atualização trata do problema de montagem de SQL
  • A instrução foreach in é comumente usada para processar operações em lote

Perguntas frequentes da entrevista: como realizar operações em lote através do Mybatis

  • Monte a instrução sql por meio de foreach
  • Irá usar o excutor do tipo BATCH (executor)

Gerador de código MBG do Mybatis Generator:

  • Gerar classes de entidade, interfaces de mapeador e arquivos mapper.xml de tabelas de banco de dados
  • generatorConfiguration: nó raiz
  • contexto: contexto
  • Três formas de gerador de código: Plug-in Maven, inicialização de programa Java, uso de linha de comando

Consulta relacionada

  • O campo associado precisa ter um índice. Se houver mais de três tabelas com associações de junção
    , duas consultas podem ser realizadas
  • Resultados e consultas aninhadas

Como usar o carregamento lento no mybatis

mybatis cache

O cache de primeiro nível é ativado por padrão, e o cache de primeiro nível está desativado. Na guia de seleção, flushCache = "true"
. Quando o ciclo de vida do cache de primeiro nível é uma sessão (Sqlsession),
atualizar / inserir / excluir , o cache será limpo.

O cache de segundo nível é desligado por padrão

Existem em SqlsessionFactory,
leituras sujas são propensas a caches de segundo nível cross-sqlsession . Recomenda-se evitar o uso de caches de segundo nível e usar caches controláveis ​​em vez de (redis) na camada de negócios.

Código-fonte Mybatis em profundidade

Arquitetura geral de Mybatis

  • Camada de suporte básico: fonte de dados, gerenciamento de transações, cache, módulo de vinculação, reflexão, conversão de tipo, módulo de log, carregamento de recursos, analisador
  • Camada de processamento central: análise de configuração, mapeamento de parâmetro, análise SQL, execução SQL, mapeamento de conjunto de resultados, plug-ins
  • Camada de interface: SqlSession

Modo de aparência (modo fachada) : fornece uma interface unificada para acessar um grupo de interfaces no subsistema. O modo de aparência define uma interface de alto nível para tornar o subsistema mais fácil de usar;
encapsular detalhes específicos dentro e apenas expor as interfaces necessárias para o exterior;
ver o código-fonte deve :

  • Agências dinâmicas, tecnologia básica , princípios básicos de
    design, base ideológica
  • Princípio de responsabilidade única
  • Princípio da inversão de dependências: programação orientada à interface, quando a implementação muda, apenas novas classes de implementação são fornecidas, sem a necessidade de modificar o código dos módulos de alto nível;
  • (Mais importante) Princípio aberto-fechado: o programa está aberto para expansão externa e fechado para modificação. Ou seja, quando os requisitos mudam, podemos adicionar novos módulos para atender aos novos requisitos, ao invés de modificar o código original para atender aos novos requisitos.
  • Regra de Dimit: Um objeto deve manter um mínimo de compreensão de outros objetos, e minimizar o acoplamento entre classes;
  • Princípio de substituição de Richter:
  • Princípio de isolamento de interface

Requisitos básicos do módulo de registro de análise de código-fonte da camada de suporte

Mybatis não fornece classes de implementação de registro e precisa ser conectado a componentes de registro de terceiros. Componentes de registro de terceiros têm níveis de registro diferentes e são diferentes. Mybatis fornece quatro níveis de rastreamento, depuração, aviso e erro;
implementação de registro de verificação automática , E a prioridade de carregamento do plug-in de terceiros é: slf4j – commonsLoging – Log4j2 – Log4j – jdkLog

O uso de logs é elegantemente incorporado na função principal.
BaseJdbcLogger: A classe base abstrata para todos os aprimoramentos de log;
ConnectionLogger: Responsável por imprimir informações de conexão e instruções SQL e criar PreparedStatementLogger;
PreparedStatementLogger: Responsável por imprimir informações de parâmetro e criar ResultSetLogger;
ResultSetLogger : Responsável por imprimir informações de resultados de dados;

ConnectionLogger, PreparedStatementLogger e ResultSetLogger implementam proxy dinâmico;
Modo adaptador : como uma ponte entre duas interfaces incompatíveis, ele converte uma interface de uma classe em outra interface desejada pelo cliente. O modo adaptador permite que as interfaces originalmente incompatíveis funcionem juntas.
Destino: a função de destino, a interface esperada;
Adaptador: a função do adaptador, a interface sendo adaptada;
Adaptador: a função do adaptador, que converte a interface de origem na interface de destino;
cenários aplicáveis: quando as partes chamadoras não são fácil de modificar, para reutilizar Os componentes existentes podem usar o modo de adaptador, muitas vezes usado ao acessar componentes de terceiros no sistema;

Modo proxy : fornece um objeto proxy para o objeto de destino, e o objeto proxy controla a referência do objeto de destino;
Objetivo: acesso indireto ao objeto de destino, introduzindo o objeto de proxy para evitar complexidade desnecessária do sistema causada pelo acesso direto ao objeto de destino ; por meio de proxy O objeto aprimora o negócio original;

Onde Mybatis precisa imprimir logs:

  • Ao criar prepareStatement, imprima e execute a instrução SQL;
  • Ao acessar o banco de dados, imprima o tipo e valor do parâmetro;
  • Ao consultar o resultado, imprima o número de dados do resultado;

Diagrama de classe do pacote JDBC do módulo de log

Insira a descrição da imagem aqui

  • ConnectionLogger : Responsável por imprimir informações de conexão e instruções SQL, e criar PrepareStatementLogger;
  • PrepareStatementLogger : Responsável por imprimir informações de parâmetros e criar ResultSetLogger;
  • ResultSetLogger : Responsável por imprimir informações de resultados de dados;

Análise de módulo de fonte de dados

Dificuldades em criar uma fonte de dados analisando o código fonte da camada de suporte básico

  • Todos os componentes de fonte de dados comuns implementam a interface javax.sql.DataSource;
  • O Mybatis não só integra componentes de fontes de dados de terceiros, mas também fornece a própria implementação de fontes de dados;
  • Em geral, os parâmetros de inicialização da fonte de dados são muitos e mais complicados;

Padrão de fábrica (Padrão de fábrica): pertence ao modo de criação, fornece a melhor forma de criar objetos. Defina uma interface para criar um objeto, deixe suas subclasses sentirem qual classe de fábrica instanciar, o padrão de fábrica atrasa o processo de criação para a subclasse;
Interface do produto (Produto) : a interface do produto é usada para definir a função da classe do produto, o classe de fábrica específica Todos os produtos produzidos devem implementar esta interface. O chamador interage diretamente com a interface do produto, que é a interface com a qual o chamador mais se preocupa;
ConcreteProduct : a classe de implementação que implementa a interface do produto e a lógica de negócios específica é definida na classe de produto específica;
** Interface de fábrica (Fábrica ): ** Interface de fábrica é a interface central do padrão de fábrica, o chamador irá interagir diretamente com a interface de fábrica para obter classes de implementação de produto específicas;
Fábrica de concreto: a classe de implementação da interface de fábrica, usada para instanciar objetos de produto, diferentes Específicos classes de fábrica instanciam diferentes classes de implementação de produto de acordo com os requisitos;
modo de fábrica simples

Por que usar o modelo de fábrica?

Insira a descrição da imagem aqui

A criação do objeto é desacoplada do processo de uso do objeto, o que é conveniente para expansão, não precisa modificar o código original, e a classe de fábrica pode ser adicionada diretamente para novas funções e novos requisitos.

Classe principal de pool de conexão de dados

  • PooledDataSource: um pool de conexão de banco de dados simples, sincronizado e seguro para thread;
  • PooledConnection: Use proxy dinâmico para encapsular o objeto de conexão de banco de dados real;
  • PoolState: Um componente usado para gerenciar o estado do objeto PooledConnection, por meio de duas listas para gerenciar os recursos de conexão no estado inativo e os recursos de conexão no estado ativo, respectivamente;
    PooledDataSource obtém e retorna o processo de conexão:
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui

Requisitos básicos do módulo de cache de análise de código-fonte da camada de suporte

Modo decorador : É uma tecnologia usada para substituir a herança. Pode estender as novas funções de objetos sem estender subclasses por herança. Ele usa a relação de associação de objetos em vez de herança, que é mais flexível e evita a rápida expansão do sistema de tipos ;
Insira a descrição da imagem aqui

Componente : a interface do componente define o comportamento de todas as classes de componentes e decoradores; a
classe de realização do componente (ConcreteComponent) : realiza a interface do componente. A classe de realização do componente é o objeto original decorado pelo decorador. Novas funções ou funções adicionais são passadas para o decorador é adicionado ao objeto desta classe; a
classe abstrata decorador (Decorator) : uma classe abstrata que implementa a interface Component, na qual um objeto Component é encapsulado, que é o objeto a ser decorado; a
classe decoradora concreta (ConcreteDecorator) : a classe de implementação deve ser adicionada ao objeto decorado;
vantagens

  • Comparado com a herança, o modelo do decorador é mais flexível e extensível;
  • Flexibilidade: O modo decorador divide as funções em decoradores independentes, que podem ser adicionados dinamicamente de acordo com as necessidades durante a execução, ou mesmo combinados livremente com as novas funções adicionadas;
  • Extensibilidade: quando há uma nova função a ser adicionada, você só precisa adicionar uma nova classe de implementação de decorador e, em seguida, adicionar esse novo decorador por combinação, sem modificar o código existente, em conformidade com o princípio de abertura e fechamento;
    exemplos de uso de decorador modo
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("c://a.txt")));

Componente de cache Mybatis
Insira a descrição da imagem aqui

  • Cache : a interface Cache é a interface principal do módulo de cache, que define a operação básica do cache;
  • PerpetualCache : Desempenhe o papel de ConcreteComponent no módulo de cache e use HashMap para implementar operações relacionadas ao cache;
  • BlockingCache : versão de bloqueio do decorador de cache para garantir que apenas um thread vá para o banco de dados para encontrar os dados correspondentes à chave especificada;

Interpretação de decoradores de cache

  • FifoCache: estratégia de eliminação de cache first-in, first-out
  • LoggingCache: Cache para recursos de registro
  • ScheduledCache: Cache que é esvaziado regularmente
  • BlokingCache: bloqueio de cache
  • SeralizedCache: Cache com capacidade de serialização
  • SynchronizedCache: Cache para controle de sincronização.
    Algumas funções;
    CacheKey

O SQL dinâmico está envolvido em MyBatis. A chave do item de cache não pode ser representada apenas por uma String, então o valor da chave do cache é encapsulado por CacheKey. CacheKey pode encapsular vários fatores que afetam o item de cache; a chave para julgar se dois CacheKeys são iguais para Compare se os valores de hash dos dois objetos são consistentes;

Objetos que compõem o CacheKey

  • mappedStatment 的 id
  • Especifique o intervalo do conjunto de resultados da consulta (informações de paginação)
  • Instrução SQL usada na consulta
  • O valor real do parâmetro passado pelo usuário para a instrução SQL

Análise do módulo de reflexão

Processo de dados de consulta da estrutura Orm
Carregar dados do banco de dados -> localizar as regras de correspondência de mapeamento -> instanciar o objeto de destino -> atribuir propriedades do objeto

A classe básica de reflexão

  • ObjectFactory : Cada vez que Mybatis cria uma nova instância do resultado, ele usará a ObjectFactory para construir o POJO;
  • ReflectorFactory : Crie uma classe de fábrica para Reflector. Reflector é a base do módulo de reflexão Mybatis. Cada objeto Reflector corresponde a uma classe na qual a meta informação da classe necessária para operações de reflexão é armazenada em cache;
  • ObjectWrapper : O empacotamento de objetos abstrai as informações de propriedade de objetos, definindo uma série de métodos para consultar informações de propriedade de objeto e métodos para atualizar propriedades;
  • ObjectWrapperFactory : A classe de fábrica de ObjectWrapper, usada para criar ObjectWrapper;
  • MetaObject : encapsula a meta informação do objeto e encapsula as cinco classes de reflexão principais em MyBatis. É também uma classe de ferramenta de reflexão para uso externo, que pode ser usada para ler ou modificar as informações de atributo do objeto;
    Insira a descrição da imagem aqui

Três estágios do processo principal de Mybatis

Insira a descrição da imagem aqui

  • Estágio de inicialização: leia as informações de configuração no arquivo de configuração XML e anotações, crie objetos de configuração e conclua a inicialização de cada módulo;
  • Encapsular o modelo de programação do iBatis, utilizar a interface do mapeador para desenvolver e inicializar o trabalho;
  • Análise SQL completa, mapeamento de parâmetros, execução de SQL e processo de análise de resultados através do SqlSession;

Fase de carregamento da configuração

Mybatis inicializa o modo construtor

  • Padrão Builder: Use vários objetos simples para construir um objeto complexo passo a passo. Esse tipo de padrão de design é um padrão de criação, que fornece a melhor maneira de criar objetos.
    Insira a descrição da imagem aqui
  • Produto (produto) : o objeto complexo a ser criado;
  • Builder (builder) : Fornece uma interface abstrata para padronizar a construção de cada componente do objeto do produto. Essa interface especifica quais partes do objeto complexo devem ser criadas e não envolve a criação de partes específicas do objeto;
  • ConcreteBuilder (construtor concreto) : implementa a interface Builder e concretiza a criação de várias partes de objetos complexos para diferentes lógicas de negócios. Após a conclusão do processo de construção, forneça exemplos de produtos;
  • Diretor (diretor) : chama o construtor específico para criar cada parte do objeto complexo. O diretor não envolve as informações do produto específico, mas é apenas responsável por garantir que todas as partes do objeto sejam criadas completamente ou em uma determinada ordem ;

Cenários de uso do modo Builder

  • O objeto que precisa ser gerado tem uma estrutura interna complexa. Ao instanciar o objeto, você deve proteger os detalhes internos do objeto para desacoplar o código de nível superior do processo de instanciação do objeto. Você pode usar o modo construtor; em suma: se você encontrar vários Considere usar o construtor ao construir os parâmetros do construtor ";
  • A instanciação de um objeto depende da seqüência de produção e montagem de cada componente.O foco está na montagem passo a passo do objeto de destino, e o modo builder pode ser usado;
Padrões de design Metáfora de imagem Complexidade do objeto Nível de participação do cliente
Modo de fábrica Produção em massa O que importa para você é o produto como um todo, e você não precisa se preocupar com a forma como cada parte do produto é criada. A participação do cliente no processo de criação do produto é baixa e os valores dos atributos são relativamente fixos quando o objeto é instanciado
Modo Builder Versão customizada de produção O objeto a ser construído é mais complexo, é um produto composto, que é composto por vários componentes, e os objetos de produto são diferentes para diferentes componentes, e o produto gerado tem granularidade fina; O cliente participa da criação do produto, sente o tipo e o conteúdo do produto e tem um alto grau de participação, adequado para cenários onde os atributos mudam com frequência ao instanciar objetos;

Aplicação do modo construtor no MyBatis

Insira a descrição da imagem aqui

  • SqlSessionFactoryBuilder cria SqlSessionFactory
  • XMLConfigBuilder , XMLMapperBuilder , XMLStatementBuilder criam objetos de configuração
  • CacheBuilder cria um cache secundário
  • ResultMapping Builder cria objetos ResultMapping

Diagrama de classe do construtor MyBatis
Insira a descrição da imagem aqui

  • BaseBuilder : A classe pai de todos os analisadores, incluindo exemplos de arquivo de configuração e alguns métodos comuns para analisar arquivos;
  • XMLConfigBuilder : Principalmente responsável por analisar mybatis-config.xml;
  • XMLMapperBuilder : Principalmente responsável por analisar arquivos de configuração de mapeamento;
  • XMLStatementBuilder : Principalmente responsável por analisar o nó SQL no arquivo de configuração de mapeamento;

Inicialização de mybatis

Insira a descrição da imagem aqui

Pergunta da entrevista Ali: Por que o banco de dados pode ser desenvolvido usando a interface do mapeador?
Insira a descrição da imagem aqui
A classe chave do mapeador

  • Configuração : O núcleo da inicialização do Mybatis é carregar todas as informações do arquivo de configuração xml no objeto Configuração .A configuração é um singleton e o ciclo de vida é no nível do aplicativo;
  • MapperRegistry : O centro de registro da classe de fábrica do proxy dinâmico da interface do mapeador. Em Mybatis, a interface InvocationHandler é implementada por meio de mapperProxy, e MapperProxyFactory é usado para gerar objetos de instância de proxy dinâmico;
  • ResultMap: usado para analisar o nó resultMap no arquivo mapper.xml e usar ResultMapping para encapsular elementos filho, como id e result;
  • MappedStatement : usado para armazenar os nós selsct, inserir, atualizar e excluir no arquivo mapper.xml, e também contém
    muitos atributos importantes desses nós;
  • SqlSource : quando o usuário cria BoundSql, a instrução SQL em mapper.xml será analisada em objetos BoundSql. A instrução BoundSql analisada contém apenas o? Espaço reservado no final, que pode ser enviado diretamente ao banco de dados para execução;

Diagrama ResultMap
Insira a descrição da imagem aqui

Interpretação de arquivo de configuração + aprimoramento de proxy dinâmico

Análise do módulo de ligação

Análise de componentes do executor

Modo de modelo

  • Executor é uma das interfaces principais de Mybatis, que define o método mais básico de operação de banco de dados. As funções de SqlSession são realizadas com base nele;
    experiência e habilidades de programação e a ideia de código-fonte.
    Primeiro, entenda a estrutura de dados, e, em seguida, discuta o algoritmo em detalhes

Acho que você gosta

Origin blog.csdn.net/weixin_42292697/article/details/109788159
Recomendado
Clasificación