Heim  >  Artikel  >  Java  >  Ausführliche Erklärung der Mybatis-Serie (9) – leistungsstarkes dynamisches SQL

Ausführliche Erklärung der Mybatis-Serie (9) – leistungsstarkes dynamisches SQL

黄舟
黄舟Original
2017-03-02 11:06:051448Durchsuche

Im vorherigen Artikel „Ausführliche Einführung in die Mybatis-Serie (8) – Mapper-Mapping-Dateikonfigurationsauswahl, resultMap“ wurde die Abfrage von Mybatis bisher kurz erläutert. In diesem Artikel wird das leistungsstarke dynamische SQL von mybatis vorgestellt.

Hier stellt sich also die Frage: Was ist dynamisches SQL? Welche Rolle spielt dynamisches SQL?

Bei der herkömmlichen Methode der Verwendung von JDBC glaube ich, dass beim Kombinieren komplexer SQL-Anweisungen diese zusammengefügt werden müssen. Wenn Sie nicht aufpassen, führt selbst das Fehlen eines Leerzeichens zu Fehlern. Die dynamische SQL-Funktion von Mybatis soll dieses Problem lösen. Sie kann über die Tags „if“, „select“, „when“, „onson“ und „trimm“, „where“, „set“ und „foreach“ zu sehr flexiblen SQL-Anweisungen kombiniert werden, wodurch die Effizienz der Entwickler verbessert wird. Lassen Sie uns den Charme von Mybatis Dynamic SQL spüren:

1 wenn: Sie können es beurteilen, und ich auch!

Wer versteht als Programmierer nicht, ob! Sie können auch if in mybatis verwenden:

<select id="findUserById" resultType="user">
           select * from user where 
           <if test="id != null">
               id=#{id}           </if>
            and deleteFlag=0;</select>


The Beispiel oben: Wenn die eingehende ID nicht leer ist, verkettet SQL id = #{id}. Ich glaube, dass jeder das verstehen kann, wenn er es sich nur ansieht, deshalb werde ich nicht ins Detail gehen.

Aufmerksame Leute werden ein Problem finden: „Sie liegen falsch! Wenn die von Ihnen übergebene ID null ist, wird Ihre endgültige SQL-Anweisung zu „select * from user where“ und „deleteFlag=0“. Da stimmt etwas nicht Aussage! „

Ja, zu diesem Zeitpunkt wird das where-Tag von mybatis sein großes Debüt geben:

2. where, bei mir, SQL-Anweisung Die Spleißbedingungen sind alle in den Wolken!

Lassen Sie uns das obige Beispiel modifizieren, indem wir Folgendes tun:

<select id="findUserById" resultType="user">
           select * from user 
           <where>
               <if test="id != null">
                   id=#{id}               </if>
               and deleteFlag=0;           </where>
 </select>


Manche Leute werden fragen: „Was machst du? Was.“ Ist es im Vergleich zu dem oben genannten nicht nur ein zusätzliches Where-Tag? Wird dieses auch „select * from user where“ und „deleteFlag=0“ anzeigen? extra where-Tag, aber im Wesentlichen verarbeitet mybatis es, wenn es auf UND oder ODER stößt, weiß es, wie es damit umgehen soll. Tatsächlich können wir diese Verarbeitungsregel über das Trim-Tag anpassen.

3. Beschnitt: Mein Revier, ich entscheide! Das obige Where-Tag kann tatsächlich durch Trim wie folgt dargestellt werden:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

Es bedeutet: Wenn auf WHERE ein AND-Oder folgt Wenn OR, entfernen Sie AND oder OR. Neben WHERE gibt es tatsächlich eine klassischere Implementierung, nämlich SET.

4. Set: Vertrauen Sie mir, Sie werden keine Fehler machen!

Das Problem tritt erneut auf: „Wenn ich nur einen Namen habe, der nicht null ist, wird diese SQL zu Update-Set-Name = #{Name}, wobei .... .... ? Das Komma nach Ihrem Namen führt zu einem Fehler! „
<update id="updateUser" parameterType="com.dy.entity.User">
           update user set 
           <if test="name != null">
               name = #{name},           </if> 
           <if test="password != null">
               password = #{password},           </if> 
           <if test="age != null">
               age = #{age}           </if> 
           <where>
               <if test="id != null">
                   id = #{id}               </if>
               and deleteFlag = 0;           </where></update>

Ja, derzeit können wir das von mybatis bereitgestellte Set-Tag verwenden. Folgendes wird durch das Set-Tag geändert:

<update id="updateUser" parameterType="com.dy.entity.User">
           update user        <set>
          <if test="name != null">name = #{name},</if> 
             <if test="password != null">password = #{password},</if> 
             <if test="age != null">age = #{age},</if> 
        </set>
           <where>
               <if test="id != null">
                   id = #{id}               </if>
               and deleteFlag = 0;           </where></update>

这个用trim 可表示为:

<trim prefix="SET" suffixOverrides=",">
  ...</trim>

WHERE是使用的 prefixOverrides(前缀), SET是使用的 suffixOverrides (后缀), 看明白了吧!

5. foreach:  你有for, 我有foreach, 不要以为就你才屌!

java中有for, 可通过for循环, 同样, mybatis中有foreach, 可通过它实现循环,循环的对象当然主要是java容器和数组。

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in  <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
        #{item}  </foreach></select>

将一个 List 实例或者数组作为参数对象传给 MyBatis,当这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。同样, 当循环的对象为map的时候,index其实就是map的key。

6. choose:  我选择了你,你选择了我!

Java中有switch,  mybatis有choose。

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’  <choose>
    <when test="title != null">
      AND title like #{title}    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}    </when>
    <otherwise>
      AND featured = 1    </otherwise>
  </choose></select>

以上例子中: 当title和author都不为null的时候, 那么选择二选一(前者优先), 如果都为null, 那么就选择 otherwise中的, 如果tilte和author只有一个不为null, 那么就选择不为null的那个。

纵观mybatis的动态SQL, 强大而简单, 相信大家简单看一下就能使用了。

好啦,本次就写到这!下篇文章将结合mybatis的源码分析一次sql语句执行的整个过程。

 

 以上就是深入浅出Mybatis系列(九)---强大的动态SQL的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn