パラメータや処理のMyBatisのパラメータ値
図1に示すように、単一のパラメータ
-
何の治療をMyBatisのありません
-
バリューの方法:
#{パラメータ名/任意の名前}
<! - 社員getEmpById(整数のID); - > < 選択ID = "getEmpById" resultTypeと= "com.mxc.bean.Employee" > SELECT * FROM従業員からID =#{ID} </ 選択>
図2に示すように、複数のパラメータ
-
MyBatisのは自動的にマッピングする複数のパラメータとしてパッケージ化されます
キー:PARAM1は、...、paramNのは、0、...、N-1であってもよい(すなわち、パラメータインデックス、Nはパラメータの数です)
値:パラメータ値
-
バリューの方法:
上記キー} {#
<! - 社員getEmpByIdAndLastName(整数ID、文字列lastNameの); - > < 選択ID = "getEmpByIdAndLastName" resultTypeと= "com.mxc.bean.Employee" > SELECT * FROM従業員からここID =#{PARAM1}とLAST_NAME =#{PARAM2} </ 選択>
複数のパラメータのためのクリアキーを割り当てます
-
@Param
注釈キーは、SQLで簡単にアクセスするためのパラメータ値を明示的なパラメータを指定することもできます -
バリューの方法:
#{@ Paramの注釈指定されたキー}
<! - 社員getEmpByIdAndLastName(@Param( "ID")整数ID、@Param( "lastNameの")文字列lastNameの); - > < 選択ID = "getEmpByIdAndLastName" resultTypeと= "com.mxc.bean.Employee" > SELECT * FROM従業員からここID =#{ID}とLAST_NAME =#{lastNameの} </ 選択>
ロングパッケージキー@Paramの使用を指定するために使用されるパラメータの値を取るために、簡単なパラメータマップをカプセル化
3、パラメータはPOJOです
-
複数のパラメータが正確であればPOJO属性値は、POJOに直接であってもよいです
-
バリューの方法:
属性名} {#
<! - 社員getEmpByIdAndLastName(従業員EMP)。 - > < 選択ID = "getEmpByIdAndLastName" resultTypeと= "com.mxc.bean.Employee" > SELECT * FROM従業員からここID =#{ID}とLAST_NAME =#{lastNameの} </ 選択>
4、引数が地図であります
-
パラメータはPOJO特性のうちの一つでない場合は、マップとしてパッケージ化することができます
-
バリューの方法:
#{地図的キー}
<! - 社員getEmpByIdAndLastName(地図<文字列、オブジェクト>マップ); マップ: 地図<文字列、オブジェクト>マップ=新しいHashMapの<>(); map.put( "ID"、1); map.put( "lastNameの"、 "MXC")。 - > < 選択ID = "getEmpByIdAndLastName" resultTypeと= "com.mxc.bean.Employee" > SELECT * FROM従業員からここID =#{ID}とLAST_NAME =#{lastNameの} </ 選択>
小規模チョッパー
従業員getEmp(@Param( "ID")、整数ID、文字列lastNameの)。
//取值:ID =>#{ID / PARAM1}とLastName =>#{PARAM2}
従業getEmp(整数ID、@ Paramで( "E")従業員EMP)。
//取值:ID =>#{PARAM1}とLastName =>#{param2.lastName / e.lastName}
$#{} {}との類似点と相違点
と同じ:
値は、マップオブジェクトのプロパティ値またはPOJOで得ることができます
異なります:
#は{}:プリコンパイルされた形態であり、SQLステートメントにパラメータを設定し、SQLインジェクションを防止することができる
$ {}は:採取値が直接SQL文の組み立て、安全問題が存在することになる
利用シーン
ほとんどの場合、#{}を使用してパラメータの値をとります。{} $は、ネイティブJDBCのプレースホルダをサポートしていない場所で使用することができます。今年テーブルクエリによってとして:$ {年} _salaryから選択*;
第二に、ソース処理パラメータは、MyBatisのを達成するために
図1に示すように、内部データ構造
パッケージcom.spring.test.service.mybatis; インポートorg.apache.ibatis.builder.ParameterExpression; / ** * * / パブリック クラスparamHandler { 公共 静的 ボイドメイン(文字列[]引数){ paramsTokenHandler(); } / * * *メソッド名:リスト<ユーザ> queryList(文字列名、RowBoundsのRowBounds、int型の年齢、@Param( "アドレス")文字列addresss); *内部パラメータマッピング: * MethodSignature.SortedMap <整数、文字列>のparams *パラメータリスト添字- >パラメータ名(それが@Paramある場合、それは値のノートを示し、ランキングRowBoundsに加えて、パラメータのそうでなければ現在の数、パラメータリストのResultHandler) *> 0 0- * 2-> 1 * 3->アドレス * * MethodSignature.convertArgsToSqlCommandParam(オブジェクト[] argsが)戻り値:paramMap * * paramMap内部メモリ次のように: *パラメータ名- >パラメータ添字 * 0->名前値 * 1 - >年齢値 *値のアドレス- > addresss * * param1->名前値 * param2->年齢値 の値* param3-> addresss * * / パブリック 静的 ボイドparamsToParamMap(){ } / ** #{checkedTime、jdbcType = BIGINT:*例 、typeHandler = COM。 } meituan.payment.fundsgateway.core.model.handler.DateForLongTypeHandler * / パブリック 静的 ボイドparamsTokenHandler(){ 文字列トークン = "checkedTime、jdbcType = BIGINT、typeHandler = com.meituan.payment.fundsgateway.core.model.handler.DateForLongTypeHandler" 。 ParameterExpression parameterExpression = 新しいParameterExpression(トークン)。 文字列名 = parameterExpression.get( "プロパティ" ); System.out.println(名); ストリングjdbcType = parameterExpression.get( "jdbcType" )。 System.out.println(jdbcType)。 ストリングtypeHandler = parameterExpression.get( "typeHandler" )。 System.out.println(typeHandler)。 } }
2、特殊なデータ構造とアルゴリズム関与
org.apache.ibatis.scripting.defaults.DefaultParameterHandler
=> SQLはSQLステートメントに提供、引数リストから、指定された値を取得ParameterMappingをループすることで解決?プレースホルダ。
org.apache.ibatis.reflection.MetaObject
=>パラメータリストのメタオブジェクトにパッケージングする方法は、均一なパラメータ値を得る方法を提供します
org.apache.ibatis.reflection.property.PropertyTokenizer
=> propertyNameのメタオブジェクト位{PropertyName意味}プレースホルダは、SQLステートメントのSQLステートメントに応じて取得しましたか?値。
org.apache.ibatis.builder.SqlSourceBuilder
org.apache.ibatis.builder.ParameterMappingTokenHandler
org.apache.ibatis.parsing.GenericTokenParser
org.apache.ibatis.builder.ParameterExpression
=> {}#でSQL文を置き換えますか?、リストを解析<ParameterMapping>