MyBatis動的SQLを学ぶ

coldplay.xixi
リリース: 2020-12-09 17:46:13
転載
2667 人が閲覧しました

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 findByUser(User user);
ログイン後にコピー

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

ログイン後にコピー

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タグを使用します。

#where

上記の SQL をタグ内の

ログイン後にコピー
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

<select id="findByUser" resultType="com.example.mybatis.entity.User"> select id, username, user_email userEmail, user_city userCity, age from user <trim prefix="where" prefixOverrides="and"> <if test="username != null and username != &#39;&#39;"> username = #{username} </if> <if test="userEmail != null and userEmail != &#39;&#39;"> and user_email = #{userEmail} </if> <if test="userCity != null and userCity != &#39;&#39;"> and user_city = #{userCity} </if> </trim> </select>
ログイン後にコピー
ユーザー名が空で、userEmail と userCity が空でない場合、

if

ラベル結合の SQL ステートメントは次のとおりです。

and user_email = #{userEmail} and user_city = #{userCity}
ログイン後にコピー
理由は、

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 要素を提供します。
ログイン後にコピー

set

set タグは更新操作に使用され、パラメーターの選択に基づいて SQL ステートメントを自動的に生成します。インターフェイスは次のように定義されています

public int updateUser(User user);
ログイン後にコピー

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

 update user   username=#{username},   user_email=#{userEmail},   user_city=#{userCity},   age=#{age}   where id=#{id} 
ログイン後にコピー

##foreach

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

#

接口定义如下所示

public List getUsersByIds(List ids);
ログイン後にコピー

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

ログイン後にコピー

用于批量插入

接口定义如下所示

public int addUserList(List users);
ログイン後にコピー

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

 insert into user (username, user_email, user_city, age) values  (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})  insert into user (username, user_email, user_city, age) values  (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})   insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})   insert into user (username, user_email, user_city, age) values (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age}); 
ログイン後にコピー

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

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!