Mybatis é uma estrutura de camada duradoura muito popular no setor. É leve e fácil de usar. Está completamente liderando no campo de TI financeiro. É mais popular que o Hibernate, com muitas vantagens e também vale a pena aprender. Mas o Mybatis não é perfeito, e seu próprio design e codificação ainda têm muitas deficiências, até defeitos. Este artigo discute brevemente estes defeitos:
1.Mybatis usa o DTD como o arquivo de verificação para arquivos de configuração XML, mas é óbvio que o DTD é quase uma tecnologia apagada. Possui funções muito limitadas, escalabilidade muito baixa, escalabilidade muito baixa, escalabilidade muito baixa e baixa legibilidade. A primavera pode girar maravilhosamente do DTD para o XSD, mas Mybatis nunca teve essa coragem.
2. Se a compatibilidade da versão não for bem feita, tome 3.3.0 -> 3.4.0 como exemplo. De acordo com as especificações gerais do setor, o número da versão do segundo nível pode ser atualizado e as funções podem ser adicionadas, mas a compatibilidade com versões anteriores deve ser garantida. No entanto, a abordagem de Mybatis não é exatamente assim. Dê uma olhada no método -chave do DeclarationHandler para se preparar:
// 3.3.0statement Prepare (conexão de conexão) lança sqLexception; // 3.4.0 estatamento Prepare (conexão de conexão, transação inteiraTimeout) lança sqLexception;
Não há método adicionado aqui, mas um parâmetro é adicionado diretamente ao método original! Existem muitos exemplos semelhantes, então não os listarei um por um.
3. O plug-in Mybatis usa uma interface interceptadora geral, acompanhada de anotações como @Intercepts e @Signature para implementar vários métodos de interceptação de vários componentes. Parece muito flexível. Na minha opinião, a estrutura não é clara o suficiente. Durante o desenvolvimento real, você colocará o aprimoramento da interceptação de Declaração e Resultados em uma classe? Não está certo (sim? Você é o princípio de responsabilidade única e o princípio de abertura e fechamento toda a merda?), Então, por que é necessário forçar a mesma interface?
Além disso, use a anotação @Signature para especificar os métodos de componentes que precisam ser interceptados. Se a anotação estiver errada, a compilação não relatará um erro. Você só pode esperar até que seja executado para descobri -lo. Vamos dar uma olhada no exemplo acima:
Suponha que eu implementei um plugin para a versão 3.3.0:
@Intercepts ({@signature (type = declarationHandler.class, method = "preparar", args = {Connection.class})}) public class DeclarectionHandlerInterceptor implementa interceptor {@OverridePublic Object Intecept (Invocation) lança throwsable {retorna invocação.proeCeced ();}}}} Este);}@substituir o Void SetProperties (Propriedades Propriedades) {}} {}}Em seguida, foi atualizado para 3.4.0. Como resultado, a compilação era normal, mas quando foi executada, uma exceção foi lançada.
4. O cache de Mybatis é simplesmente inútil e, independentemente de haver uma configuração, é necessário usar o cache ou atualizar o cache, é necessário calcular o cachekey. Se não houver cache ou atualizar o cache, esse cálculo será um desperdício.
5. Para execução em lote de Mybatis, consulte o seguinte exemplo JDBC:
public void testjdbcbatch (conexão conn) lança exceção {try {Conn.SetAutocommit (false); BatchUpDate (conn); clearTestData (conn); conn.Commit (); Conn.setAutocomm (true);} catch (exceção e) {Conn.rollback (); Throws e; {Preparadostatement ps = null; tente {ps = conn.Preparestatement ("Excluir tabela_name1 onde field_name1 =?"); Ss.SetString (1, "teste"); int d = Ps.executeUpdate (); System.out.println ("Plegings (" + d); e) {}}} private void batchupdate (conexão conn) lança sqLexception {preparado estatement ps = null; tente {string sql = "insert in table_name2 (field_name1, field_name2, field_name2) (?,?)"; pS = iScReLeLement2, field_name2) (?,?) "; i ++) {String aleatória = RandomstringUtils.randomalphabetic (8); Ps.SetString (1, "teste"); // field_name1ps.setstring (2, "dados" + aleatória); // field_name2ps.setstring (3, "parameter" + aleatoriamente); ps.executeBatch ();} finalmente {try {ps.close ();} catch (Exceção e) {}}}O código não tem senso de incongruência, pode ser executado normalmente e também pode reverter conforme o esperado. Ou seja, a mesma conexão na mesma transação pode executar o SQL e o lote comum ao mesmo tempo, mas você a experimenta na sessão do SQL da mesma transação, e o que seu feedback é que você não pode alternar o método de execução na mesma transação!
6. Compatibilidade dos produtos do banco de dados: Mybatis entregou o controle do SQL aos desenvolvedores, por isso ocupou moralmente as alturas de comando - o que você escreveu é incompatível, esse é o seu próprio nível! Mas isso é a pose certa para um quadro muito bom? Por que alguma implementação compatível auxiliar não pode ser fornecida? Por exemplo, se a função de decodificação, que é considerada um deus no Oracle, ele pode ser fornecido com uma tag <Codode> no SQLMapper e silenciosamente modificada para o caso quando posterior? Em outras palavras, não importa se o funcionário não o fornece, mas você precisa fornecer um método de expansão, então eu volto: a escalabilidade é muito ruim, a escalabilidade é muito ruim e a escalabilidade é muito ruim. Eu disse as coisas importantes três vezes, mas as disse seis vezes.
O exposto acima são os defeitos de Mybatis apresentados a você pelo editor. Espero que seja útil para você!