MyBatisのソースコード解析:BaseBuilder

BaseBuilderソースコード解析

BaseBuilderは各BaseBuilderで、提供さBaseBuilder方法を達成するために使用される抽象クラスですMyBatisのプロファイル、ベースマッパーファイル、パーサクラス、ですが、抽象メソッド宣言、すべてのサブクラスに関連し、属性フィールドではありませんコンストラクタを呼び出すためにバインドされBaseBuilderをインスタンス化し、サブクラスのコンストラクタを使用した場合に、内部BaseBuilderは、3つの属性の設定、TypeAliasRegistry、TypeHandlerRegistryを維持するので、これはです。構成自体は、「寄せ集め」である内部オブジェクトインスタンスの多種多様を維持しています。TypeAliasRegistry、TypeHandlerRegistryは、実際には、二つのうちの一つであるBaseBuilderが設定から取得されたこれら二つの例、MyBatisのプロファイルを作成する場合、なぜ?それを行う、そして時にはプロセッサの別名と型のパラメータをカスタマイズする必要があり、パースプロセスの設定ファイルはバック形状にエイリアスプロセッサをカスタマイズする必要があります。

プロパティとコンストラクタスニペット

   // 構成クラス
  保護 最終構成設定;
   // 型エイリアスレジスタがされている
  保護 最終TypeAliasRegistry typeAliasRegistryを;
   // 型レジスタはれる
  保護 ファイナルTypeHandlerRegistry typeHandlerRegistry; 

  公共BaseBuilder(構成設定){
     この .configuration = 設定;
     // 取得型エイリアスレジストラ
    この .typeAliasRegistryは= この.configuration.getTypeAliasRegistry();
     // レジストラの種類が処理取得
    この .typeHandlerRegistryは= この.configuration.getTypeHandlerRegistryを();
  }

 

BaseBuilderは、より基本的な方法を提供し、ここではいくつかの基本的な方法(コードは単純すぎる、省略)と、より重要な方法があります。

メソッド名 パラメーター名 効果
parseExpression 正規表現、はdefaultValue 式として正規表現オブジェクトを取得し、正規表現式がnullの場合、デフォルト値はdefaultValue
booleanValueOf 値、はdefaultValue ブール値を取得し、それがnullの場合、デフォルト値はdefaultValue
integerValueOf 値、はdefaultValue 整形する値の値は、nullの場合、デフォルト値はdefaultValueを取得します。
stringSetValueOf 値、はdefaultValue 「」によると、値の値を取得し、その値がnullの場合、配列のHashSet、分割され、デフォルト値はdefaultValue
resolveJdbcType エイリアス エイリアスの種類に応じたJDBCクエリデータは、一次包装のMyBatisのjdbcType java.sql.Typesのであり、列挙クラス、詳細情報を閲覧することができorg.apache.ibatis.type.JdbcTypeあります
resolveResultSetType エイリアス エイリアスは、詳細情報の参照org.apache.ibatis.mapping.ResultSetTypeに応じて設定され、対応する結果を得ました。このクラスは、java.sql.ResultSetの3つの値を提供し、java.sql.ResultSetのパッケージです。
ResultSet.TYPE_FORWORD_ONLYカーソル結果セットはスクロールダウンすることができます。
データベースの変更、現在の結果がそのまま設定されたときにResultSet.TYPE_SCROLL_INSENSITIVEカーソル結果セットには、上下に移動することができます。
ResultSet.TYPE_SCROLL_SENSITIVEスクロール可能なリターンの結果セットは、時にデータベースの変更、現在の結果は、同期の変更を設定します。
resolveParameterMode エイリアス エイリアス取得ParameterModeオプションの値、OUT、INOUTは、より多くの情報を参照することができるorg.apache.ibatis.mapping.ParameterModeクラス

二つの重要なBaseBuilderのメソッドCreateInstance(String型の別名)があり、別名オブジェクトインスタンスによるが、resolveTypeHandler(クラス<?> JavaTypeが 、文字列のtypeHandlerAlias) プロセッサの種類やプロセッサの別名Javaクラスのタイプに応じて解析され、初見のcreateInstanceメソッド。

