Mybatis est un cadre de couche durable très populaire dans l'industrie. Il est léger et facile à utiliser. Il mène complètement dans le domaine informatique financière. Il est plus populaire que Hibernate, avec de nombreux avantages et vaut également la peine d'être appris. Mais Mybatis n'est pas parfait, et sa propre conception et codage ont encore de nombreuses lacunes, même des défauts. Cet article discute brièvement de ces défauts:
1.MyBatis utilise DTD comme fichier de vérification pour les fichiers de configuration XML, mais il est évident que DTD est presque une technologie effacée. Il a des fonctions très limitées, une très mauvaise évolutivité, une très mauvaise évolutivité, une très mauvaise évolutivité et une mauvaise lisibilité. Le printemps peut magnifiquement passer du DTD à XSD, mais Mybatis n'a jamais eu ce courage.
2. Si la compatibilité de la version n'est pas bien faite, prenez 3.3.0 (> 3.4.0 comme exemple. Selon les spécifications générales de l'industrie, le numéro de version de deuxième niveau peut être mis à niveau et des fonctions peuvent être ajoutées, mais la compatibilité en arrière doit être assurée. Cependant, l'approche de Mybatis n'est pas exactement comme ça. Jetez un œil à la méthode clé de la déclaration de déclaration pour préparer:
// 3.3.0statement prépare (connexion de connexion) lève la conception SQExException; // 3.4.0statement prépare (connexion de connexion, transaction entière) lève sqlexception;
Il n'y a pas de méthode ajoutée ici, mais un paramètre est ajouté directement à la méthode d'origine! Il existe de nombreux exemples similaires, donc je ne les listerai pas un par un.
3. Le plug-in MyBatis utilise une interface intercepteur générale, accompagnée d'annotations telles que @Intercepts et @Signature pour implémenter plusieurs méthodes d'interception de plusieurs composants. Cela semble très flexible. À mon avis, la structure n'est en fait pas assez claire. Pendant le développement réel, allez-vous mettre l'amélioration de l'interception de StatementHandler et des résultats en une seule classe? N'est-ce pas vrai (oui? Êtes-vous le principe de responsabilité unique et le principe d'ouverture et de clôture de la merde?), Alors pourquoi est-il nécessaire de forcer la même interface?
De plus, utilisez l'annotation @Signature pour spécifier les méthodes de composant qui doivent être interceptées. Si l'annotation est erronée, la compilation ne rapportera pas d'erreur. Vous ne pouvez qu'attendre qu'il soit exécuté pour le découvrir. Jetons un coup d'œil à l'exemple ci-dessus:
Supposons que j'ai implémenté un plugin pour la version 3.3.0:
@Intercepts ({@Signature (Type = StatementHandler.class, Method = "Prepare", Args = {Connection.class})}) Classe publique Intercept de déclaration (Invocation Invocation) lance Throws Throws {return invocation.proceed ();} @ overridepublic Object Plugin (Object Target) this);} @ OverRidepublic void SetProperties (Propriétés Propriétés) {}}Ensuite, il a été mis à niveau à 3.4.0. En conséquence, la compilation était normale, mais lorsqu'elle a été exécutée, une exception a été lancée.
4. Le cache de Mybatis est tout simplement inutile, et qu'il existe une configuration, il est nécessaire d'utiliser le cache ou de mettre à jour le cache, il est nécessaire de calculer le cachekey. S'il n'y a pas de cache ou de mise à jour le cache, ce calcul est un déchet.
5. Pour l'exécution par lots de MyBatis, consultez l'exemple JDBC suivant:
public void testjdbcbatch (connexion conn) lève une exception {try {conn.setAutoCommit (false); batchupdate (conn); clearTestData (congn); conn.commit (); conn.setAutoMmit (true);} capture (exception e) {conn.rollback (); lancer e;}} private Void ClearTestData (Connection) {PréparéStatement ps = null; try {ps = conn.preparestatement ("Delete Table_name1 Where Field_Name1 =?"); Ps.SetString (1, "test"); int d = ps.ExecuteUpdate (); System.out.println ("Delete Counts:" + d);} Enfin {try {ps.ps.close (); e) {}}} private void batchupdate (connexion conn) lève sqlexception {préparéStatement ps = null; try {string sql = "insérer dans table_name2 (field_name1, field_name2, field_name2) valeurs (?, i ++) {String random = randomStringUtils.randomalphabetic (8); ps.setstring (1, "test"); // field_name1ps.setstring (2, "data" + random); // field_name2ps.setstring (3, "paramètre" + random); // field_name3ps.adddbatch ();} int [] rs = ps.ExecuteBatch ();} enfin {try {ps.close ();} catch (exception e) {}}}Le code n'a aucun sens de l'incongruité, peut s'exécuter normalement et peut également reculer comme prévu. C'est-à-dire que la même connexion dans la même transaction peut exécuter un SQL et un lot ordinaires en même temps, mais vous l'essayez dans la SQLSession de la même transaction, et ce que vous vous commentiez, c'est que vous ne pouvez pas changer la méthode d'exécution dans la même transaction!
6. Compatibilité des produits de base de données: Mybatis a remis le contrôle de SQL aux développeurs, donc il occupait moralement les sommets dominants - ce que vous avez écrit est incompatible, c'est votre propre niveau! Mais est-ce la bonne pose pour un très bon cadre? Pourquoi une implémentation compatible auxiliaire ne peut-elle pas être fournie? Par exemple, si la fonction Decode, qui est considérée comme un dieu dans Oracle, peut-elle être fournie avec une balise <code> dans SQLMapper et modifiée silencieusement dans le cas où plus tard? En d'autres termes, peu importe si le fonctionnaire ne le fournit pas, mais vous devez fournir une méthode d'extension, donc je reviens: L'évolutivité est très mauvaise, l'évolutivité est très médiocre et l'évolutivité est très médiocre. J'ai dit les choses importantes trois fois, mais je les ai dit six fois.
Ce qui précède est les défauts de Mybatis qui vous sont présentés par l'éditeur. J'espère que cela vous sera utile!