Introdução: O que é Mybatis?
(Anteriormente ibatis) Mybatis é uma estrutura de camada de persistência que pode personalizar o SQL, procedimentos armazenados e mapeamentos avançados. Mybatis elimina a configuração manual de quase todo o código e parâmetros JDBC e a recuperação do conjunto de resultados. O Mybatis pode usar XML simples ou anotações para configuração e mapeamento original, interfaces de mapeamento e POJOS de Java (objetos Java antigos simples) para registros no banco de dados.
1. O parâmetro da camada de mapeador é o mapa e a camada de serviço é responsável pela sobrecarga.
Devido a problemas de mecanismo, o mapa não pode ser sobrecarregado. Os parâmetros geralmente são definidos para mapear, mas isso deixará os parâmetros embaçados. Se você deseja deixar o código claro, poderá obter o objetivo de sobrecarregar através da camada de serviço. A camada de serviço fornecida para o exterior está sobrecarregada, mas esses métodos de serviço sobrecarregados são realmente para ajustar o mesmo mapeador, mas os parâmetros correspondentes não são consistentes.
Talvez algumas pessoas possam se perguntar, por que não defini -lo para mapear na camada de serviço? Pessoalmente, não recomendo isso. Embora eu tenha adotado esse método em meus projetos anteriores por conveniência, ele obviamente causará problemas para trabalhos de manutenção futura. Porque fazer isso fará com que todo o seu MVC confie no modelo de mapa. Esse modelo é realmente muito bom e conveniente para criar uma estrutura, mas há um problema: apenas olhando para a assinatura do método, você não conhece o número, o tipo e o significado de cada parâmetro representado pelo mapa.
Imagine, se você alterar apenas a camada de serviço ou a camada DAO, precisará ser claro sobre os parâmetros passados pelo mapa em todo o processo. A menos que você comente ou tenha uma boa documentação, você deve entender claramente o código de cada camada antes de saber quais parâmetros são passados. Para o MVC simples, tudo bem, mas se o nível for complexo, o código se tornará extremamente complexo e, se eu adicionar um parâmetro, precisará adicionar os comentários para cada camada. Comparado aos comentários, é mais viável usar assinaturas de método para garantir essa controlabilidade de código, porque os comentários podem estar desatualizados, mas é improvável que as assinaturas de métodos sejam obsoletas.
2. Tente usar se a escolha e outras declarações o menor possível para reduzir a dificuldade de manutenção.
Ao configurar o SQL em mybatis, tente usar menos rótulos, como se escolher. Se o SQL puder ser usado para determinar o julgamento, tente usar o SQL (caso quando, decodificar etc.) para manutenção posterior. Caso contrário, uma vez que o SQL incha, ele é super -nousoso. Se você precisar depurar o SQL em Mybatis, precisará remover um grande número de declarações de julgamento, o que é muito problemático. Por outro lado, um grande número de julgamentos se o SQL gerado conterá um grande número de espaços, o que aumentará o tempo de transmissão da rede, o que também não é desejável.
Além disso, um grande número de declarações se escolhe, inevitavelmente, o SQL gerado será inconsistente a cada vez, o que levará a um grande número de análise dura do Oracle, o que também não é aconselhável.
Vamos dar uma olhada no SQL assim:
<code style = "preenchimento: 0.5em; margem: 0px; display: block; cor: rgb (101.123,131); overflow-x: automático; fundo: rgb (253,246,227)"> <span style = "padding: 0px; margem: 0px"> <span = "" Cor: RGB (133,153,0) "Selecione </span> * <Span Style =" Padding: 0px; style = "preenchimento: 0px; margem: 0px; cor: rgb (42.161,152)"> 1 </span> = <span style = "preenchimento: 0px; margem: 0px; cor: rgb (42,161,152)"> 1 </span> <stily = ""; Cor: RGB (133,153,0) style = "preenchimento: 0px; margem: 0px; cor: rgb (42.161,152)"> "startDate! = nulo e startdate! = '' e enddate! = null e endate! = ''" "</span> <estilos =" estilismo: 0px; margin: 0px; #{startDate} <span style = "preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> e </span> publicishtime <= #{enddate} </ <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> se </span> <btro> <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> e </span> publishtime> = <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> sysdate </span> - <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (42.161,152) "> 7 </span> <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> e </span> publishtime <= <span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> sysdate </span> </nocros> </<span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> sysdate </span> </nocros> </<span style =" preenchimento: 0px; margem: 0px; Cor: RGB (133,153,0) "> Escolha </span>> </span>Tal se o julgamento é realmente completamente desnecessário. Podemos simplesmente usar o decodificar para resolver o problema do valor padrão:
<code style = "preenchimento: 0.5em; margem: 0px; display: block; cor: rgb (101.123,131); overflow-x: automático; fundo: rgb (253,246,227)"> <span style = "padding: 0px; margem: 0px"> <span = "" Cor: RGB (133,153,0) "Selecione </span> * <Span Style =" Padding: 0px; <span style = "preenchimento: 0px; margem: 0px; cor: rgb (133,153,0)"> decodge </span> (#{startDate}, <span style = "preenchimento: 0px; margin: 0px"> null </span>, <span Style = "Padding: 0px; Cor: RGB (133,153,0) Cor: RGB (133,153,0) "> e </span> publicishtime <= <span style =" preenchimento: 0px; margem: 0px "> null </span>, <span style =" preenchimento: 0px; margem: 0px; margem: 0px; Cor: RGB (133,153,0) "> sysdate </span>,#{enddate}) </span> </code>Obviamente, algumas pessoas podem pensar que a introdução do caso quando e a decodificação exigirão a análise da função Oracle, o que diminuirá o tempo de execução do SQL. Os alunos interessados podem voltar e fazer um teste para ver se haverá um grande impacto. No que diz respeito à experiência pessoal, não encontrei nenhuma desaceleração no SQL devido à análise da função. Geralmente, operações como ingressar, ordem por, distintas, partindo por etc., que geralmente estão intimamente relacionadas ao projeto da estrutura da tabela. Comparado com o grau de impacto da eficiência, o impacto da análise da função na velocidade de execução do SQL deve ser insignificante.
Outro ponto é que, para algumas atribuições de valor padrão, como o SQL acima, os padrões da data atual, etc., você pode mencionar completamente a camada de serviço ou a camada do controlador para processamento. Esses julgamentos devem ser usados menos em Mybatis. Porque, nesse caso, é difícil armazenar em cache processamento. Se o StartDate estiver vazio e usando o sysdate dinâmico no SQL, é impossível determinar qual deve ser a chave da data do startdate do cache. Portanto, é melhor lidar com os parâmetros antes de ser passado para o Mybatis, para que a camada mybatis também possa reduzir alguns se escolher instruções e também é conveniente para o processamento de cache.
Obviamente, não é absoluto não usar se escolher. Às vezes, para otimizar o SQL, se precisar ser resolvido, como declarações semelhantes. Obviamente, como geralmente não é recomendado. No entanto, se houver cenários para uso, remova sempre que não precisar usá -lo, como consultar o título do artigo para melhorar a eficiência da consulta. A melhor maneira é usar mecanismos de pesquisa como a Lucence para resolver esse problema de indexação de texto completo.
Em geral, se e optar por julgar o ramo é impossível de remover completamente, mas é recomendável usar o método nativo do SQL para resolver alguns problemas dinâmicos, em vez de confiar inteiramente nos Mybatis para concluir o julgamento de ramos dinâmicos, porque o ramo de julgamento é muito complexo e difícil de manter.
3. Substitua os comentários do SQL por comentários XML.
Tente não manter os comentários do Mybatis Central SQL. Os comentários causarão alguns problemas. Se você precisar usar comentários, poderá usar <!--> em XML para anotar para garantir que não haja anotações SQL no SQL gerado, reduzindo assim a possibilidade de problemas. Outra vantagem de fazer isso é que ele pode distinguir claramente as anotações do SQL no IDE.
Agora, vamos falar sobre os problemas causados por comentários. Em um projeto em que estou trabalhando, o componente de paginação é baseado no Mybatis. Ele colocará outra camada de Count Select (*) rownum_ de (......) fora do script SQL que você escreveu para calcular o número total de registros. Ao mesmo tempo, há outra seleção aninhada * de (...) em que Rownum> 10 e Ronnum <10 * 2 geram informações de paginação. Se houver um comentário na última linha do seu script, a parte adicionada se tornará parte do comentário e um erro será relatado. Além disso, algumas condições também podem fazer com que algumas condições sejam ignoradas, como as seguintes:
<code style = "preenchimento: 0,5em; margem: 0px; exibição: bloco; cor: rgb (101.123,131); overflow-x: automático; fundo: rgb (253,246,227)"> <span style = "padding: 0px; margin: 0px; style = "preenchimento: 0px; margem: 0px; cor: rgb (133,153,0)"> de </span> teste <span style = "preenchimento: 0px; margem: 0px; cor: rgb (133,153,0)"> where </span> col1> <span style = "padding: 0px; Cor: RGB (42,161,152) "> 1 </span> - aqui está o comentário << span style =" preenchimento: 0px; A! = '' '' '</span>> span style = "margem de 0px: 0px; Margem: 0px "> se </span>> </span> </code>
Mesmo se houver parâmetros correspondentes nos parâmetros passados, não haverá efeito, porque o conteúdo a seguir é realmente comentado completamente. É difícil detectar esse tipo de erro sem testes rigorosos. De um modo geral, os comentários XML podem substituir completamente os comentários do SQL, para que esse comportamento seja proibido.
4. Use #{} sempre que possível, não $ {}.
Tente não usar $ {} em mybatis. É muito conveniente fazer isso. No entanto, há um problema de que uma grande quantidade de uso causará análise dura do Oracle, diminuindo o desempenho do banco de dados. Quanto mais tempo o desempenho do banco de dados será, pior será o desempenho do banco de dados. Para processamento geral de várias strings, você pode consultar a seguinte solução: http://www.myexception.cn/sql/849573.html, que pode basicamente resolver a maior parte do $ {}.
Em relação a $ {}, outro uso indevido é como. Eu tenho outro caso aqui: por exemplo, alguns menus de árvores, nós serão projetados como '01', '0101' e nós de dois bits são usados para distinguir hierarquias. No momento, se você precisar consultar todos os nós no nó 01, o SQL mais simples é: selecione * da árvore onde ID como '01%'. Esse tipo de SQL é realmente compreensível, porque também pode usar índices; portanto, não requer processamento especial, basta usá -lo diretamente. Mas se for o título do artigo, você precisará prestar atenção extra: selecione * de t_news_text onde o título como '%Oscha%', isso não é como usar a indexação. Como mencionado acima, é melhor usar a pesquisa completa de texto. Mas se você não puder ficar sem gostar, precisa prestar atenção ao método de uso: id como #{id} || '%' em vez de id como '$ {id}%' para reduzir a possibilidade de análise dura.
Algumas pessoas pensam que usando || aumentará o tempo para o processamento do Oracle. Eu acho que não toma o Oracle muito estúpido. Embora às vezes seja realmente estúpido, você pode resumir o estúpido e não o lixo quando tiver tempo, mas depois de um pequeno teste, você saberá que esse método de conexão deve ser muito pequeno para a análise e execução de todo o SQL.
Obviamente, existem alguns casos especiais que não podem ser tratados, como injeção dinâmica de nomes de colunas, nomes de tabela etc. Para essas situações, é difícil e não são encontrados meios mais convenientes. Como essa situação tem menos probabilidade de ocorrer, o uso de $ {} não terá grande impacto. Obviamente, se você tiver uma morbidade de código, poderá usar o mecanismo dinâmico de execução do SQL da Oracle executar imediato, para que você possa evitar completamente a possibilidade de $ {}. Isso apresentará modelos mais complexos e, neste momento, você precisa fazer escolhas.
Em resposta aos problemas causados pelo SQL dinâmico acima, a maneira mais radical é usar procedimentos armazenados e resolvê -los de uma maneira nativa do banco de dados para facilitar o desenvolvimento e a depuração. Obviamente, também trará problemas: haverá requisitos mais altos para desenvolvedores, gerenciamento de procedimentos armazenados etc. Meu projeto não adotou esse método, para não expandir mais aqui.
5. Uso simples de Mybatis.
A função de Mybatis é relativamente fraca e carece de muitas bibliotecas auxiliares necessárias, processamento de string etc., e também é difícil de expandir, por isso é geralmente possível processar alguns retornos. Portanto, é melhor usá -lo como um arquivo de configuração SQL simples e uma estrutura ORM simples. Não tente fazer muito SQL dinâmico em Mybatis, caso contrário, fará com que a manutenção subsequente seja muito nojenta.
O exposto acima é o resumo do aprendizado de Mybatis que o editor apresentou a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!