検索

MyBatis動的SQLを学ぶ

Dec 09, 2020 pm 05:46 PM
mybatissql

sql チュートリアルSQL MyBatis SQL の強力な機能の紹介

MyBatis動的SQLを学ぶ

推奨 (無料): sql チュートリアル

動的 SQL

MyBatis の強力な機能の 1 つは動的 SQL です。 JDBC または他の同様のフレームワークの使用経験がある場合は、さまざまな条件に基づいて SQL ステートメントを結合する難しさを理解できるでしょう。たとえば、スプライスするときは、必要なスペースを忘れずに追加し、リストの最後の列名からカンマを削除するように注意してください。この問題を完全に取り除くには、動的 SQL 機能を利用してください。

これまで動的 SQL を使用するのは簡単ではありませんでしたが、MyBatis は、あらゆる SQL マッピング ステートメントで使用できる強力な動的 SQL 言語を提供することでこの状況を改善しました。

動的 SQL 要素は、JSTL または XML ベースのテキスト プロセッサに似ています。 MyBatis の以前のバージョンでは、理解するのに時間がかかる要素がたくさんありました。 MyBatis 3 では要素の種類が大幅に簡略化され、元の要素の半分を学習するだけで済みます。 MyBatis は強力な OGNL ベースの式を使用して、他のほとんどの要素を排除します。

準備

最初にユーザー エンティティ クラスを作成します

public class User {
    private Integer id;
    private String username;
    private String userEmail;
    private String userCity;
    private Integer age;}

ユーザー テーブルを作成します

CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(255) DEFAULT NULL,
    user_email varchar(255) DEFAULT NULL,
    user_city varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
  PRIMARY KEY (id))

if

インターフェースメソッドの定義

public List<user> findByUser(User user);</user>

インターフェースに対応するMapper.xmlの定義は次のとおりです

<select>
    select
    id, username, user_email userEmail, user_city userCity, age
    from user
    where    <if>
        username = #{username}    </if>
    <if>
        and user_email = #{userEmail}    </if>
    <if>
        and user_city = #{userCity}    </if></select>

ifタグのテストがtrueの場合、SQL文はif タグ内は Splicing になります。

username、userEmail、および userCity が空でない場合、SQL は以下に示すように結合されます

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ? and user_email = ? and user_city = ?

ユーザー名のみが空でない場合、SQL は結合されます以下に示すように

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ?

ただし、この方法には欠点があり、このとき username は空であり、userEmail と userCity は空ではないとします。

動的 SQL コードを分析してみましょう。現在、ユーザー名には値が割り当てられていないため、つまり username==null であるため、「username=#{username}」コードは SQL ステートメントに追加されません。最終的に結合された動的 SQL は次のようになります:

select id, username, user_email userEmail, user_city userCity, age 
from user where and user_email = ? and user_city = ?

where のすぐ後に and が続きますが、これは明らかな構文エラーです。このとき、where# に続く and は次のようになります。 ## は削除する必要があります。この問題を解決するには、where タグを使用します。

上記の SQL をタグ内の

    <select>
        select
        id, username, user_email userEmail, user_city userCity, age        from user
        <where>
            <if>
                username = #{username}
            </if>
            <if>
                and user_email = #{userEmail}
            </if>
            <if>
                and user_city = #{userCity}
            </if>
        </where>
    </select>
if

where##if に変更します。 タグが条件を満たしている場合、where タグは where ステートメントに接続されます。if タグで接続された SQL の先頭に and ステートメントがある場合、フロントにすると、 and が where ステートメントに結合されます。この方法を利用すると、SQL中の不要なキーワードが自動的に削除されるので、一般的にifタグとwhereタグを組み合わせて使用​​します。

trim

trim

タグの prefix 属性と suffix 属性は、次の目的で使用されます。実際の SQL ステートメントは、ラベル内のステートメントと結合されます。

prefixOverrides

または suffixOverrides 属性で指定された値がステートメントの前後に見つかった場合、MyBatis はそれらを自動的に削除します。複数の値を指定する場合は、後続の SQL に接続されないように、各値の後にスペースを入れることを忘れないでください。

