Mybatis での動的 SQL ステートメント分析

Mybatis での動的 SQL ステートメント分析

この記事は主にMybatisでの動的SQL文の解析について紹介します。この記事のサンプルコードは非常に詳細で、皆さんの勉強や仕事に一定の参考値があります。困っている友人は参考にしてください。

Mybatis で SQL を構成する方法は 2 つあります。1 つは XML を使用する方法、もう 1 つはアノテーションを使用する方法です。

Mybatis はアノテーションを使用して SQL を構成しますが、構成機能が限られており、複雑な SQL の読みやすさが悪いため、ほとんど使用されません。

Mybatis は XML 構成方式を頻繁に使用します。いくつかの簡単な XML 要素を使用して、動的 SQL の機能を完成させることができます。Mybatis のマッピング XML では、多数の判断を構成できるため、実装に大量のコードを必要とする多くの機能を実現できます。これにより、コードの量が大幅に削減され、Mybatis の柔軟性、高い構成可能性、保守性が反映されます。

要素効果述べる
もし決定声明単一条件分岐判定
選択(場合、それ以外の場合) Javaのswitch文とcase文に相当複数の条件分岐判定
トリム特定のSQLアセンブリ問題を処理するための補助要素SQLアセンブリの問題を処理するために使用される
ループ文ステートメントなどのリスト条件でよく使用されます

if要素

if 要素は最もよく使用される判定文であり、Java の if 文に相当します。多くの場合、test 属性と組み合わせて使用​​されます。

