はじめに:MyBatisとは何ですか?
(以前のIBATIS)MyBatisは、SQL、ストアドプロシージャ、および高度なマッピングをカスタマイズできるPersistenceレイヤーフレームワークです。 MyBatisは、ほぼすべてのJDBCコードとパラメーターの手動設定と結果セットの取得を排除します。 MyBatisは、構成とオリジナルマッピング、マッピングインターフェイス、JavaのPOJO(プレーンオールドJavaオブジェクト)に、データベース内のレコードに簡単なXMLまたはアノテーションを使用できます。
1.マッパーレイヤーパラメーターはマップであり、サービスレイヤーはオーバーロードを担当します。
メカニズムの問題により、マップを過負荷にすることはできません。パラメーターは通常マッピングするように設定されていますが、これによりパラメーターがぼやけます。コードを明確にしたい場合は、サービスレイヤーを介してオーバーロードする目的を達成できます。外側に提供されるサービスレイヤーは過負荷ですが、これらの過負荷のサービス方法は実際に同じマッパーを調整するためですが、対応するパラメーターは一貫していません。
多分何人かの人々は疑問に思うかもしれません、なぜそれをサービスレイヤーにマッピングするように設定してみませんか?私は個人的にこれをお勧めしません。私は以前のプロジェクトでこの方法を便利に採用しましたが、将来のメンテナンス作業に問題を引き起こすことは明らかです。これを行うと、MVC全体がマップモデルに依存するようになるためです。このモデルは実際にはフレームワークを構築するのに非常に優れており、便利ですが、問題があります。メソッドの署名を見るだけで、マップで表される各パラメーターの数、タイプ、および意味がわかりません。
サービスレイヤーまたはDAOレイヤーのみを変更する場合、プロセス全体でマップで渡されるパラメーターについて明確にする必要があると想像してください。コメントしたり、良いドキュメントを持っていない限り、どのパラメーターが渡されるかを知る前に、各レイヤーのコードを明確に理解する必要があります。単純なMVCの場合、それは問題ありませんが、レベルが複雑な場合、コードは非常に複雑になり、パラメーターを追加すると、各レイヤーのコメントを追加する必要があります。コメントと比較して、コメントが時代遅れになる可能性があるため、メソッドシグネチャを使用してこのコードの制御可能性を確保することがより実現可能ですが、メソッドシグネチャは一般に古くなる可能性は低いです。
2。メンテナンスの難しさを軽減するために、選択肢やその他のステートメントができる限り少ない場合は、使用してください。
MyBatisでSQLを構成するときは、選択した場合などのより少ないラベルを使用するようにしてください。 SQLを使用して判断を決定できる場合は、後でメンテナンスするためにSQL(ケース、デコードなど)を使用してみてください。それ以外の場合、SQLが膨らんだら、それは非常に吐き気がします。 MyBatisでSQLをデバッグする必要がある場合は、多数の判断ステートメントを削除する必要があります。これは非常に厄介です。一方、多数のIF判断により、生成されたSQLに多数のスペースが含まれているため、ネットワーク伝送時間が増加しますが、これも望ましくありません。
さらに、多数の選択されたステートメント、必然的に、生成されたSQLは毎回一貫していないため、Oracleの多数のハード解析につながりますが、これもお勧めできません。
このようなSQLを見てみましょう:
<code style = "padding:0.5em; margin:0px; display:block; color:rgb(101,123,131); overflow-x:auto; background:rgb(253,246,227)"> <span style = "padding:0px; margin:0px"> <padding:0px; margin:0px; spand "色:rgb(133,153,0) "</span> *"パディング:0px; style = "パディング:0px;マージン:0px; color:rgb(42,161,152)"> 1 </span> = <span style = "padding:0px; margin:0px; color:rgb(42,161,152)"> 1 </span> <<span> <<padding:0px; margin:0px; marid;色:rgb(133,153,0) "> 1 <<span style ="パディング:0px; style = "パディング:0px;マージン:0px; color:rgb(42,161,152)"> "startdate!= null and startdate!= '' and null and endate!= ''" </span> <span style = "パディング:0px;マージン:0px; #{startdate} <span style = "パディング:0px;マージン:0px;色:RGB(133,153,0) ">および</ span> publishtime <=#{enddate} </ <span style ="パディング:0px;マージン:0px;色:RGB(133,153,0) "> if </span> <spant> <span style ="パディング:0px;マージン:0px;色:RGB(133,153,0) ">および</span> publishtime> = <span style ="パディング:0px;マージン:0px;色:RGB(133,153,0) "> sysdate </span> - <span style ="パディング:0px;マージン:0px;色:RGB(42,161,152) "> 7 </span> <span style ="パディング:0px;マージン:0px;色:RGB(133,153,0) ">および</span> publishtime <= <span style ="パディング:0px;マージン:0px;色:rgb(133,153,0) "> sysdate </span> </sid> </<span style =" padding:0px;マージン:0px;色:rgb(133,153,0) "> sysdate </span> </sid> </<span style =" padding:0px;マージン:0px;色:RGB(133,153,0) "> </span>> </span>を選択しますそのような判断が実際に完全に不要な場合。デコードを使用して、デフォルト値の問題を解決することができます。
<code style = "padding:0.5em; margin:0px; display:block; color:rgb(101,123,131); overflow-x:auto; background:rgb(253,246,227)"> <span style = "padding:0px; margin:0px"> <padding:0px; margin:0px; spand "色:rgb(133,153,0) "</span> * <パディング:0px; style = "パディング:0px;マージン:0px; color:rgb(133,153,0)"> decode </span>(#{startdate}、<span style = "padding:0px; margin:0px"> null </span>、<span style = "パディング:0px;マージン:0px;色:rgb(133,153,0) "> sysdate </span style ="パディング:0px; PublishTime <= <SPANSTYLE = "PADDING:0PX; MARGIN:0PX; COLOR:RGB(133,153,0)"> DECODE </SPAN>(#{endDate}、<Span Style = "パディング:0PX; style = "パディング:0px;マージン:0px;マージン:0px;色:RGB(133,153,0) "> sysdate </span>、#{enddate})</span> </code>もちろん、一部の人々は、時期とデコードの場合にケースを導入するにはOracle機能解析が必要であると考えるかもしれません。これにより、SQL実行時間が遅くなります。興味のある学生は、大きな影響があるかどうかを確認するために戻ってテストを行うことができます。個人的な経験に関する限り、機能解析のためにSQLの減速は見つかりませんでした。一般に、Join、Order、Order、明確な、別個のパートテーションなどの操作。これらは一般にテーブル構造の設計に密接に関連しています。これらの効率の影響の程度と比較して、SQL実行速度に対する関数解析の影響は無視できるはずです。
もう1つのポイントは、上記のSQLのような一部のデフォルト値の割り当てで、デフォルトで現在の日付などになることです。実際に、処理用のサービスレイヤーまたはコントローラーレイヤーを完全に言及できることです。これらの判断は、MyBatisでは使用する必要がありません。この場合、処理をキャッシュすることは困難だからです。 StartDateが空で、SQLで動的sysdateを使用している場合、Cache StartDate日付のキーがどうあるべきかを判断することは不可能です。したがって、mybatisに渡される前にパラメーターを処理することをお勧めします。これにより、マイバティス層も選択した場合の一部を減らすことができます。また、キャッシュ処理にも便利です。
もちろん、選択しても使用しないことは絶対的ではありません。時々、SQLを最適化するために、類似のステートメントなど、解決する必要がある場合。もちろん、一般的には推奨されていません。ただし、使用するシナリオがある場合は、クエリ効率を改善するために記事のタイトルを照会するなど、使用する必要がない場合のように削除します。最良の方法は、Lucenceなどの検索エンジンを使用して、フルテキストインデックスのこの問題を解決することです。
一般に、支部を判断することを選択することは完全に削除することは不可能ですが、判断ブランチの維持が複雑すぎて維持が困難であるため、Mybatisに完全に頼って動的分岐の判断を完了するのではなく、SQLネイティブ方法を使用して動的な問題を解決することをお勧めします。
3. sqlコメントをXMLコメントに置き換えます。
MyBatis Central SQLのコメントを保持しないようにしてください。コメントはいくつかの問題を引き起こします。コメントを使用する必要がある場合は、xmlで<! - - >を使用して注釈を付けて、生成されたSQLにSQLアノテーションがないことを確認して、問題の可能性を減らすことができます。これを行うもう1つの利点は、IDEのSQLとの注釈を明確に区別できることです。
それでは、コメントによって引き起こされた問題について話しましょう。私が取り組んでいるプロジェクトでは、ページネーションコンポーネントはMyBatisに基づいています。レコードの総数を計算するために作成したSQLスクリプトの外側から(.........)からselect count(*)rotownum_の別のレイヤーを配置します。同時に、Rownum> 10とRonnum <10 * 2からページング情報を生成する別のネストされたselect * from(...)があります。スクリプトの最後の行にコメントがある場合、追加の部分はコメントの一部になり、エラーが報告されます。さらに、いくつかの条件は、以下など、いくつかの条件を無視する可能性もあります。
<code style = "padding:0.5em; margin:0px; display:block; color:rgb(101,123,131); overflow-x:auto; background:rgb(253,246,227)"> <span style = "padding:0px; color:0px; span(133,153,0)" </>> style = "パディング:0px;マージン:0px; color:rgb(133,153,0)"> from </span> test <span style = "padding:0px; color:rgb(133,153,0)"> where </span> col1> <span style = "パディング:0px;マージン:0px;色:RGB(42,161,152) "> 1 < != '"</span style ="パディング:0px; '"</span> <padding:0px(133,153,0)"> </span style = "パディング:0px;マージン:0px "> if </span >> </span> </code>
合格したパラメーターに対応するパラメーターがある場合でも、実際には完全にコメントされているため、実際には効果はありません。この種のエラーは、厳密なテストなしで検出するのが困難です。一般的に言えば、XMLコメントはSQLコメントを完全に置き換えることができるため、この動作は禁止されるはずです。
4。$ {}ではなく、可能な限り#{}を使用します。
mybatisで$ {}を使用しないようにしてください。これを行うのは非常に便利です。ただし、大量の使用がOracleのハード解析を引き起こし、データベースのパフォーマンスが低下するという問題があります。データベースのパフォーマンスが長ければ長いほど、データベースのパフォーマンスが悪化します。複数の文字列INSの一般的な処理については、次のソリューションを参照できます。http://www.myexception.cn/sql/849573.htmlは、基本的に$ {}のほとんどを解決できます。
$ {}については、別の誤用が似ています。ここには別のケースがあります。たとえば、いくつかのツリーメニュー、ノードは「01」、「0101」として設計され、2ビットノードは階層を区別するために使用されます。この時点で、ノード01のすべてのノードを照会する必要がある場合、最も単純なSQLは次のとおりです。選択 *からidが'01% 'のようなツリーから。この種のSQLは、インデックスを使用できるため、実際には理解できます。そのため、特別な処理を必要とせず、直接使用するだけです。しかし、それが記事のタイトルである場合、特に注意を払う必要があります。[osc%]のようなタイトルから * from t_news_textを選択する必要があります。これはインデックスを使用する方法ではありません。上記のように、全文検索を使用することをお勧めします。ただし、いいねなしでできない場合は、使用方法に注意を払う必要があります。IDのような#{id} || 「$ {id}%」のようなidの代わりに「%」は、ハード解析の可能性を減らします。
一部の人々は、||を使用していると考えていますOracle Processingの時間が増えます。オラクルをあまりにも愚かにしないでください。時々それは本当に愚かですが、時間があるときにゴミではなく愚かなものを要約することができますが、少しテストした後、この接続方法はSQL全体の解析と実行のために非常にスリムでなければならないことがわかります。
もちろん、列名、テーブル名などの動的注入など、処理できない特別なケースがいくつかあります。これらの状況では、それは難しく、これ以上便利な手段は見つかりません。この状況は発生する可能性が低いため、$ {}を使用すると大きな影響はありません。もちろん、コードの罹患率がある場合は、$ {}の可能性を完全に回避できるように、Oracleの動的SQL実行メカニズムを即時実行することができます。これにより、より複雑なモデルが導入され、現時点では選択する必要があります。
上記の動的なSQLによって引き起こされる問題に応じて、最も根本的な方法は、ストアドプロシージャを使用して、開発とデバッグを容易にするためにデータベースネイティブの方法でそれらを解決することです。もちろん、それは問題をもたらします。開発者にとってより高い要件、ストアドプロシージャの管理などがあります。私のプロジェクトはこの方法を採用していないので、ここでこれ以上拡大しません。
5。mybatisの簡単な使用。
MyBatisの機能は比較的弱く、必要な補助ライブラリ、文字列処理などが多くないため、拡張することも困難であるため、一般的にいくつかのリターンを処理することができます。したがって、単純なSQL構成ファイルおよび単純なORMフレームワークとして使用することをお勧めします。 MyBatisであまりにも多くのダイナミックSQLを実行しようとしないでください。そうしないと、その後のメンテナンスは非常に嫌です。
上記は、編集者が紹介したMyBatis学習の要約です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!