Maison  >  Article  >  Java  >  Apprendre l'utilisation dynamique de SQL mybatis

Apprendre l'utilisation dynamique de SQL mybatis

巴扎黑
巴扎黑original
2017-07-20 09:47:101432parcourir

L'une des fonctionnalités puissantes de MyBatis est son SQL dynamique.

Si vous avez de l'expérience dans l'utilisation de JDBC ou d'autres frameworks similaires, vous comprendrez à quel point il est pénible de fusionner des instructions SQL en fonction de différentes conditions. Lors de l'épissage, veillez à ne pas oublier les espaces nécessaires et veillez à omettre la virgule à la fin de la liste des colonnes. Profitez de la fonctionnalité SQL dynamique pour vous débarrasser complètement de cette douleur.

Habituellement, l'utilisation de SQL dynamique ne peut pas être une partie indépendante. MyBatis utilise certainement un langage SQL dynamique puissant pour améliorer cette situation. Ce langage peut être utilisé dans n'importe quelle instruction de mappage SQL.

Les éléments SQL dynamiques sont similaires à l'utilisation de JSTL ou d'autres processeurs de texte similaires basés sur XML. Dans les versions précédentes de MyBatis, il y avait de nombreux éléments à comprendre. MyBatis 3 les a grandement améliorés, utilisant désormais moins de la moitié des éléments d'origine. MyBatis utilise de puissantes expressions basées sur OGNL pour éliminer d'autres éléments.

L'instruction SQL dynamique de mybatis est basée sur l'expression OGNL. Il est facile d'implémenter certaines logiques dans les instructions SQL. De manière générale, les instructions SQL dynamiques mybatis incluent principalement les catégories suivantes :

1 instruction if (jugement conditionnel simple)
2. choisir (quand, sinon), équivalent à switch en langage java, très similaire à choisir en jstl.
3. trim (ajouter un préfixe, ou un suffixe, etc., un préfixe, un suffixe au contenu inclus)
4. où (principalement utilisé pour simplifier le jugement des conditions Where dans les instructions SQL, et peut gérer intelligemment et ou, sans se soucier des erreurs de syntaxe redondantes)
5 set (principalement utilisé pour les mises à jour)
foreach (particulièrement utile. lors de l'implémentation de mybatis dans une requête d'instruction)
Ces méthodes de traitement sont présentées ci-dessous :

mybaits if traitement de l'instruction

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

La signification de cette instruction est très simple si vous fournissez le paramètre title, alors elle doit satisfaire title=# {title}, de même si. vous fournissez le contenu et le propriétaire, ils doivent également remplir les conditions correspondantes, puis renvoyer tous les blogs qui remplissent ces conditions. C'est une fonction très utile dans le passé, nous utilisions d'autres types de frameworks ou directement dans JDBC. Si nous voulons obtenir le même effet de sélection, nous devons épeler les instructions SQL, ce qui est extrêmement gênant. En comparaison, le SQL dynamique ci-dessus est beaucoup plus simple.

2. choisir (quand, autrement), ce qui équivaut à switch en langage java, et est très similaire à choisir en jstl Similaire :

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

quand l'élément indique quand la condition dans quand est rempli Lorsque le contenu est sorti, l'effet est similaire au changement en JAVA, qui est dans l'ordre des conditions. Lorsqu'une condition dans quand est remplie, le choix saute, c'est-à-dire parmi toutes les conditions quand et autrement. , un seul sera affiché. Lorsque toutes les conditions ne sont pas remplies, le contenu autrement est affiché. La signification de l'instruction ci-dessus est donc très simple. Lorsque title!=null, output et titlte = #{title}, et ne juge plus les conditions. Lorsque title est vide et content!=null, output et content = #{ content. }, lorsque toutes les conditions ne sont pas remplies, le contenu autrement est affiché.

3.trim (Ajouter un préfixe, ou un suffixe, etc. au contenu, préfixe, suffixe inclus)

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

La fonction principale de l'élément trim est d'ajouter certains préfixes avant le contenu qu'il contient, et vous pouvez également ajouter certains suffixes après celui-ci. Les attributs correspondants sont le préfixe et le suffixe ; peut écraser, c'est-à-dire ignorer, une partie du contenu dans la première partie du contenu inclus, ou vous pouvez écraser une partie du contenu dans la queue. Les attributs correspondants sont prefixOverrides et suffixOverrides car trim a une telle fonction, nous pouvons également l'utiliser très bien. simplement trim remplace la fonction de l'élément Where.

4. Where (principalement utilisé pour simplifier le jugement des conditions Where dans les instructions SQL, et peut gérer intelligemment les conditions et

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

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn