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

Apprenez le SQL dynamique MyBatis

Dec 09, 2020 pm 05:46 PM
mybatis sql

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelle est la différence entre HQL et SQL dans le framework Hibernate ? Quelle est la différence entre HQL et SQL dans le framework Hibernate ? Apr 17, 2024 pm 02:57 PM

HQL et SQL sont comparés dans le framework Hibernate : HQL (1. Syntaxe orientée objet, 2. Requêtes indépendantes de la base de données, 3. Sécurité des types), tandis que SQL exploite directement la base de données (1. Normes indépendantes de la base de données, 2. Exécutable complexe requêtes et manipulation de données).

Utilisation de l'opération de division dans Oracle SQL Utilisation de l'opération de division dans Oracle SQL Mar 10, 2024 pm 03:06 PM

"Utilisation de l'opération de division dans OracleSQL" Dans OracleSQL, l'opération de division est l'une des opérations mathématiques courantes. Lors de l'interrogation et du traitement des données, les opérations de division peuvent nous aider à calculer le rapport entre les champs ou à dériver la relation logique entre des valeurs spécifiques. Cet article présentera l'utilisation de l'opération de division dans OracleSQL et fournira des exemples de code spécifiques. 1. Deux méthodes d'opérations de division dans OracleSQL Dans OracleSQL, les opérations de division peuvent être effectuées de deux manières différentes.

Comparaison et différences de syntaxe SQL entre Oracle et DB2 Comparaison et différences de syntaxe SQL entre Oracle et DB2 Mar 11, 2024 pm 12:09 PM

Oracle et DB2 sont deux systèmes de gestion de bases de données relationnelles couramment utilisés, chacun possédant sa propre syntaxe et ses propres caractéristiques SQL. Cet article comparera et différera la syntaxe SQL d'Oracle et de DB2, et fournira des exemples de code spécifiques. Connexion à la base de données Dans Oracle, utilisez l'instruction suivante pour vous connecter à la base de données : CONNECTusername/password@database Dans DB2, l'instruction pour vous connecter à la base de données est la suivante : CONNECTTOdataba.

Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Explication détaillée de la fonction Définir la balise dans les balises SQL dynamiques MyBatis Feb 26, 2024 pm 07:48 PM

Interprétation des balises SQL dynamiques MyBatis : explication détaillée de l'utilisation des balises Set MyBatis est un excellent cadre de couche de persistance. Il fournit une multitude de balises SQL dynamiques et peut construire de manière flexible des instructions d'opération de base de données. Parmi elles, la balise Set est utilisée pour générer la clause SET dans l'instruction UPDATE, qui est très couramment utilisée dans les opérations de mise à jour. Cet article expliquera en détail l'utilisation de la balise Set dans MyBatis et démontrera ses fonctionnalités à travers des exemples de code spécifiques. Qu'est-ce que Set tag Set tag est utilisé dans MyBati

Comment résoudre l'erreur 5120 dans SQL Comment résoudre l'erreur 5120 dans SQL Mar 06, 2024 pm 04:33 PM

Solution : 1. Vérifiez si l'utilisateur connecté dispose des autorisations suffisantes pour accéder ou utiliser la base de données, et assurez-vous que l'utilisateur dispose des autorisations appropriées ; 2. Vérifiez si le compte du service SQL Server est autorisé à accéder au fichier spécifié ou ; dossier et assurez-vous que le compte dispose des autorisations suffisantes pour lire et écrire le fichier ou le dossier ; 3. Vérifiez si le fichier de base de données spécifié a été ouvert ou verrouillé par d'autres processus, essayez de fermer ou de libérer le fichier et réexécutez la requête ; . Essayez en tant qu'administrateur, exécutez Management Studio en tant que etc.

Interprétation des paramètres de configuration de MyBatis Generator et bonnes pratiques Interprétation des paramètres de configuration de MyBatis Generator et bonnes pratiques Feb 23, 2024 am 09:51 AM

MyBatisGenerator est un outil de génération de code officiellement fourni par MyBatis, qui peut aider les développeurs à générer rapidement des JavaBeans, des interfaces Mapper et des fichiers de mappage XML conformes à la structure des tables de base de données. Dans le processus d'utilisation de MyBatisGenerator pour la génération de code, la définition des paramètres de configuration est cruciale. Cet article commencera du point de vue des paramètres de configuration et explorera en profondeur les fonctions de MyBatisGenerator.

Explication détaillée du cache de premier niveau MyBatis : Comment améliorer l'efficacité de l'accès aux données ? Explication détaillée du cache de premier niveau MyBatis : Comment améliorer l'efficacité de l'accès aux données ? Feb 23, 2024 pm 08:13 PM

Explication détaillée du cache de premier niveau MyBatis : Comment améliorer l'efficacité de l'accès aux données ? Au cours du processus de développement, un accès efficace aux données a toujours été l’une des priorités des programmeurs. Pour les frameworks de couche de persistance comme MyBatis, la mise en cache est l'une des méthodes clés pour améliorer l'efficacité de l'accès aux données. MyBatis fournit deux mécanismes de mise en cache : le cache de premier niveau et le cache de deuxième niveau. Le cache de premier niveau est activé par défaut. Cet article présentera en détail le mécanisme du cache de premier niveau MyBatis et fournira des exemples de code spécifiques pour aider les lecteurs à mieux comprendre

Explication détaillée de la configuration des requêtes un-à-plusieurs de MyBatis : résolution des problèmes de requêtes associés courants Explication détaillée de la configuration des requêtes un-à-plusieurs de MyBatis : résolution des problèmes de requêtes associés courants Feb 22, 2024 pm 02:18 PM

Explication détaillée de la configuration des requêtes un-à-plusieurs de MyBatis : Pour résoudre les problèmes de requêtes associés courants, des exemples de code spécifiques sont nécessaires. Dans le travail de développement réel, nous rencontrons souvent des situations dans lesquelles nous devons interroger un objet d'entité maître et ses multiples objets d'entité esclave associés. . Dans MyBatis, la requête un-à-plusieurs est une requête d'association de base de données courante avec une configuration correcte, l'interrogation, l'affichage et le fonctionnement des objets associés peuvent être facilement réalisés. Cet article présentera la méthode de configuration des requêtes un-à-plusieurs dans MyBatis et comment résoudre certains problèmes de requêtes courants associés.

See all articles