MyBatisのソースコード解析:内部SqlCommandオブジェクトの静的クラスアクションMapperMethod

内部の静的クラスアクションでMapperMethod SqlCommandオブジェクト

 

   MapperMethod初期化では、二つの第一内部静的クラスを初期化し、SqlCommandオブジェクトをするための方法及びクエリタイプ2つのID情報を提供するためにMapperMethodクラス()メソッド、SqlCommandオブジェクトを実行する主体SqlCommandオブジェクトの役割で、それらの一つでありますそうSqlCommandオブジェクトは、クエリの種類と方法のidにそれを取得する方法である、Sqlseesionは異なる方法を実行するでしょうか?どの私はそれを何やりましたか?

  まず、実行シーケンスコンストラクタ内のコードを見てください。クラスコンストラクタは、コンフィギュレーション、マッパーメソッドのクラスおよびインタフェースを通過する必要があります。

  1. メソッドのクラスからメソッドパス名およびクラスを得る方法
  2. 取得されたXMLベースの構成およびインターフェース情報マッパークラスに対応するオブジェクトをMapperStatement
  3. NULLでない場合はNULL場合は、オブジェクトが文がNULLでマッピングされているかどうかを決定する、そしてその後、条件が満たされない場合は、上で実行する方法を決定するために、再び、フラッシュのノートが付いているかどうか、IDとステートメントのSQL型を実行する導き出しますBindingExceptionは例外をスローします。

  このフローチャートは以下のようです:

     

これは、取得対象の実現がresolveMappedStatement()メソッドを呼び出すことによって、ステートメントをマッピングされていることは注目に値します。以下についてを参照してください。

1つの  公共 SqlCommandオブジェクト(コンフィギュレーション設定、クラス<?> MapperInterface、メソッド、メソッド){
 2       // メソッド名を取得
3。         最終列methodNameの= method.getName();
 4       // クラスここで取得する方法
。5          ファイナル <?>クラスdeclaringClass = method.getDeclaringClass();
 6      // マッピング情報文を得る
7。        MappedStatement MS = resolveMappedStatement(mapperInterface、methodNameの、declaringClass、
 8            ;構成)
 9。       // ビューラベルフラッシュ法にマーク次いで場合マップ文オブジェクトがNULLである場合、その場合は、クエリの種類のFLUSHを設定し、それ以外の場合は例外がスローされBindingException表現は、インターフェイス定義を見つけることができません。
10        IF(MS == NULL ){
 11          IF(method.getAnnotation(フラッシュクラス!)= NULL ){
 12は、            名前= NULL ;
 13は            =タイプ; SqlCommandType.FLUSHを
 14          } {
 15             新しい新 BindingException(「無効なバインドステートメント(ません)が見つかりました: "
 16                mapperInterface.getName +()+"「+ methodNameの);
 17          }
 18である       }
 19。       // タイプが不明である場合、マップステートメントオブジェクトが空でない場合、次に指定されたクエリの種類を設定し、直接スローBindingException異常
20       {
 21          名= ms.getId()。
22          種類= ms.getSqlCommandType()。
23          もし(タイプ== SqlCommandType.UNKNOWN){
 24            スロー 新しい BindingException( "のため不明な実行方法:" + 名)。
25          }
 26        }
 27      }

resolveMappedStatement()メソッド

   この方法は、主に、IDとSQL文と同様に、基準と参照情報を提供するために必要とされる、選択、更新、削除、挿入のような、XMLコンフィギュレーションにマップ文オブジェクトを取得し、MappedStatementは、JavaオブジェクトへのXMLマッピングです<プレゼンテーションに専念することになるのフォローアップで、現在の理解にMappedStatementオブジェクトに対応するであろう//>タグを選択します。今、コード実行の流れを簡単に説明。

1. ID番号、クラスパスの形態におけるID番号を実行する文を取得する。メソッド名

2.コンフィギュレーションクラス内のステートメントのIDを見つけることができれば、あなたが見つけることができれば、その後、クラスコンフィギュレーションから直接MappedStatementインスタンスを返し、または見つからない場合は、親クラス・インターフェース、またはNULLから探し続け

3.参照がパス法、直接リターンNULLクラス・インタフェース・パスにある場合

 

1  プライベート MappedStatement resolveMappedStatement(クラス<?> MapperInterface、文字列methodNameの、
 2          級<?> DeclaringClass、構成設定){
 3          // 文IDの形でインターフェースの名前を取得するメソッドの名前
。4        列STATEMENTID mapperInterface.getName =()+ "。 「+ methodNameの;
 5        //は、構成IDの方法が存在するか否かを判断する
6。       IF (configuration.hasStatement(STATEMENTID)){
 7。           // リターンマップ文
8。         リターンconfiguration.getMappedStatement(STATEMENTID);
 9        }
 10        // インタフェース情報である場合どこそういうこと、直接のリターンNULL 
11         IF (mapperInterface.equals(declaringClass)){
 12は         リターン NULL ;
 13である       }
 14        // クラスインターフェイス内のすべての情報を得る
15        のための(クラス<?> スーパ:mapperInterface.getInterfaces()){
 16            //を親インターフェイスから対応するメソッドIDを見つける、または見つける次の文は、再帰的方法を使用して
17。         IF (declaringClass.isAssignableFrom(スーパ)){
 18は            MappedStatement MS = resolveMappedStatement(スーパ、methodNameの、
 19。               declaringClass、構成);
 20は、           IF(!MS = NULL ){
 21              リターンMS。
22            }
 23          }
 24        }
 25        リターン ヌル26      }
 27    }

 

おすすめ

転載: www.cnblogs.com/zhengzuozhanglina/p/11221289.html