createInstanceメソッドは:別名がnullの場合に基づいて、オブジェクトのインスタンスのエイリアスを作成し、その後、直接NULLオブジェクトを返す、またはクラスは、次のコードに見つかったエイリアスをインスタンス化コールチェーンに係るに係るtypeAliasRegistry BaseBuilderコールresolveAlias下にあり()メソッド。
私は、基本データ型の大規模な数を登録し、その後、typeAliasRegistryを見てorg.apache.ibatis.type.TypeAliasRegistryコンストラクタを見つけることができます、typeAliasRegistryは、構成オブジェクトから直接取得する前に、[構成は、直接TypeAliasRegistryオブジェクトを初期化しました.resolveAlias()メソッド。まずTYPE_ALIASESエイリアスエイリアスに従って対応するクラスを見つけ、対応するクラスを取得するために存在しない組、Resources.classForName(文字列)を登録し、今のみ)にClass.forNameとResources.classForName(の効果を知っている必要が効果は、クラスオブジェクトにクラスに応じてリターンパスのために、同じです。フォローアップは、リソースのオブジェクトを分析します。

1    保護されたオブジェクトのcreateInstance(文字列の別名){
 2      クラスclazz = <?> resolveClass(別名)。
3      であれば(clazz == NULL ){
 4        リターン ヌル5      }
 6      トライ{
 7        リターンresolveClass(別名).newInstance();
8      } キャッチ(例外e){
 9         新しい BuilderException( "エラーインスタンスを作成する原因:" + E、E)を、
10      }
 11    }
 12  
13    保護クラス<?>resolveClass(文字列の別名){
 14      であれば(別名== NULL ){
 15        リターン ヌル16      }
 17      のtry {
 18        リターンresolveAlias(別名)。
19      } キャッチ(例外e){
 20         新しい BuilderException( "エラー解決クラス原因:" + E、E)。
21      }
 22    }
 23の   保護 <?>クラスresolveAlias(文字列の別名){
 24          リターンtypeAliasRegistry.resolveAlias(別名)。
25        }

 

resolveAlias()メソッド

1つの  公共 <T>クラス<T> resolveAlias(文字列){
 2      のtry {
 3        であれば(文字列== NULL ){
 4          リターン ヌル5        }
 6        // 問題#748 
7        文字キー= string.toLowerCase(Locale.ENGLISH)。
8        クラス<T> 値。
9        もし(TYPE_ALIASES.containsKey)(キー){
 10          値=(クラス<T> )TYPE_ALIASES.get(キー)。
11        } {
 12          値=(クラス<T>)Resources.classForName(列)。
13        }
 14        戻り値;
15      } キャッチ(ClassNotFoundExceptionが電子){
 16        スロー 新しい TypeExceptionは( '+文字列+ "型のエイリアスを解決できませんでした":+ "'原因。" E、E)。
17      }
 18    }

 

resolveTypeHandler:プロセッサの種類に対応する別名型を作成するために使用される、同様にエイリアスを持つプロセッサは、最初のエイリアスの種類に応じて、エイリアスレジスタは再度登録処理のタイプに使用される、クラスタイプに対応する別名を見つけるクラスタイプであるか否かはnullを判定するインスタンスが存在しない場合、反射は、それをインスタンス化し、型に対応するクラスのインスタンスを見つけます。以下は、プロセッサのタイプを作成するプロセスの分析です。我々は関係なく、あなたがエイリアスを使用するどのようなタイプの、あってはならない、見ることができます。<エイリアス、クラスタイプ>別名登録血管との間の対応を得るために登録します。型がクラスである場合、エイリアス・レジスタに必要な処理は、マッピング関係のタイプのレジスタ<クラスタイプ、プロセッサインスタンス>です。

  • プロセッサは、次に、直接NULLオブジェクトを返す、またはクラスタイプが既にエイリアスレジスタ容器に登録されている見つけるために、値がnullの場合、エイリアスは、NULL型であるか否かを判定する
  • 見つかったクラス型がnullでなく、TypeHandlerタイプに属していない場合は、例外がスローされますBuilderException
  • 強くTypeHandler型にクラス型を見ると、プロセッサインスタンスのタイプは、クラス型プロセッサに応じて登録されたタイプを検索します
  • プロセッサは、対応するインスタンスの種類を見つけることができない場合、反射がインスタンス。

 

参考資料

おすすめ

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