内部の静的クラスアクションでMapperMethod SqlCommandオブジェクト
MapperMethod初期化では、二つの第一内部静的クラスを初期化し、SqlCommandオブジェクトをするための方法及びクエリタイプ2つのID情報を提供するためにMapperMethodクラス()メソッド、SqlCommandオブジェクトを実行する主体SqlCommandオブジェクトの役割で、それらの一つでありますそうSqlCommandオブジェクトは、クエリの種類と方法のidにそれを取得する方法である、Sqlseesionは異なる方法を実行するでしょうか?どの私はそれを何やりましたか?
まず、実行シーケンスコンストラクタ内のコードを見てください。クラスコンストラクタは、コンフィギュレーション、マッパーメソッドのクラスおよびインタフェースを通過する必要があります。
- メソッドのクラスからメソッドパス名およびクラスを得る方法
- 取得されたXMLベースの構成およびインターフェース情報マッパークラスに対応するオブジェクトをMapperStatement
- 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 }