MyBatisは、業界で非常に人気のある永続的な層のフレームワークです。軽量で使いやすいです。金融IT分野で完全にリードしています。それは冬眠よりも人気があり、多くの利点があり、また学ぶ価値もあります。しかし、MyBatisは完璧ではなく、独自のデザインとコーディングにはまだ多くの欠点があります。この記事では、これらの欠陥について簡単に説明します。
1.MyBatisは、XML構成ファイルの検証ファイルとしてDTDを使用しますが、DTDがほとんど消去されたテクノロジーであることは明らかです。関数は非常に限られており、スケーラビリティが非常に低く、スケーラビリティが非常に低く、スケーラビリティが非常に低く、読みやすさが低くなっています。春はDTDからXSDに豪華に変わることができますが、Mybatisはこの勇気を持っていませんでした。
2.バージョンの互換性がうまくいかない場合は、例として3.3.0> 3.4.0を取得します。業界の一般仕様によると、2番目のレベルのバージョン番号をアップグレードし、機能を追加できますが、後方互換性を確保する必要があります。ただし、Mybatisのアプローチはまったく同じではありません。準備するためにStatementHandlerの重要な方法を見てください。
// 3.3.0STATEMENT PREPARE(接続接続)SQLEXECTION;
ここにはメソッドは追加されていませんが、パラメーターが元の方法に直接追加されます!同様の例がたくさんあるので、それらを1つずつリストしません。
3. MyBatisプラグインは、@interceptsや@signatureなどの注釈を伴う一般的なインターセプターインターフェイスを使用して、複数のコンポーネントの複数のインターセプト方法を実装します。それは非常に柔軟性があるようです。私の意見では、構造は実際には十分に明確ではありません。実際の開発中に、StatementHandlerとResultEthandlerのインターセプト強化を1つのクラスに配置しますか?それは正しくありません(はい?あなたは単一の責任の原則であり、すべてのたわごとですか?)、なぜ同じインターフェイスを強制する必要があるのですか?
さらに、@Signature Annotationを使用して、傍受する必要があるコンポーネントメソッドを指定します。注釈が間違っている場合、コンパイルはエラーを報告しません。それが実行されるまで待つことができます。上記の例を見てみましょう。
バージョン3.3.0のプラグインを実装したとします。
@intercepts({@signature(type = statementhandler.class、method = "prepare"、args = {connection.class})})public class handlerInterceptor Interceptor {@overridepublicオブジェクトインターセプト(@overridepublicオブジェクトインターセプト(呼び出し) this);}@overridepublic void setProperties(プロパティプロパティ){}}その後、3.4.0にアップグレードされました。その結果、コンピレーションは正常でしたが、実行されたとき、例外がスローされました。
4. MyBatisのキャッシュは単純に役に立たず、構成があるかどうかに関係なく、キャッシュを使用するか、キャッシュを更新する必要があります。CacheKeyを計算する必要があります。キャッシュがない場合、またはキャッシュを更新しない場合、この計算は無駄です。
5。MyBatisのバッチ実行については、次のJDBCの例を参照してください。
public void testjdbcbatch(connection conn)スロー例外{try {conn.setautocommit(false); batchupdate(conn); cleartestdata(conn); conn.commit(); conn.setautocommit(true);} catch(例外E){conn.rollback( {preatedstatement 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); e){}}} private void batchupdate(connection conn)throws sqlexception {preatedstatement ps = null; try {string sql = "table_name2(field_name1、field_name2、field_name2)vatule(?、????"; ps = conn.preparestement(sql) Random = randomsstringutils.randomalphabetic(8); ps.setstring(1、 "test"); // field_name1ps.setString(2、 "data" + random); // field_name2ps.setString(3、 "parameter" + random);最後に{try {ps.close();} catch(例外e){}}}コードには不一致の感覚がなく、通常実行でき、予想どおりロールバックすることもできます。つまり、同じトランザクションで同じ接続が同時に通常のSQLとバッチを実行できますが、同じトランザクションのSQLSessionで試してみてください。フィードバックは、同じトランザクションで実行方法を切り替えることができないことです。
6.データベース製品の互換性:MyBatisはSQLの制御を開発者に引き渡したので、それは道徳的に指揮官の高さを占領しました - あなたが書いたものは互換性がありません、それはあなた自身のレベルです!しかし、これは本当に良いフレームに適したポーズですか?補助互換性のある実装を提供できないのはなぜですか?たとえば、オラクルの神と見なされるデコード関数の場合、sqlmapperに<decode>タグを提供し、後でケースに黙って変更できますか?言い換えれば、役人がそれを提供していないかどうかは関係ありませんが、拡張方法を提供する必要があるので、私は戻ってきます:スケーラビリティは非常に貧弱で、スケーラビリティは非常に低く、スケーラビリティは非常に低いです。私は重要なことを3回言ったが、私はそれらを6回言った。
上記は、編集者によって紹介されたMyBatisの欠陥です。それがあなたに役立つことを願っています!