prefix

: 結合された SQL ステートメントに接頭辞を追加します。

suffix

: 結合された SQL ステートメントに接尾辞を追加します

prefixOverrides

: 接続された SQL ステートメントの前に prefixOverrides が見つかった場合、MyBatis はそれらを自動的に削除します。

suffixOverrides

: Ifこれは、結合された SQL ステートメント suffixOverrides の後に発生します。MyBatis はそれらを自動的に削除します。以下の

trim

タグを使用して、where の関数を実装します。 tag<pre class="brush:php;toolbar:false">&lt;select&gt;         select         id, username, user_email userEmail, user_city userCity, age         from user        &lt;trim&gt;             &lt;if&gt;                 username = #{username}            &lt;/if&gt;             &lt;if&gt;                 and user_email = #{userEmail}            &lt;/if&gt;             &lt;if&gt;                 and user_city = #{userCity}            &lt;/if&gt;         &lt;/trim&gt;     &lt;/select&gt;</pre>ユーザー名が空で、userEmail と userCity が空でない場合、

if

ラベル結合の SQL ステートメントは次のとおりです。<pre class="brush:php;toolbar:false">and user_email = #{userEmail} and user_city = #{userCity}</pre>理由は、

trim

ラベルは prefixOverrides="and" で設定されており、上記の SQL ステートメントの前に and ステートメントがあるため、上記の and ステートメントを削除する必要があります。タグが prefix="where" で設定されている場合は、結合された SQL ステートメントの前に where ステートメントを追加する必要があります。 Finallytrimタグの SQL ステートメントが結合されます次のように

where user_email = #{userEmail} and user_city = #{userCity}

choose

すべての条件文に適用したくないが、そのうちの 1 つだけを選択したい場合があります。この状況に備えて、MyBatis は Java の switch ステートメントに似たchoose 要素を提供します。
<select>
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <where>
            <choose>
                <when>
                    username = #{username}                </when>
                <when>
                    and user_email = #{userEmail}                </when>
                <when>
                    and user_city = #{userCity}                </when>
            </choose>
        </where>
    </select>

set

public int updateUser(User user);

インターフェイスに対応する Mapper.xml 定義は次のとおりです

<update>
       update user       <set>
           <if>
               username=#{username},           </if>
           <if>
               user_email=#{userEmail},           </if>
           <if>
               user_city=#{userCity},           </if>
           <if>
              age=#{age}           </if>
       </set>
       where id=#{id}    </update>

##foreach

foreach タグは反復可能です。ステートメント内の SQL で使用するための一連の値を生成します。

#

接口定义如下所示

public List<user> getUsersByIds(List<integer> ids);</integer></user>

接口对应的 Mapper.xml 定义如下所示

<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select>
    select * from user
    where id in    <foreach>
        #{id}    </foreach></select>

用于批量插入

接口定义如下所示

public int addUserList(List<user> users);</user>

接口对应的 Mapper.xml 定义如下所示

<insert>
    insert into user
    (username, user_email, user_city, age)
    values    <foreach>
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--返回自增主键--><insert>
    insert into user
    (username, user_email, user_city, age)
    values    <foreach>
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--还可以这样写--><!--
    这种方式需要数据库连接属性设置allowMultiQueries=true
    这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除
--><insert>
    <foreach>
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert>
    <foreach>
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age});    </foreach></insert>

以上がMyBatis動的SQLを学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
データ分析のためのSQL:ビジネスインテリジェンスの高度な手法データ分析のためのSQL:ビジネスインテリジェンスの高度な手法Apr 14, 2025 am 12:02 AM

SQLの高度なクエリスキルには、複雑なデータ分析要件を処理できるサブクエリ、ウィンドウ関数、CTE、複雑な結合が含まれます。 1)サブクエリは、各部門で最高の給与を持つ従業員を見つけるために使用されます。 2)ウィンドウ関数とCTEを使用して、従業員の給与成長傾向を分析します。 3)パフォーマンス最適化戦略には、インデックスの最適化、クエリの書き換え、パーティションテーブルの使用が含まれます。

