Maison > base de données > SQL > Apprenez le SQL dynamique MyBatis

Apprenez le SQL dynamique MyBatis

coldplay.xixi
Libérer: 2020-12-09 17:46:13
avant
2794 Les gens l'ont consulté

Tutoriel SQLPrésentation des puissantes fonctionnalités de SQL MyBatis SQL

Apprenez le SQL dynamique MyBatis

Recommandé (gratuit) : Tutoriel SQL

SQL dynamique

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 la difficulté de fusionner des instructions SQL en fonction de différentes conditions. Par exemple, lors de l'épissage, assurez-vous de ne pas oublier d'ajouter les espaces nécessaires et veillez à supprimer la virgule du dernier nom de colonne de la liste. Profitez de la fonctionnalité SQL dynamique pour vous débarrasser complètement de cette douleur.

Bien qu'il n'était pas facile d'utiliser le SQL dynamique dans le passé, MyBatis a amélioré cette situation en fournissant un langage SQL dynamique puissant qui peut être utilisé dans n'importe quelle instruction de mappage SQL.

Les éléments SQL dynamiques sont similaires aux processeurs de texte basés sur JSTL ou XML. Dans les versions précédentes de MyBatis, de nombreux éléments prenaient du temps à comprendre. MyBatis 3 a grandement simplifié les types d'éléments. Il ne vous reste plus qu'à apprendre la moitié des éléments originaux. MyBatis utilise de puissantes expressions basées sur OGNL pour éliminer la plupart des autres éléments.

Préparation

Créez d'abord la classe d'entité Utilisateur

public class User {
    private Integer id;
    private String username;
    private String userEmail;
    private String userCity;
    private Integer age;}
Copier après la connexion

Créez la table utilisateur

CREATE TABLE user (
  id int(11) NOT NULL AUTO_INCREMENT,
  username varchar(255) DEFAULT NULL,
    user_email varchar(255) DEFAULT NULL,
    user_city varchar(255) DEFAULT NULL,
    age int(11) DEFAULT NULL,
  PRIMARY KEY (id))
Copier après la connexion

if

Définir la méthode d'interface

public List<User> findByUser(User user);
Copier après la connexion

La définition Mapper.xml correspondant à l'interface est la suivante

<select id="findByUser" resultType="com.example.mybatis.entity.User">
    select
    id, username, user_email userEmail, user_city userCity, age
    from user
    where    <if test="username != null and username != &#39;&#39;">
        username = #{username}    </if>
    <if test="userEmail != null and userEmail != &#39;&#39;">
        and user_email = #{userEmail}    </if>
    <if test="userCity != null and userCity != &#39;&#39;">
        and user_city = #{userCity}    </if></select>
Copier après la connexion

Si le test sur la balise if est vrai, alors l'instruction SQL dans la balise if sera Splicing.

Si le nom d'utilisateur, userEmail et userCity ne sont pas vides, alors le SQL sera épissé comme suit

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ? and user_email = ? and user_city = ?
Copier après la connexion

Si seul le nom d'utilisateur n'est pas vide, alors le SQL sera épissé comme suit follow

select id, username, user_email userEmail, user_city userCity, age 
from user where username = ?
Copier après la connexion

Cependant, cette méthode présente un inconvénient. Supposons que le nom d'utilisateur soit vide à ce moment-là, userEmail et userCity ne sont pas vides.

Analysons le code SQL dynamique. Maintenant, aucune valeur n'est attribuée au nom d'utilisateur, c'est-à-dire username==null, donc le code "username=#{username}" ne sera pas ajouté à l'instruction SQL, donc le Dynamic SQL épissé final ressemble à ceci :

select id, username, user_email userEmail, user_city userCity, age 
from user where and user_email = ? and user_city = ?
Copier après la connexion

where est directement suivi de et, ce qui est une erreur de syntaxe évidente. Dans ce cas, le where qui suit immédiatement and doit être supprimé. Pour résoudre ce problème, vous pouvez utiliser la balise where.

where

Modifiez le SQL ci-dessus par le

    <select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age        from user
        <where>
            <if test="username != null and username != &#39;&#39;">
                username = #{username}
            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}
            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                and user_city = #{userCity}
            </if>
        </where>
    </select>
Copier après la connexion

Si la balise where dans la balise if remplit les conditions, alors la balise where sera fusionnée dans une instruction Where. Si le SQL épissé avec la balise if a une instruction and au début, alors le et sera supprimé. En utilisant cette méthode, les mots-clés inutiles dans SQL seront automatiquement supprimés, donc généralement si les balises et où les balises sont utilisées en combinaison.

trim

trim Les attributs prefix et suffix de la balise seront utilisés pour générer l'instruction SQL réelle, qui sera épissée avec la déclaration à l'intérieur de la balise .

Si la valeur spécifiée dans l'attribut prefixOverrides ou suffixOverrides est rencontrée avant ou après la déclaration, MyBatis les supprimera automatiquement. Lorsque vous spécifiez plusieurs valeurs, n'oubliez pas de laisser un espace après chaque valeur pour vous assurer qu'elle ne sera pas connectée au SQL ultérieur.