<select id="findRole1" パラメータタイプ="文字列" 結果マップ="roleResultMap">
    1=1 の場合、t_role から role_no、role_name、note を選択
    <if test="roleName != null かつ roleName !=''">
      role_name は concat('%', #{roleName}, '%') のように記述します。
    </if>
  </選択>

パラメータ roleName がマッパーに渡されるとき、パラメータが空でない場合は roleName のファジー クエリが構築され、それ以外の場合はこの条件は構築されません。 Mybaties の if 要素は、SQL を結合する作業を大幅に節約し、それを XML で維持します。

選択、場合、それ以外の要素

判断する際に 2 つのオプションだけではなく、さらにオプションがある場合は、switch...case...default... 関数に似たステートメントになります。マップされた SQL ステートメントでは、choose、when、otherwise 要素を使用してこの機能を実行します。

<select id="findRole2" パラメータタイプ="role" resultMap="roleResultMap">
    t_role から role_no、role_name、note を選択
    ここで1=1
    <選択>
      <test="roleNo != null かつ roleNo !=''">の場合
        かつ role_no = #{roleNo}
      </いつ>
      <when ​​test="roleName != null and roleName !=''">
        AND role_name は concat('%', #{roleName}, '%') のように連結されます
      </いつ>
      <それ以外の場合>
        かつメモがnullではない
      </そうでない場合>
    </選択>
  </選択>

上記のシナリオは次のとおりです。

まず、ロール番号が空でない場合、ロール番号のみがクエリ条件として使用されます。

ロール番号が空でロール名が空でない場合は、ロール名があいまい検索の条件として使用されます。

ロール番号とロール番号の両方が空の場合、ロールメモは空であってはなりません。

トリム、場所、要素の設定

前の SQL ステートメントに「1=1」を追加することでその機能を実現できますが、where を使用する方がよい実装があります。 where 要素内の条件が満たされると、組み立てられた SQL に where SQL キーワードが追加されますが、そうでない場合は追加されません。

<select id="findRole3" パラメータタイプ="role" resultMap="roleResultMap">
    t_role から role_no、role_name、note を選択
    <どこ>
      <if test="roleName != null かつ roleName !=''">
        role_name は concat('%', #{roleName}, '%') のように記述します。
      </if>
      <if test="note != null かつ note !=''">
        そして、concat('%', #{note}, '%')のようにメモします。
      </if>
    </どこ>
  </選択>

場合によっては、一般的な and や or などの特殊な SQL 構文を削除する必要があることがあります。トリム要素を使用すると、目的の効果も得られます。 Prefix はステートメントのプレフィックスを表し、prefixOverrides は削除する必要がある文字列を表します。これは前の where ステートメントと同等です。

<select id="findRole4" パラメータタイプ="文字列" 結果マップ="roleResultMap">
    t_role から role_no、role_name、note を選択
    <trim prefix="where" prefixOverrides="and">
      <if test="roleName != null かつ roleName !=''">
        role_name は concat('%', #{roleName}, '%') のように記述します。
      </if>
    </トリム>
  </選択>

Hibernate では、特定のフィールドを更新するためにすべてのフィールドを永続オブジェクトに送信する必要がある場合、SQL ステートメントの実行効率に影響します。最善のアプローチは、主キーと更新フィールド値を SQL に渡して更新することです。 set 要素はこの機能を実現できます。セット要素がカンマに遭遇すると、対応するカンマが自動的に削除されます。

<更新 id="updateRole" パラメータタイプ="role">
    t_role を更新
    <設定>
      <if test="roleName != null かつ roleName !=''">
        ロール名 = #{ロール名},
      </if>
      <if test="note != null かつ note != ''">
        メモ = #{メモ}
      </if>
    </set>
    role_no = #{roleNo} の場合
  </更新>

要素ごとに

foreach 要素は、コレクションをトラバースするために使用されるループ ステートメントです。List および Set インターフェイスの配列とコレクションを適切にサポートし、それらのトラバース関数を提供します。SQL の in キーワードでよく使用されます。

<select id="findRoleByNums" resultMap="roleResultMap">
    t_roleからrole_no、role_name、noteを選択します。role_noは
    <foreach item="roleNo" index="index" collection="roleNoList"
      開く="(" セパレーター="," 閉じる=")">
      #{ロール番号}
    </foreach>
  </選択>

コレクション構成の roleNoList は渡されるパラメータの名前であり、配列、リスト、セット、その他のコレクションにすることができます。

item はループ内の現在の要素を構成します。

インデックスはコレクション内の現在の要素の位置を構成します。

開くと閉じるは、これらのコレクション要素をパッケージ化するために使用されるシンボルを構成します。

セパレータは要素間の区切りです。

テスト属性を使用して文字列を決定する

test は条件判断文に使用され、真偽を判断することと同等です。ほとんどのシナリオでは、主に何かが空かどうかを判断するために使用されます。

  <select id="getRoleTest" パラメータタイプ="文字列" 結果マップ="roleResultMap">
    t_role から role_no、role_name、note を選択
    <if test="type == 'Y'.toString()">
      ここで1=1
    </if>
  </選択>

MybatisではSQLにtype='Y'を渡すと1=1となる条件を追加できるので、文字列判定の場合はtoString()メソッドを追加して比較することができます。

バインド要素

bind 要素は、より使いやすい OGNL 式を通じてコン​​テキスト変数を定義するために使用されます。

たとえば、あいまいクエリでは、MySQL データベースの場合、パラメータを % で接続する concat がよく使用されます。しかし、Oracle データベースにはそのようなものはありません。Oracle データベースで使用される接続記号は「||」であるため、SQL ではそれを実装するために 2 つの形式が必要になります。bind 要素を使用すると、データベース言語を使用する必要はありません。

  <select id="findRole5" パラメータタイプ="文字列" 結果マップ="roleResultMap">
    <bind name="pattern" value="'%' + _parameter + '%'" />
    t_role から role_no、role_name、note を選択
    role_name は #{pattern} のようになります
  </選択>

上記は、学習プロセス中に Mybatis の動的 SQL ステートメントに関する一般的な知識のポイントをまとめたものです。皆さんが一緒に学習し、向上できることを願っています。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Mybatis の動的 SQL の詳細な説明 (良い)
  • mybatis 動的 SQL のマップパラメータの説明
  • MyBatisは動的SQLを実行します
  • Mybatis ファジークエリと動的 SQL ステートメントの使用
  • MyBatis 動的 SQL でトリム タグを使用する方法
  • MyBatis は動的 SQL と関連クエリを練習します
  • MyBatis 動的 SQL タグの詳細な使用例
  • Mybatis 動的 SQL で if テストを使用する手順
  • Mybatis 動的 SQL の詳細な説明
  • Mybatis の超強力な動的 SQL ステートメント コレクション

<<:  Linuxカーネルをコンパイルする方法

>>:  JavaScript の基礎: エラーキャプチャメカニズム

推薦する

Vueはデジタル千単位区切り形式をグローバルに実装します

この記事の例では、Vue がデジタル 3 桁区切り形式をグローバルに実装するための具体的なコードを参...

Nginx で同じドメイン名を持つ複数のプロジェクトを構成する方法

Nginx を使用して同じドメイン名で複数のプロジェクトを構成するには、次の 2 つの方法があります...

Linuxでスワップパーティションファイルを作成する方法

スワップの紹介Linux のスワップ (スワップ パーティション) は、Windows の仮想メモリ...

MySQL データをエクスポートする際の secure-file-priv 問題の解決方法

エラー 1290 (HY000) : MySQL サーバーは –secure-file-priv オ...

MySQLの浅いエントリと深いエグジットの原則についての簡単な説明

目次1. ページの概要2. 下限と上限3. ページディレクトリを使用する4. ページの実際の外観4....

CSSの4種類の配置の違いの詳細な説明

フロントエンド開発でよく使われるCSSの配置方法は、位置決めには、通常位置決め、相対位置決め、絶対位...

Linux カーネル デバイス ドライバーのメモリ管理に関する注意事項

/************************ * Linux メモリ管理 *********...

あまり使われていない、または誤解されている HTML タグ 10 個

ここでは、あまり使われていない、または誤解されている 10 個の HTML タグを紹介します。あまり...

フラッシュコンテンツの表示に使用される OBJECT タグと EMBED タグの違いの紹介

1. はじめに:ウェブページにフラッシュ コンテンツを正常に表示したい場合は、ページ上のフラッシュ ...

Linux サーバーで MySQL リモート接続を有効にする方法

序文以前の非MKレコードを再編成するためのMySQLの学習説明する有効になっていない場合、データベー...

MySql 最適化のための my.ini 中国語構成スキームの詳細な説明: InnoDB、4GB メモリ、および複数のクエリ

この記事は、4G メモリ システム用の MySQL 構成ファイル ソリューションです (主に Inn...

Windows CVE-2019-0708 リモート デスクトップ コード実行脆弱性の再現問題

1. 脆弱性の説明マイクロソフトは2019年5月15日、CVE番号CVE-2019-0708のWin...

ユーザーがフォームを繰り返し送信するのを防ぐ方法の概要

重複したフォーム送信は、マルチユーザー Web アプリケーションで最も一般的で厄介な問題です。重複送...