動的SQL文の理解の深いMyBatisの

時々、静的SQLステートメントとアプリケーションのニーズを満たすことができません。私たちは、いくつかの条件に動的に構築SQL文をベースとすることができます。

たとえば、Webアプリケーションでは、いくつかの検索インターフェースがあるかもしれない、あなたは、1つまたは複数のオプションを入力し、その後、あなたが選択したこれらの条件で検索操作を実行する必要があります。我々は、動的SQLステートメントを構築するためにユーザーが選択した条件に応じて、必要な場合があります。ユーザーはこれらの条件のいずれかを提供している場合、我々は、SQL文のWHERE句に条件を追加する必要があります。

次の表に基づいて、自分のクラスを構築します!

タグが埋め込まれたSQLの断片の条件で使用されている<場合>条件が真の場合1は、対応するSQLフラグメントは、SQL文に追加されます。
 たとえば:
 あなたはコースの検索インターフェイスを持っていると仮定し、設定講師(チューター)ドロップダウンリストボックスで、コース名(CourseName)テキスト入力ボックス、開始時間(開始日)入力ボックス、入力ボックスの終了時刻(終了日)、検索条件として。コース講師は他のものはオプションで、ドロップダウンリストで選択されているものとします。ユーザーが検索ボタンをクリックすると、あなたは、修飾されたデータの一覧を表示する必要があります。

次のように、マッピングファイルを対応するSQL:

<! -独立的コース封装映射- >
<このresultMapタイプは= "コース" ID = "CourseResult">
<id列= "Course_IDに"プロパティ= "courseId" />
<結果列= "name"プロパティ= "名前"/>
<結果カラム="説明」プロパティ= "説明" />
<結果列= "START_DATE"プロパティ= "たstartDate" />
<結果カラム= "END_DATE"プロパティ= "endDateに" />
</このresultMap>

 

<! -查询コース的、语句選択里面加入了条件判断する場合- >
<IDを選択= "searchCourses"のParameterType = "マップ"このresultMap = "CourseResult">
コースSELECT * FROM
TUTOR_ID =#{} tutorId
場合<テスト= "courseName!= NULL">
とName LIKE#{courseName}
</>場合
<試験= "たstartDate!= NULL"であれば>
AND START_DATE> =#{たstartDate}
</ IF>
<テスト= "endDateになら! = NULL ">
AND END_DATE <![CDATA [<=]]>#{endDateに}
</ IF>
</選択>

マッピングインターフェイス:

パブリックインターフェースDynamicSqlMapper {
リスト<コース> searchCourses(地図の<string、オブジェクト>マップ)
}

試験方法:

@Test
公共ボイドtest_searchCourses1(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

LOCALDATE日= LocalDate.of(2019、1、10)。
map.put( "たstartDate"、日付)。

一覧<コース>コース= mapper.searchCourses(マップ);

courses.forEach(のSystem.out ::のprintln)。

}キャッチ(例外e){
e.printStackTrace();
}
}

それ以外の条件とは2.choose、
 時には、クエリは、クエリ機能・ベースのカテゴリーです。まず、講師やコース名クエリでクエリを選択するユーザーのニーズ、またはクエリの開始時刻。その後、選択したカテゴリクエリがパラメータ、その後、クエリを入力します。

たとえば、ページがドロップダウンリストがあり、カテゴリクエリを選択し、クエリがリストを選択し、照会後というように時間に応じて、クエリに基づいてコース名、講師に応じて選択することができ、その後、検索するキーワードを入力してください。

MyBatisのタグがクエリ処理のこのタイプをサポートすることができます。<選択>提供します。ユーザーが選択しない場合、デフォルトは現在の時刻に応じて照会できることを前提としています。

次のように、マッピングファイルを対応するSQL:

<SELECT ID = "searchCoursesは"のParameterType = "マップ"このresultMap = "CourseResultは">
コースSELECT * FROM
<選択>
<テスト= "searchBy == 'チューター'">
WHERE TUTOR_ID =#{tutorId}
</>
<場合テスト= "searchBy == 'courseName'">
#{courseName}のような名前は、
</場合>
<さもなければ>
WHERE START_DATE> = SYSDATE
</さもなければ>
</>選択
</選択>

試験方法:

@Test
公共ボイドtest_searchCourses2(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

地図<文字列、オブジェクト>マップ=新しいHashMapの<文字列、オブジェクト>();
// map.put( "searchBy"、 "家庭教師");
// map.put( "tutorId"、1);
map.put( "searchBy"、 "CourseName");
map.put( "courseName"、 "%のMyBatisのの%");

一覧<コース>コース= mapper.searchCourses(マップ);

courses.forEach(のSystem.out ::のprintln)。

}キャッチ(例外e){
e.printStackTrace();
}
}

MyBatisの計算<選択>値条件、および使用は、最初の句はTRUEです。何の条件が真でない場合は、<それ以外>で句。

3.Where条件
 時には、クエリのすべてはオプションでなければなりません。少なくとも一つのクエリを使用する必要がある場合は、あなたが直接WHERE句を使用することができます。
複数の条件がある場合は、我々は、ANDやOR基準に追加する必要があります。MyBatisのは、動的SQLステートメントのこのタイプをサポートするために、<場所>要素を提供します。

例えば、クエリインタフェースもちろん、クエリのすべてが任意であると仮定。

注、<どこ>条件文は、文はラベル内の内容を返す、動的に挿入された場合にのみ、要素。
 ANDとOR、ANDやOR初めのが削除されますし、、WHERE句が開始した場合。

マッピングファイル:

<SELECT ID = "searchCourses"のParameterType = "マップ"このresultMap = "CourseResult">
SELECT * FROMコース
<>
<もしテスト= "tutorId!= NULL">
TUTOR_ID =#{tutorId}
</ IF>
<試験もし= "courseName!= nullの">
と#{courseName}のような名前
</>の場合
<テスト= "たstartDate!= null"の場合>
とSTART_DATE> =#{たstartDate}
</ IF>
</場所>
</ select>の

試験方法:

@Test
公共ボイドtest_searchCourses3(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

地図<文字列、オブジェクト>マップ=新しいHashMapの<文字列、オブジェクト>();
//map.put("tutorId」、1);
//map.put("courseName」、 "するJavaSE");
//map.put("startDate」、LocalDate.of(2019、1、10))。

一覧<コース>コース= mapper.searchCourses(マップ);

courses.forEach(のSystem.out ::のprintln)。

}キャッチ(例外e){
e.printStackTrace();
}
}

4. <トリム>条件
<トリム>要素など、<>要素、接頭辞/接尾辞の除去又は接頭辞/接尾辞機能を追加提供<トリム>。

マッピングファイル:

<選択し、ID = "searchCourses"のParameterType =このresultMap = "CourseResult"を"マップ">
コースSELECT * FROM
<トリム接頭辞= "" suffixOverrides = "と">
<もしテスト= "tutorId!= nullの">
TUTOR_ID =#{ tutorId}と
</ IF>
<もしテスト= "courseName!= nullの">
#{courseName}のような名前と
</場合>
</トリム>
</ select>の

直接クエリ確立されていない場合は文、INSERT、それが削除されますセットアップがある場合に接頭辞が示す
サフィックスが逆接尾辞や接頭辞を表現するには

suffixOverrides =「と」最後に生成されたSQL文と複数の場合には、自動的に削除されることを示している。
prefixOverridesプレフィックス処理手段、及び対向suffixOverridesを

試験方法:

@Test
公共ボイドtest_searchCourses4(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

地図<文字列、オブジェクト>マップ=新しいHashMapの<文字列、オブジェクト>();
// map.put( "tutorId"、1);
// map.put( "courseName"、 "するJavaSE");

一覧<コース>コース= mapper.searchCourses(マップ);

courses.forEach(のSystem.out ::のprintln)。

}キャッチ(例外e){
e.printStackTrace();
}
}

5.foreachサイクルは、
 もう1つの強力な動的SQL文の構造タグは、<foreachの>です。これは、AND / OR句またはIN条件設定されたリストや配列、を反復処理することができます。

1,3,6インストラクターがコースを教えたとして、我々は、<foreachの>マップへの文のリストのtutor_idし、リストが横断される構築物の動的にSQLを渡すことができ、クエリtutor_idと仮定する。

マッピングファイル:

<選択し、ID = "searchCoursesByTutors"のParameterType = "マップ"このresultMap = "CourseResult">
コースSELECT * FROM
<テスト=であれば"tutorIds =ヌルを!">
<どこ>
<! -在这里的tutorId指的是集合中存入准备查询的tutor_id - >
<foreachのアイテム= "tutorId"コレクション= "tutorIds">
OR tutor_id =#{tutorId}
</ foreachの>
</>
</ IF>
</選択>

マッピングインターフェイス:

パブリックインターフェースDynamicSqlMapper {
リスト<コース> searchCoursesByTutors(地図の<string、オブジェクト>マップ)
}

試験方法:

@Test
公共ボイドtest_searchCoursesByTutors(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

地図<文字列、オブジェクト>マップ=新しいHashMapの<文字列、オブジェクト>();

一覧<整数> tutorIds =新しいのArrayList <Integer型>();
tutorIds.add(1)。
tutorIds.add(3)。
tutorIds.add(6)。

map.put( "tutorIds"、tutorIds)。

一覧<コース>コース= mapper.searchCoursesByTutors(マップ);

courses.forEach(のSystem.out ::のprintln)。

}キャッチ(例外e){
e.printStackTrace();
}
}

そして、<foreachの>で生成された句を使用して、上記と同じ機能:

<選択し、ID = "searchCoursesByTutorsは"のParameterType = "マップ"このresultMap = "CourseResult">
コースSELECT * FROM
<もしテスト= "tutorIds!= nullの">
<>
tutor_id、IN
<foreachの項目= "tempValue"コレクション= "tutorIdsを"オープン= "("セパレータ= "" =クローズ")">
#{tempValue}
</ foreachの>
</>
</ IF>が
</選択>

試験方法は変わりません。

UPDATE更新に6.set条件の特定

<セット>同様の要素と<>要素が、更新だけ更新文のために使用される要素のセット。

<更新ID = "updateStudent"のParameterType = "学生">
更新の学生
<セット>
<もしテスト= "名前!= nullの">名前=#{名前}、</ IF>
<テスト= "メール!= null"の場合>電子メール=#{メール} </ IF>
<もしテスト= "電話!= NULL">電話=#{電話} </ IF>
</ SET>
stud_id =#{studId}
</更新>

条件は任意のテキストを返す<場合>、<セット>は、キーワードを挿入して、そのテキストの内容を設定しますならばここで、コンマの最後に削除されます「」

試験方法:

@Test
公共ボイドtest_updateStudent(){

SQLSESSION SQLSESSION = NULL;
試す{
SQLSESSION = MyBatisSqlSessionFactory.openSession()。

DynamicSqlMapperマッパー= sqlSession.getMapper(DynamicSqlMapper.class)。

mapper.updateStudent(学生)。

sqlSession.commit();

}キャッチ(例外e){
e.printStackTrace();
}
}

おすすめ

転載: www.linuxidc.com/Linux/2019-11/161478.htm