MySQL:SQLの特定の実装MySQL:SQLの特定の実装Apr 13, 2025 am 12:02 AM

MySQLは、標準のSQL関数と拡張機能を提供するオープンソースリレーショナルデータベース管理システムです。 1)MySQLは、制限句の作成、挿入、更新、削除、拡張などの標準のSQL操作をサポートしています。 2)InnodbやMyisamなどのストレージエンジンを使用しています。これらは、さまざまなシナリオに適しています。 3)ユーザーは、テーブルの作成、データの挿入、ストアドプロシージャの使用など、高度な機能を介してMySQLを効率的に使用できます。

SQL:すべての人がデータ管理にアクセスできるようにしますSQL:すべての人がデータ管理にアクセスできるようにしますApr 12, 2025 am 12:14 AM

sqlmakesdatamanagemagementisibletoallbyproviding asimpleyetpowerfultoolset andmanagingdatabases.1)itworks withersortifyify what what what what what what what what whatysortsopecifyifyを許可します

SQLインデックス戦略:クエリパフォーマンスを桁違いに改善するSQLインデックス戦略:クエリパフォーマンスを桁違いに改善するApr 11, 2025 am 12:04 AM

SQLインデックスは、巧妙なデザインを通じてクエリパフォーマンスを大幅に改善できます。 1. Bツリー、ハッシュ、フルテキストインデックスなどの適切なインデックスタイプを選択します。 2。複合インデックスを使用して、マルチフィールドクエリを最適化します。 3.オーバーインデックスを避けて、データメンテナンスのオーバーヘッドを減らします。 4.不要なインデックスの再構築や削除など、定期的にインデックスを維持します。

SQLで制約を削除する方法SQLで制約を削除する方法Apr 10, 2025 pm 12:21 PM

SQLの制約を削除するには、次の手順を実行します。削除する制約名を特定します。 ALTER TABLEステートメントを使用してください:Table Table Name Drop Constraint Constraint Nameを変更します。削除を確認します。

SQLトリガーを設定する方法SQLトリガーを設定する方法Apr 10, 2025 pm 12:18 PM

SQLトリガーは、特定のイベントが指定されたテーブルで実行されたときに特定のアクションを自動的に実行するデータベースオブジェクトです。 SQLトリガーをセットアップするには、トリガー名、テーブル名、イベントタイプ、トリガーコードを含むCreate Triggerステートメントを使用できます。トリガーコードは、ASキーワードを使用して定義され、SQLまたはPL/SQLステートメントまたはブロックが含まれます。トリガー条件を指定することにより、Where句を使用して、トリガーの実行範囲を制限できます。トリガー操作は、インサート、更新、または削除ステートメントを使用してトリガーコードで実行できます。新しいキーワードと古いキーワードを使用して、トリガーコードの影響を受けるキーワードを参照できます。

SQLクエリのインデックスを追加する方法SQLクエリのインデックスを追加する方法Apr 10, 2025 pm 12:15 PM

インデックス作成は、データ列を並べ替えてデータ検索を加速するデータ構造です。 SQLクエリにインデックスを追加する手順は次のとおりです。インデックス化する必要がある列を決定します。適切なインデックスタイプ(Bツリー、ハッシュ、またはビットマップ)を選択します。 Create Indexコマンドを使用して、インデックスを作成します。インデックスを定期的に再構築または再編成して、その効率を維持します。インデックスの追加の利点には、クエリパフォーマンスの改善、I/O操作の削減、最適化された並べ替えとフィルタリング、および並行性の改善が含まれます。クエリが特定の列を使用することが多い場合、ソートまたはグループ化する必要がある大量のデータを返し、大きい複数のテーブルまたはデータベーステーブルが含まれます。インデックスの追加を検討する必要があります。

SQLステートメントにIfelseの使用方法SQLステートメントにIfelseの使用方法Apr 10, 2025 pm 12:12 PM

Ifelseステートメントは、条件付き評価結果に基づいて異なる値を返す条件付きステートメントです。その構文構造は次のとおりです。if(条件)then return_value_if_condition_is_true elsen return_value_if_condition_is_false end if;。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境