Mybatisを使用した動的SQL(一)

17864 ワード

Mybatisによる動的SQLの実装
作者:Stanleyロホ
【転載は出典と署名を明記してください.ありがとうございます.】
前に書く:
*この章はMybatisベースの視聴者に適しています*
前の説明
私は今、すべてのsql文をクエリーします.これは皆さんにとって、とても簡単なはずです.例を挙げます.
select * from studnet //    

私は今需要がまた変わった.私は今年齢によって調べなければなりません.それは依然として簡単ではないでしょうか.
select * from student where age = #{age} //        

では、私は今もう一つの需要を持って、年齢と名前によって調べます.
select * from student where age = #{age} and name=#{name};

しかし、私たちはよく発見して、私はさっきsql文を書いて、コピーして貼り付ける必要があります.それは、以上のsql文が重複していることを意味しています.つまり、3つの文の中で、クエリーは同じ表で、いくつかの条件を加えただけです.
だから、私は3回書く必要はありません.実は私たちは1回書けば十分です.
ダイナミックsqlを使用して実現すると、次のような便利さが得られます.
私が初めて使用したとき、select*from studentのみを使用したクエリーはすべて、初期化に使用されました.
私が2回目に使った時はwhere=ageしか使いませんでした
私が3回目に再利用した時はwhere=age and name=nameになりました
sql文を柔軟に制御することができます.これが動的sqlです.
動的sqlがなければ、私たちは機能モジュールではないかと想像することができます.3つのsql文を書く必要があります.コードが非常に肥大化していて、効率が低いのは明らかです.だから、正常な企業開発では、動的sqlの使用点が多いです.
動的SQL
では、どうやって実現するのでしょうか.これは、mybatis xmlファイルのダイナミックラベルを使用します.
まず、今回の業務はすべての照会に関連し、学生の年齢に基づいて照会し、学生の年齢に基づいて照会し、学生の名前に基づいて照会する.
クエリーはすべて、ページの初期化で使用するため、ページがロードされた後に表示する必要があります.また、いくつかのフィルタ条件は、自分のクエリーのニーズを満たすことができます.
今、私たちは以上の業務に基づいて動的sqlを完成します.
クエリーするxmlファイルに次のように記述します.
<select id = "selectAllorbynameAndage" resultType = "Student">

select * from student where

<if test = " name!= null and name!= ' ' ">//      student   name  ,        ,      

student = #{name}

if>

<if test = "age !=null and age != ' ' ">

And student = #{age}

if>

select>

 
説明:
1.if:ifとは何ですか.もしそうなら、どうすればいいですか.もしどうすればいいですか.ここでは、あなたが今調べている間に、名前が入ってきたら、私はあなたが伝えた名前に基づいて調べます.
言い換えれば、もしあなたがこのフィールドを伝えなかったら、この判断に入らないのではないでしょうか.つまり、あなたがこのwhereを書いていないことを意味します.
准备:私は今1人の学生の対象に伝わって、もしこの学生の対象は1つのnameの属性を含んで、しかもnameの属性は空ではありませんならば、私はこのstudent=#{name}をプラスします
if後のtestに実行条件を書きます
2.私たちは今name以外にageがある可能性があるのではないでしょうか.
以上の業務により、ageに基づいて照会することも発見されました.では、次のifにageに関する判決を書くだけでいいです.
しかし、今回の作成にはandを加える必要があることに注目してください.
and:どうして加andしてるの?
現在のsql文は次のように考えられます.
select * from student where name = #{name}

andを入れないと、次のようになりますか?
 select * from student where name = #{name}age = #{age}

これは明らかに間違っていて、sqlの文法はすべて2つ間違っているので、前にandを加える必要があります.andを加えると合法的なsql文になります.
 select * from student where name = #{name}And age = #{age}

sql文の解釈に失敗したことを解決する
では、問題が来ました.以上書いた案は、nameとageがすべて存在しなければ、発効できません.一度存在しなければ、間違いを報告します.私は今、このnameが存在しない場合を認定しています.
例を挙げると、今回のクエリーは、ageクエリーのみで、この時、ageが伝わってきましたが、nameは伝わっていません.私はageだけをクエリーしているので、必ずageを伝えるだけです.この時、nameは値を取れず、このようなsql文を招きました.
select * from student where And age = #{age}

これは明らかで、sql文はどうしてこのように書くことができて、このandはとてもうんざりして、どうしてこのようにすることができますか?
私たちが書いたifラベルを覚えていますか?もしname=null and name='''ならば、私のこのラベルは実行しないで、いったん実行しないと以上のようになって、もともとnameがあるのはこのようです:
 select * from student where name = #{name}And age = #{age}

あなたは今nameが空です.それはname=#{name}が消えたことを示しています.
これandあなたもそれを取り除くことができなくて、あなたはいったん取り除くと、また別のsql文法が不法になることができて、どのようにこの不調和なフィールドを解決しますか?
2つのソリューションがあります.
1つ目:
<select id = "selectAllorbynameAndage" resultType = "Student">

select * from student where 1 = 1

<if test = " name!= null and name!= ' ' ">//      student   name  ,        ,      

And student = #{name}

if>

<if test = "age !=null and age != ' ' ">

And student = #{age}

if>

select>

私はstudnt=nameの前にもandを追加しましたが、このようにすると今回のsql文が成立しません.大丈夫です.whereの後ろに1=1を追加しました.永遠に成立することを意味します.つまり、データベースにこのandを認めさせます.
2つ目【ベスト/おすすめ】:
<select id = "selectAllorbynameAndage" resultType = "Student">

select * from student

<where>

<if test = " name!= null and name!= ' ' ">//      student   name  ,        ,      

And student = #{name}

if>

<if test = "age !=null and age != ' ' ">

And student = #{age}

if>

where>

select>

今、私たちは直接whereラベルでsqlを包み、メインクエリーの後ろのwhereを削除します.もう必要ないので、このwhereラベルを加えると、sqlはどうなりますか.
 select * from student <where> and  name = #{name}and age = #{age}

このようなsql文は、whereの後ろにandがあるので、問題のあるsql文のように見えますが、気にしないでください.このラベルはスマートで、最初のandを自動的に処理し、2番目のandを処理しません.
どういう意味ですか.今回のクエリーです.もしあなたがこれandが必要なら、私はあなたに追加します.もしあなたがこれandを必要としないなら、私はあなたに追加しません.明らかに、今回のクエリーはこれandを必要としないので、あなたに追加しませんでした.
この时、あなたは最初のandを削除して、更に実行して、あなたは削除していないことと同じことを発見することができて、もしあなたがこのandを加えるならば、あなたは発見して、追加していないのと同じで、このように知能で、とても便利です;
しかし、2つ目以降のandを削除すると、問題が発生します.それは最初のandを処理するのに役立つだけです.
原理はこうです
さっき私が言ったように、nameがなければ、最初のifは消えてしまいます.そして、ageがnameに代わったのではないでしょうか.ageが最初です.
<select id = "selectAllorbynameAndage" resultType = "Student">

select * from student

<where>

<if test = "age !=null and age != ' ' ">

And student = #{age}

if>

where>

select>

では、このスマートwhereラベルは、最初のandを適切に消去し、ageベースのクエリーを完了しました.
以上の概念を理解したら、上の業務を全部書き終わりましょう.ageとnameが空でなければ、私はこの2つに基づいて検索します.
<select id = "selectAllorbynameAndage" resultType = "Student">

select * from student

<where>

<if test = " name!= null and name!= ' ' ">//      student   name  ,        ,      

And student = #{name}

if>

<if test = "age !=null and age != ' ' ">

And student = #{age}

if>

<if test = "age ! = null and age !=' ' And name !=null and name ! = ' ' ">

And student = #{name} And student = #{age}

if>

where>

select>