préfixe : Ajouter un préfixe à l'instruction SQL épissée

suffixe : Ajouter un suffixe à l'instruction SQL épissée

prefixOverrides : Si prefixOverrides est rencontré avant l'instruction SQL épissée, MyBatis les supprimera automatiquement

suffixOverrides : Si suffixOverrides est rencontrés après l'instruction SQL épissée, MyBatis les supprimera automatiquement

Utilisez la balise trim ci-dessous pour implémenter la fonction de la balise where

<select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <trim prefix="where" prefixOverrides="and">
            <if test="username != null and username != &#39;&#39;">
                username = #{username}            </if>
            <if test="userEmail != null and userEmail != &#39;&#39;">
                and user_email = #{userEmail}            </if>
            <if test="userCity != null and userCity != &#39;&#39;">
                and user_city = #{userCity}            </if>
        </trim>
    </select>
Copier après la connexion

Si le nom d'utilisateur est vide, userEmail et userCity ne sont pas vides, alors la balise if L'instruction SQL épissée est la suivante

and user_email = #{userEmail} and user_city = #{userCity}
Copier après la connexion

Parce que la balise trim est définie avec prefixOverrides="and", et le SQL ci-dessus a un et instruction devant, donc l'instruction ci-dessus et l'instruction doivent être supprimées, et parce que trimL'étiquette est définie avec préfixe="where", vous devez donc ajouter une instruction Where devant l'instruction SQL épissée

Enfin, l'instruction SQL de la balise trim est épissée comme suit

where user_email = #{userEmail} and user_city = #{userCity}
Copier après la connexion

choisir

Parfois, nous ne voulons pas appliquer à toutes les instructions conditionnelles, mais je veux juste en choisir une. Pour cette situation, MyBatis fournit l'élément Choose, qui ressemble un peu à l'instruction switch en Java. La balise

<select id="findByUser" resultType="com.example.mybatis.entity.User">
        select
        id, username, user_email userEmail, user_city userCity, age
        from user        <where>
            <choose>
                <when test="username != null and username != &#39;&#39;">
                    username = #{username}                </when>
                <when test="userEmail != null and userEmail != &#39;&#39;">
                    and user_email = #{userEmail}                </when>
                <when test="userCity != null and userCity != &#39;&#39;">
                    and user_city = #{userCity}                </when>
            </choose>
        </where>
    </select>
Copier après la connexion

set

set est utilisée pour l'opération de mise à jour et générera automatiquement des instructions SQL basées sur la sélection des paramètres.

L'interface est définie comme suit

public int updateUser(User user);
Copier après la connexion

La définition Mapper.xml correspondante de l'interface est la suivante

<update id="updateUser" parameterType="com.example.mybatis.entity.User">
       update user       <set>
           <if test="username != null and username != &#39;&#39;">
               username=#{username},           </if>
           <if test="userEmail != null and userEmail != &#39;&#39;">
               user_email=#{userEmail},           </if>
           <if test="userCity != null and userCity != &#39;&#39;">
               user_city=#{userCity},           </if>
           <if test="age != null">
              age=#{age}           </if>
       </set>
       where id=#{id}    </update>
Copier après la connexion

foreach

La balise foreach peut être itérée Générer une série de valeurs

*pour SQL dans l'instruction*

接口定义如下所示

public List<User> getUsersByIds(List<Integer> ids);
Copier après la connexion

接口对应的 Mapper.xml 定义如下所示

<!--
        collection: 指定要遍历的集合
            默认情况下
                如果为Collection类型的,key为collection;
                如果为List类型的,key为list
                如果是数组类型,key为array
            可以通过@Param("ids")来指定key
        item: 将当前遍历的元素赋值给指定的变量
        open: 给遍历的结果添加一个开始字符
        close: 给遍历的结果添加一个结束字符
        separator: 每个元素之间的分隔符
    --><select id="getUsersByIds"
        resultType="com.example.mybatis.entity.User">
    select * from user
    where id in    <foreach collection="list" item="id" open="(" close=")" separator=",">
        #{id}    </foreach></select>
Copier après la connexion

用于批量插入

接口定义如下所示

public int addUserList(List<User> users);
Copier après la connexion

接口对应的 Mapper.xml 定义如下所示

<insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    insert into user
    (username, user_email, user_city, age)
    values    <foreach item="user"  collection="list" separator=",">
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--返回自增主键--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User"
        useGeneratedKeys="true"
        keyProperty="id">
    insert into user
    (username, user_email, user_city, age)
    values    <foreach item="user"  collection="list" separator=",">
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--还可以这样写--><!--
    这种方式需要数据库连接属性设置allowMultiQueries=true
    这种分号分隔多个SQL还可以用于其他的批量操作,如修改、删除
--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    <foreach item="user"  collection="list" separator=";">
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age})    </foreach></insert><!--如果是Oracle数据库,则需要这样写--><insert id="addUserList"
        parameterType="com.example.mybatis.entity.User">
    <foreach item="user" open="begin" close="end;"  collection="list">
        insert into user
        (username, user_email, user_city, age)
        values
        (#{user.username}, #{user.userEmail}, #{user.userCity}, #{user.age});    </foreach></insert>
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal