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
- 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?
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:
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 ;
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
- 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;
Três estágios do processo principal de Mybatis
- 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.
- 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
- 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
- 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
Pergunta da entrevista Ali: Por que o banco de dados pode ser desenvolvido usando a interface do mapeador?
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
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