ホームページ  >  記事  >  Java  >  mybatis の動的 SQL の使用法を学ぶ

mybatis の動的 SQL の使用法を学ぶ

巴扎黑
巴扎黑オリジナル
2017-07-20 09:47:101444ブラウズ

MyBatis の強力な機能の 1 つは動的 SQL です。

JDBC または他の同様のフレームワークを使用した経験がある場合は、さまざまな条件に基づいて SQL ステートメントを結合することがどれほど苦痛であるかを理解できるでしょう。スプライスするときは、必要なスペースを忘れないように注意し、列リストの末尾のカンマを省略しないように注意してください。この問題を完全に取り除くには、動的 SQL 機能を利用してください。

通常、動的 SQL の使用は独立した部分ではありませんが、MyBatis はこの状況を改善するために強力な動的 SQL 言語を使用します。この言語はあらゆる SQL マッピング ステートメントで使用できます。

動的 SQL 要素は、JSTL または他の同様の XML ベースのテキスト プロセッサの使用に似ています。 MyBatis の以前のバージョンでは、理解すべき要素が数多くありました。 MyBatis 3 ではそれらが大幅に改善され、元の要素の半分以下が使用できるようになりました。 MyBatis は、強力な OGNL ベースの式を使用して他の要素を排除します。

Mybatis の動的 SQL ステートメントは OGNL 式に基づいています。 SQL ステートメントで特定のロジックを実装するのは簡単です。一般的に、mybatis の動的 SQL ステートメントには主に次のカテゴリが含まれます:

1. if ステートメント (when、otherwize)、quite in java言語はjstlの選択に非常に似ています。
3. トリム(含まれるコンテンツにプレフィックス、サフィックスなどを追加します)
4. where(主にSQL文の条件判断を簡略化するために使用されます) and or をインテリジェントに処理できるため、冗長な構文エラーを心配する必要はありません)
5. set (主に更新に使用されます)
6. foreach (ステートメント クエリで mybatis を実装する場合に特に役立ちます)
これらの処理方法を以下に紹介します。

1. mybaits if ステートメントの処理

<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">select * from t_blog where 1 = 1
        <if test="title != null">and title = #{title}</if>
        <if test="content != null">and content = #{content}</if>
        <if test="owner != null">and owner = #{owner}</if>
    </select>

このステートメントの意味は非常に単純で、title パラメーターを指定する場合、同様に title=#{title } を満たす必要があります。 Content と Owner を指定した場合は、対応する条件を満たす必要があり、これらの条件を満たすすべてのブログを返します。これまでは、他の種類のフレームワークを使用したり、JDBC を直接使用したりすることがありました。同じ選択効果を実現したい場合は、SQL ステートメントを記述する必要がありますが、これは非常に面倒です。それに比べて、上記の動的 SQL ははるかに単純です。

2. select (when,otherwize)。これは Java 言語の switch に相当し、jstl での select と非常に似ています:

<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">select * from t_blog where 1 = 1 
        <choose>
            <when test="title != null">and title = #{title}</when>
            <when test="content != null">and content = #{content}</when>
            <otherwise>and owner = "owner1"
            </otherwise>
        </choose>
    </select>

いつ要素は when の条件が満たされたときに内容が出力されることを表します。その効果は、条件の順に、when の条件が満たされたときに選択が飛び出します。 all when および else 条件の場合、1 つだけが出力され、すべての条件が満たされない場合は、他の内容が出力されます。したがって、上記のステートメントの意味は非常に単純です。 title!=null の場合は、output と titlte = #{title} となり、title が空で content!=null の場合は、output および content = #{ content となります。 }の場合、すべての条件を満たさない場合は、それ以外の内容が出力されます。

3.trim (含まれるコンテンツ、プレフィックス、サフィックスにプレフィックス、またはサフィックスなどを追加します)

    <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">select * from t_blog <trim prefix="where" prefixOverrides="and |or">
            <if test="title != null">title = #{title}</if>
            <if test="content != null">and content = #{content}</if>
            <if test="owner != null">or owner = #{owner}</if>
        </trim>
    </select>

trim要素の主な機能は、前に一定量を追加することです含まれるコンテンツの一部の接頭辞は接尾辞の後に追加することもでき、対応する属性は接頭辞と接尾辞です。含まれるコンテンツのヘッダーの一部の内容は上書きでき、末尾の一部の内容は無視できます。属性は prefixOverrides と suffixOverrides であるため、trim を使用して where 要素の関数を簡単に置き換えることもできます。

4. where (主に SQL ステートメント内の where 条件の判断を簡略化するために使用され、and or 条件をインテリジェントに処理できます)

<select id="dynamicWhereTest" parameterType="Blog"   resultType="Blog">select * from t_blog <where>
            <if test="title != null">title = #{title}</if>
            <if test="content != null">and content = #{content}</if>
            <if test="owner != null">and owner = #{owner}</if>
        </where>
    </select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:


 ...

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

 

where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。

5.set (主要用于更新时)

   <update id="dynamicSetTest" parameterType="Blog">update t_blog<set>
            <if test="title != null">title = #{title},</if>
            <if test="content != null">content = #{content},</if>
            <if test="owner != null">owner = #{owner}</if>
        </set>where id = #{id}</update>

set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。

6. foreach (在实现 mybatis in 语句查询时特别有用) 
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

  1.1.单参数List的类型

<select id="dynamicForeachTest" resultType="Blog">select * from t_blog where id in<foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

 

  上述collection的值为list,对应的Mapper是这样的:  public List dynamicForeachTest(List ids); 

  2.数组类型的参数

  

<select id="dynamicForeach2Test" resultType="Blog">select * from t_blog where id in<foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

  对应的Mapper:   public List dynamicForeach2Test(int[] ids); 

  3.Map 类型的参数

<select id="dynamicForeach3Test" resultType="Blog">select * from t_blog where title like "%"#{title}"%" and id in<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">#{item}</foreach>
    </select>

  对应的Mapper:    public List dynamicForeach3Test(Map params);

 

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。