Heim  >  Artikel  >  Java  >  Erfahren Sie mehr über die dynamische SQL-Nutzung von mybatis

Erfahren Sie mehr über die dynamische SQL-Nutzung von mybatis

巴扎黑
巴扎黑Original
2017-07-20 09:47:101443Durchsuche

Eine der leistungsstarken Funktionen von MyBatis ist sein dynamisches SQL.

Wenn Sie Erfahrung mit JDBC oder anderen ähnlichen Frameworks haben, werden Sie verstehen, wie mühsam es ist, SQL-Anweisungen basierend auf unterschiedlichen Bedingungen zusammenzufügen. Achten Sie beim Zusammenfügen darauf, die erforderlichen Leerzeichen nicht zu vergessen und achten Sie darauf, das Komma am Ende der Spaltenliste wegzulassen. Nutzen Sie die dynamische SQL-Funktion, um dieses Problem vollständig zu beseitigen.

Normalerweise kann die Verwendung von dynamischem SQL kein unabhängiger Teil sein. MyBatis verwendet sicherlich eine leistungsstarke dynamische SQL-Sprache, um diese Situation zu verbessern. Diese Sprache kann in jeder SQL-Zuordnungsanweisung verwendet werden.

Dynamische SQL-Elemente ähneln der Verwendung von JSTL oder anderen ähnlichen XML-basierten Textverarbeitungsprogrammen. In früheren Versionen von MyBatis mussten viele Elemente verstanden werden. MyBatis 3 hat sie erheblich verbessert, und jetzt können Sie weniger als die Hälfte der ursprünglichen Elemente verwenden. MyBatis verwendet leistungsstarke OGNL-basierte Ausdrücke, um andere Elemente zu eliminieren.

Die dynamische SQL-Anweisung von mybatis basiert auf dem OGNL-Ausdruck. Es ist einfach, bestimmte Logik in SQL-Anweisungen zu implementieren. Im Allgemeinen umfassen dynamische SQL-Anweisungen von mybatis hauptsächlich die folgenden Kategorien:

1. if-Anweisung (einfache bedingte Beurteilung)
2. Wählen (wann, andernfalls), äquivalent zum Wechseln in der Java-Sprache, sehr ähnlich zum Wählen in JSTL.
3. Trimmen (Präfix, Suffix usw., Präfix, Suffix zum enthaltenen Inhalt hinzufügen)
4. where (wird hauptsächlich verwendet, um die Beurteilung von Where-Bedingungen in SQL-Anweisungen zu vereinfachen und kann intelligent behandelt werden, ohne sich Gedanken über redundante Syntaxfehler machen zu müssen)
5 (wird hauptsächlich für Aktualisierungen verwendet)
6 bei der Implementierung von mybatis in der Anweisungsabfrage)
Diese Verarbeitungsmethoden werden im Folgenden vorgestellt:

1

<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>
Die Bedeutung dieser Anweisung ist sehr einfach. Wenn Sie den Titelparameter angeben, muss er title=# {title} erfüllen, auch wenn Wenn Sie Inhalte und Eigentümer angeben, müssen diese auch die entsprechenden Bedingungen erfüllen. Anschließend werden alle Blogs zurückgegeben, die diese Bedingungen erfüllen. Dies ist eine sehr nützliche Funktion. In der Vergangenheit haben wir andere Arten von Frameworks verwendet oder sie direkt verwendet. Wenn wir den gleichen Auswahleffekt erzielen möchten, müssen wir SQL-Anweisungen buchstabieren, was äußerst mühsam ist. Im Vergleich dazu ist das obige dynamische SQL viel einfacher.

2. Wählen Sie (wann, sonst), was dem Wechseln in der Java-Sprache entspricht und sehr ähnlich ist Wählen Sie in jstl Ähnlich:

<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-Element gibt an, wann die Bedingung vorliegt Wenn die Bedingung erfüllt ist, wird der Inhalt ausgegeben. Der Effekt ähnelt dem Wechsel in der Reihenfolge der Bedingungen. Wenn eine Bedingung erfüllt ist, wird ausgewählt Bei allen „When“- und „Anders“-Bedingungen wird nur eine ausgegeben. Wenn nicht alle Bedingungen erfüllt sind, wird der Inhalt in „Anderenfalls“ ausgegeben. Die Bedeutung der obigen Anweisung ist also sehr einfach. Wenn Titel!=Null, Ausgabe und Titel = #{Titel}. Keine weitere Beurteilung der Bedingungen. Wenn nicht alle Bedingungen erfüllt sind, wird der Inhalt in sonst ausgegeben.

3.trim (Präfix, Suffix usw. zum enthaltenen Inhalt, Präfix, Suffix hinzufügen)


    <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>
Die Hauptfunktion des Trim-Elements besteht darin, bestimmte Präfixe vor dem darin enthaltenen Inhalt hinzuzufügen, und Sie können auch bestimmte Suffixe danach hinzufügen. Die entsprechenden Attribute sind Präfix und Suffix Sie können einige Inhalte im ersten Teil des enthaltenen Inhalts überschreiben, also ignorieren, oder Sie können einige Inhalte im Ende überschreiben. Die entsprechenden Attribute sind prefixOverrides und suffixOverrides. Da trim eine solche Funktion hat, können wir sie auch sehr gut verwenden simply trim ersetzt die Funktion des where-Elements.

4. where (wird hauptsächlich verwendet, um die Beurteilung von Where-Bedingungen in SQL-Anweisungen zu vereinfachen und kann und/oder Bedingungen intelligent verarbeiten

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);

 

Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über die dynamische SQL-Nutzung von mybatis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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