マスタ(D)動的SQLへのエントリからMyBatisの
ディアンプロフィール
強力な機能の1つは、MyBatisのは、それが動的開発の負荷を軽減、SQL文を継ぐことができ、動的なSQLです。
タグの4種類を、次の動的SQLをMyBatisの
1.もし
2.(そうでない場合は、とき)を選択します
3.トリム(設定)
4. foreachの
二ディアン</場合>
<IF />タグは、予め設定された条件は、SQLステートメントをスプライスするかどうかを決定することによって、if文のJava言語に対応します。前記決意条件は、オブジェクトのメソッドを呼び出すようe.methodとしてongl式、(引数)を説明し、e.propertyアクセスオブジェクトのプロパティ、onglを参照することができ、このブログに
DynamicSqlUserMapper.java
ユーザーselectUserByUserNameAndAge(@Param( "userNameに")文字列userNameに、@Param( "年齢")整数歳);
DynamicSqlUserMapper.xml
< 選択ID = "selectUserByUserNameAndAge" このresultMap = "BaseResultMap" > SELECT * FROMユーザから ここUSER_NAME =#{userNameに} < もしテスト= "年齢!= NULL" > と年齢=#{年齢} </ 場合> </ 選択>
DynamicSqlTests.java
@Test 公共 ボイドifTest(){ // 测试SQL动态もし ユーザーユーザー = dynamicSqlUserMapper.selectUserByUserNameAndAge( "ティム"、NULL ); Assert.assertTrue(ユーザー =!ヌル)。 ユーザー = dynamicSqlUserMapper.selectUserByUserNameAndAge( "ティム"、999 ); Assert.assertTrue(ユーザ == NULL )。 }
水と<選択/>
声明...もしで...他に他の...場合は、Javaに似た</選択>
DynamicSqlUserMapper.java
リスト<ユーザ> selectUserLikeByChoose(@Param( "userNameに")文字列userNameに、@Param( "年齢")整数年齢、@Param( "国")文字列の国)。
DynamicSqlUserMapper.xml
<! - 2.選択した(とき、そうでない場合)类似于、それ以外の場合 - > < 選択のid = "selectUserLikeByChoose" このresultMap = "BaseResultMap" > を選択*ユーザーから のuser_name '$ {userNameに}'のような < 選択> < ときテスト= "年齢!= nullを" > と年齢=#{年齢} </ > < テスト= "国!= nullの" > のように、国'$ {国}' </ とき> <それ以外の場合は> とのuser_id &GT; 10 </ そうでない> </ 選択> </ 選択>
DynamicSqlTests.java
@Test 公共 ボイドchooseTest(){ // テスト動的SQL選択 リスト<ユーザー>ユーザー= dynamicSqlUserMapper.selectUserLikeByChoose( "%T" ,. 11、NULL); //はなお、への制御パラメータの%XX%の、等 SQLSESSION .commit(); Assert.assertTrue(ユーザー!= nullの); Assert.assertTrue(users.size() == 1 ); ユーザー = dynamicSqlUserMapper.selectUserLikeByChoose( "%tの"、ヌル、 "%の状態"); // XX%で、中に制御パラメータの%のように、なお 、sqlSession.commit() Assert.assertTrue(ユーザー!= nullを)。 Assert.assertTrue(users.size() > 1 )。 }
四ディアン<場所/>
タグ内の<どこで/>タグは、条件を満たさない場合、それは不適切なSQLのキーワードを削除するということです。そのような<ここ/>条件が成立しないの内部には、キーワードが追加されませんステッチとして<ここ/> SQLの条件の内部が満たされていない上に、第二の保持、第二の条件声明「と」キーワードを削除してください。<どこで/>と<セット/>実際に<トリム/>特定の実装。
DynamicSqlUserMapper.java
リスト<ユーザ> selectUserLikeByWhere(@Param( "userNameに")文字列userNameに、@Param( "国")文字列の国)。
DynamicSqlUserMapper.xml
<! - - 3(ここで、設定)トリム> <ID = "selectUserLikeByWhere"このresultMap = "BaseResultMap"を選択> を選択 * ユーザーから <場所> < の場合)テスト= "userNameの= nullをしてuserName.trim(! .LENGTH()> 0 "> #{userNameに}様USER_NAME </ 場合 > < 場合(国!= NULLとcountry.trimテスト=")。長さ()> 0" > #{国}などと国 </ もし > </場所> > </選択
DynamicSqlTests.java
@Test 公共 ボイドwhereTest(){ // ここで、要素使用 一覧<ユーザー>ユーザー= dynamicSqlUserMapper.selectUserLikeByWhere( "%T"、 ""); // ユーザからUSER_NAMEのような国のパラメータ空間がフィルタリングされ、選択*を? Assert.assertTrue(!ユーザー= ヌル); Assert.assertTrue(users.size() > 1 ); // ?WHEREのようなユーザーの国からのSELECT *は // 最初はnullで、スプライシングが、二を削除します資格と、再ステッチの後に ユーザーを= dynamicSqlUserMapper.selectUserLikeByWhere(ヌル、 "中国" ); Assert.assertTrue(ユーザー!= nullを)。 Assert.assertTrue(users.size() == 1 ); // SELECT *ユーザーから // キーワードがスプライスされていなかった「」条件はと一致しておらず、SQLをスプライスしません、 ユーザーが= dynamicSqlUserMapper.selectUserLikeByWhere(ヌル、ヌル); Assert.assertTrue(ユーザー!= NULL ); Assert.assertTrue(users.size() == 5 ); }
ファイブディアン<トリム/>
上記により、</>タグは、特定の実装をタグ</トリム>です。接頭辞を追加する前に、タグ内の属性のSQLプレフィックスは、prefixOverridesは値がprefixプロパティ<トリム/>に対応する接頭辞を置き換えるために使用される属性を表します。
また、そこに接尾辞接尾辞プロパティを、suffixOverridesは値を書き換えます。
以下は、私たちが<場所/> </トリム>ラベルに置き換えられます。
DynamicSqlUserMapper.java
リスト<ユーザ> selectUserLikeByTrim(@Param( "userNameに")文字列userNameに、@Param( "国")文字列の国)。
DynamicSqlUserMapper.xml
<! - WHERE交換、カスタムトリム要素法を使用して- > < SELECT ID = "selectUserLikeByTrim" このresultMap = "BaseResultMapを" > ユーザーから* SELECT < トリム接頭辞= "" prefixOverrides | = "OR AND" > <! - 接頭文字が文字対応prefixOverridesを交換し、prefixOverridesスペースが必要である - > < IF テスト= "NULLとuserName.trimのuserName =()の長さ()> 0!" > のuserName位{}のようなUSER_NAME </ IF > < IF テスト=「国!= NULLとcountry.trim()。長さ()> 0" > そして#{国}のような国 </ 場合> </ トリム> </ 選択>
DynamicSqlTests.java
@Test 公共 無効trimTest(){ // トリム要素を使用して、どこで同じ効果を達成するために リスト<ユーザー>ユーザーを= dynamicSqlUserMapper.selectUserLikeByTrim(「%T」、「」); // 国のパラメータ空間は、フィルタリングされます?SELECT *ユーザーからのWHERE USER_NAMEなどの Assert.assertTrue(ユーザー=!ヌル); Assert.assertTrue(users.size() > 1 ); // ?SELECT * WHEREのようなユーザーの国から // 最初はnullで、ステッチ予選2回目を削除し、再ステッチの後になるとき 、ユーザー= dynamicSqlUserMapper.selectUserLikeByTrim(ヌル、「中国」); Assert.assertTrue(ユーザー =!ヌル); Assert.assertTrue(users.size() == 1 ); // ユーザーからのSELECT * // 条件はと一致しておらず、SQLをスプライスしませんが、キーワードがスプライスされていなかった「」 ユーザーを= dynamicSqlUserMapper.selectUserLikeByTrim(ヌル、NULL ); Assert.assertTrue(ユーザー!= NULL ); Assert.assertTrue(users.size() == 5 ); }
シックス・ディアン<foreachの/>
<foreachの/>タグは、コレクション属性コレクションオブジェクトを横断する必要性を示し、for文のjavaを対応するインデックスindex属性は、トラバーサルを示す場合、アイテムのプロパティは、トラバーサル取得したオブジェクトを表し
これは次のように使用されています
DynamicSqlUserMapper.java
リスト<ユーザ> selectUserByUserIdsByForeach(@Param( "ユーザID")一覧<整数>のユーザーID);
DynamicSqlUserMapper.xml
<! - 4. foreachの- > <! - (???、)利用者からのuser_idで*を選択 - > < 選択のid = "selectUserByUserIdsByForeach" このresultMap = "BaseResultMap" > を選択* ユーザーから のuser_idで < foreachのコレクション= "ユーザID" インデックス= "インデックス" 項目= "項目" オープン= "(" 区切り= "" クローズ= ")" > <! - 注意、当コレクションの为マップ时、インデックス为キー、項目为値- > #{項目} </foreachの> </ 選択>
DynamicSqlTests.java
@Test 公共 ボイドforeachTest(){ 一覧 <整数>ユーザID =は、Arrays.asList(1,2,3 )。 // 選択*ユーザーからどこでUSER_ID(?、?、?) 一覧<ユーザー>ユーザー= dynamicSqlUserMapper.selectUserByUserIdsByForeach(ユーザーID); Assert.assertTrue(ユーザー =!ヌル)。 Assert.assertTrue(users.size() == 3 )。 }
教材: