Interprétation détaillée du framework MyBatis Persistence Layer : formation pratique pour ajouter, supprimer, modifier et vérifier les fichiers de configuration

1. Introduction

Auparavant, nous avons appris la méthode de développement native du framework de couche de persistance MyBatis et la méthode de développement de l'agent Mapper, qui ont résolu les problèmes de codage en dur et d'opérations fastidieuses lors de l'utilisation du code de base JDBC pour faire fonctionner la base de données. Maintenant que le retour apporté par l'article n'est pas mauvais, profitons du contenu appris plus tôt pour faire une formation cas pratique aujourd'hui.

Avec le recul, pourquoi utilisons-nous MyBatis pour développer ? Il n'est pas difficile de comprendre que MyBatis, en tant qu'excellent framework de couche de persistance, prend en charge SQL personnalisé, les procédures stockées et le mappage avancé. Il élimine presque tous les codes JBDC et le travail de définition des paramètres et d'obtention des ensembles de résultats. Il résout le problème du codage en dur et du fonctionnement fastidieux du code Java lors de l'utilisation du code de base JBDC pour faire fonctionner la base de données, comme illustré dans la figure :

L'objectif pédagogique du cas dans cette section : être capable d'utiliser le fichier de configuration pour réaliser l'opération d'ajout, de suppression, de modification et de vérification.

2. Préparatifs

Aujourd'hui nous utilisons MyBatis pour compléter l'ajout, la suppression, la modification et l'interrogation de données dans la base de données.La mise en œuvre spécifique est la suivante :

  • Interroger les données
    • interroger toutes les données
    • Interroger les détails des données
    • requête conditionnelle
  • ajout de données
  • modifier les données
    • Modifier tous les champs
    • Modifier les champs dynamiques
  • Suprimmer les données
    • Suppression des données individuelles
    • Suppression de données en masse

Le cas d'aujourd'hui reçoit un tableau de données sur les étudiants, y compris l'identifiant de l'étudiant, le nom, le sexe, les notes et d'autres informations sur le terrain, via MyBatis pour ajouter, supprimer, modifier et interroger les données dans la base de données. En raison de la longueur de l'article, cette série d'articles est divisée en deux articles. Le premier article explique l'opération de requête, et le dernier article concerne les ajouts, les suppressions et les modifications. Si vous êtes intéressé par cette partie du contenu, veuillez passer à l'article suivant.

Tout d'abord, nous devons créer une table de base de données et ajouter des données. Les instructions SQL impliquées sont les suivantes :

drop table if exists student;

create table student(
	id int primary key auto_increment,
	name varchar(10),
	gender char(1),
	score_english int,
	score_math int
);

insert into student(name,gender,score_english,score_math) values
('张三','男',61,65),
('李四','女',45,38),
('王五','男',85,53),
('小王','男',56,58),
('小樊','女',85,92);

Le tableau de données est le suivant :

image-20230129193400530

Ensuite, créez la classe d'entités Student sous le org.chengzi.pojopackage :

public class Student{
    
    
    //id 主键
    private int id;
    //学生姓名
    private String name;
    //学生性别
    private String gender;
    //学生英语成绩
    private int scoreEnglish;
    //学生数学成绩
    private int scoreMath;
    
    //这里省略了Getter and Setter方法和重写的Object中的toString方法
}

Ensuite, écrivez le cas de test, écrivez le code de test unitaire dans Test ici et créez la classe MyBatisTest dans le répertoire du fichier Java du code de test. Comme indiqué sur l'image :

image-20230129194459753

Afin d'améliorer l'efficacité du développement de MyBatis, nous installons le plug-in MyBatisX . Ce plug-in a deux fonctions principales. La première est le saut mutuel entre le fichier de configuration du mapping XML et l'interface du Mapper, et la seconde est de automatiquement générer une instruction selon la méthode d'interface Mapper, comme illustré dans la figure :

image-20230129194834069

Recherchez le plugin MyBatisX dans File/setting/plugins pour le télécharger et l'installer.

L'image bleue représente le fichier d'interface Mapper et l'icône rouge représente le fichier de configuration de mappage SQL. À l'aide de ce plug-in, vous pouvez définir des méthodes dans l'interface Mapper, générer automatiquement des instructions dans le fichier de configuration et passer rapidement au Mapper correspondant. interface dans le fichier de configuration. Je pense que ce plug-in est très efficace dans le développement de MyBatis, et je l'utilise depuis que j'ai appris MyBatis.

3. Interrogez toutes les données

Dans la page client, nous avons généralement besoin d'afficher toutes les informations sur les données. À ce stade, le code sous-jacent consiste à utiliser Java pour exploiter la base de données, interroger toutes les informations et les envoyer à la page client.

Nous pouvons interroger toutes les informations en suivant les étapes suivantes :

  • Ecrire l'interface Mapper
    • Paramètres : aucun
    • résultat:List<Student>
  • Écrire le fichier de configuration de mappage sql
  • Écrire et exécuter le code de test

Lors de l'analyse des méthodes dans l'interface Mapper, il s'agit principalement d'analyser si les paramètres et les types de valeur de retour sont requis en fonction des exigences des données d'exploitation.

3.1 Écrire des méthodes d'interface

Créez une interface StudentMapper dans le org.chengzi.mapperpackage et définissez une méthode pour interroger toutes les données des étudiants dans cette interface :

public interface StudentMapper {
    
    
    /*
    需求:查询所有学生信息
     */
    List<Student> selectAll();

}

3.2 Écrire une instruction sql

Créez une structure de répertoires sous le chemin des ressources org/chengzi/mapper, et le séparateur de chemin doit être utilisé /pour garantir que l'interface Mapper et le fichier de configuration de mappage sql correspondant se trouvent dans le même répertoire de fichiers. Créez le fichier de configuration StudentMapper.xml dans ce répertoire.

Après avoir écrit la méthode correspondante dans l'interface StudentMapper, via l'icône du plug-in MyBatisX, nous pouvons passer rapidement au fichier de configuration de mappage sql correspondant, et l'instruction est automatiquement générée. Écrivez une instruction SQL pour interroger toutes les informations sur les étudiants dans le fichier de configuration de mappage SQL :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.chengzi.mapper.StudentMapper">
    <select id="selectAll" resultType="student">
        select *
        from student;
    </select>
</mapper>

3.3 Rédaction des méthodes de test

Dans la classe MyBatisTest, écrivez le code pour tester et interroger toutes les informations des élèves, comme suit :

public class MyBatisTest {
    
    
    @Test
    public void testSelectAll() throws IOException {
    
    
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        //4. 执行方法
        List<Student> students = studentMapper.selectAll();
        System.out.println(students);

        //5. 释放资源
        sqlSession.close();
    }
}

Après avoir appris le framework SSM à l'avenir, cette partie du code deviendra très simple. L'accent est mis ici sur la seule ligne de code qui exécute la méthode.

résultat de l'opération :

image-20230129202650613

On constate ici que les informations de certains champs de la base de données ne sont pas encapsulées dans l'objet Java. La raison du problème est très simple, car les noms de colonnes des tables de la base de données sont incohérents avec les noms d'attributs des classes d'entités dans le code Java. Par exemple, les résultats en mathématiques des élèves, dans MySQL La méthode nommée score_math est utilisée en Java, mais elle s'appelle scoreMath en Java, et il n'y a aucun problème avec les deux méthodes de nommage.

Il existe deux manières de résoudre ce problème :

  1. Crénelage des noms de champ de la table de données
  2. Utilisez resultMap pour définir la relation de mappage entre les noms de champs et les noms d'attributs

Par example:

<mapper namespace="org.chengzi.mapper.StudentMapper">
    <select id="selectAll" resultType="student">
        select id,name,gender,score_english as scoreEnglish,score_Math as scoreMath
        from student;
    </select>
</mapper>

À ce stade, le problème selon lequel les données ne peuvent pas être encapsulées dans des objets a été résolu, mais lors de l'interrogation de toutes les informations sur les étudiants, nous devons répertorier tous les noms de champs, ce qui est évidemment inefficace et déconseillé. MyBatis fournit des fragments sql pour résoudre ce problème.

Par example:

<mapper namespace="org.chengzi.mapper.StudentMapper">
    <!--
	sql片段
	-->
    <sql id="student_column">
        select id,name,gender,score_english as scoreEnglish,score_Math as scoreMath
    </sql>
    
    <select id="selectAll" resultType="student">
        <include refid="student_column"/>
        from student;
    </select>
</mapper>

L'id est utilisé comme identifiant unique du fragment sql, et il suffit d'utiliser la <include>référence d'étiquette dans l'instruction sql d'origine lors de son utilisation.

C'est un autre problème.Si vous travaillez sur certains champs de la table de données, alors il y aura un grand nombre de fragments sql, ce qui n'est évidemment pas conseillé.All MyBatis utilise la méthode resultMap pour résoudre ce problème.

3.4 Utilisation de resultMap

Lors de la résolution du problème selon lequel certains champs de la table de données ne peuvent pas être encapsulés dans des objets Java, la méthode d'utilisation des alias est inefficace et la méthode des fragments sql n'est pas flexible. MyBatis fournit la méthode resultMap pour définir la relation de mappage entre les noms de champs et noms d'attributs.

Lors de l'utilisation, il vous suffit d'utiliser la méthode suivante pour définir dans le fichier de configuration du mappage sql :

<mapper namespace="org.chengzi.mapper.StudentMapper">

    <resultMap id="studentResultMap" type="student">
        <result column="score_english" property="scoreEnglish"/>
        <result column="score_math" property="scoreMath"/>
    </resultMap>
    
    <select id="selectAll" resultMap="studentResultMap">
     select *
        from student;
    </select>
</mapper>

Lorsque vous utilisez cette méthode, il suffit de mapper la partie du nom de champ dans la table de données qui est différente de l'attribut dans la classe d'entité Java, ce qui améliore considérablement l'efficacité. L'id dans la balise resultMap est utilisé comme identifiant unique et utilisé dans l'instruction.

Dans resultMap, deux balises sont disponibles, pour le mappage aux données générales et pour le mappage aux données de clé primaire.

Exécutez le programme :

image-20230129210333422

Les données de la table de données ont toutes été encapsulées dans des objets Java.

4. Détails de la demande

Dans le client, les données ne sont souvent pas affichées en totalité, mais en partie, et l'autre partie doit généralement être visualisée de manière à visualiser les détails. À ce moment, lorsque l'utilisateur sélectionne l'étudiant spécifié et vérifie les informations, l'identifiant de l'étudiant est envoyé au code Java et toutes les informations de l'étudiant sont interrogées via l'identifiant de l'utilisateur.

Nous pouvons implémenter la fonction de détails de la requête en procédant comme suit :

  • Écrivez l'interface Mapper :
    • Paramètre : identifiant
    • Valeur de retour : Étudiant
  • Écrire le fichier de mappage sql
  • Exécuter la méthode de test

Lors de l'interrogation des détails, il est souvent nécessaire de transmettre un paramètre, tel que l'identifiant, pour interroger toutes les informations de l'étudiant en fonction de l'identifiant, et le résultat renvoyé n'est qu'un seul enregistrement de données, il suffit donc de l'encapsuler dans un chose.

4.1 Écrire des méthodes d'interface

Définissez la méthode de requête de données basée sur l'identifiant dans l'interface StudentMapper :

/**
  * 查看详情:根据Id查询
  */
Student selectById(int id);

4.2 Écrire une instruction sql

Grâce à la fonction de saut rapide de MyBatisX, sautez vers le fichier de configuration de mappage sql correspondant.A ce moment, l'instruction a été générée automatiquement et le resultMap précédemment défini peut être directement utilisé.

<select id="selectById"  resultMap="studentResultMap">
    select *
    from student where id = #{id};
</select>

Ce qui précède est #{id}un espace réservé de paramètre, similaire à celui utilisé avant , qui sera expliqué plus tard.

4.3 Rédaction des méthodes de test

Dans la classe MyBatisTest, écrivez le code pour tester et interroger toutes les informations des élèves, comme suit :

@Test
    public void testSelectById() throws IOException {
    
    
        //接收参数
        int id =2;
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        //4. 执行方法
        Student students = studentMapper.selectById(id);
        System.out.println(students);

        //5. 释放资源
        sqlSession.close();
    }

À ce stade, contrairement à la requête précédente de toutes les informations sur les étudiants, les paramètres et les valeurs de retour de cette méthode sont différents. Nous n'avons qu'à transmettre les paramètres reçus par le code Java, puis nous pouvons encapsuler les données interrogées dans un objet de classe Student.

résultat de l'opération :

image-20230129212902381

4.4 Espaces réservés pour les paramètres

Comme mentionné précédemment, l'instruction sql est utilisée #{xx}comme espace réservé de paramètre, et vous pouvez voir dans le journal d'exécution qu'en fait, Java remplace automatiquement la position de l'espace réservé de paramètre par pendant le processus d'exécution , ce qui résout l'injection sql causée par l'orthographe des chaînes sql question . Comme indiqué sur l'image :

image-20230129213409241

En fait, l'espace réservé dans MyBatis peut #{xx}également ${xx}, ce qui est facile à causer des problèmes d'injection sql lors de l'orthographe des chaînes, il est donc généralement utilisé après le from de l'instruction sql lorsque le nom de la table de la requête est incertain.

Il n'est pas difficile de trouver que la différence entre les deux réside dans le fait que #{xx}la couche inférieure de l'espace réservé est préparéeStatement, tandis que ${xx}la est déclaration, ce qui pose le problème de l'injection sql. Par conséquent, il est recommandé d'utiliser le premier comme espace réservé de paramètre dans le développement de MyBatis.

4.5 Utilisation du type de paramètre

S'il existe des paramètres dans la méthode de l'interface Mapper, parameterType doit être configuré dans le fichier de mappage sql correspondant pour spécifier le type de données du paramètre, mais cet attribut peut être omis. Il n'est pas difficile de comprendre que la raison pour laquelle il peut être omis est que le type de données de ce paramètre a été défini dans le fichier d'interface Mapper.

comme suit:

<mapper>   
	<select id="selectById" parameterType="int" resultMap="studentResultMap">
select * from student where id=#{id};
    </select>
</mapper>

4.6 Manipulation des caractères spéciaux

Lorsque MyBatis écrit sql dans le fichier de configuration du mapping sql correspondant, certains caractères spéciaux apparaîtront, par exemple, lorsque le signe moins que est utilisé, il sera confondu avec la <partie de . Comme indiqué sur l'image :

image-20230129233235106

MyBatis fournit également une méthode correspondante pour résoudre ce problème, vous pouvez utiliser ces deux méthodes :

  1. Caractère d'échappement : utilisé lorsqu'il y a peu de caractères spéciaux
  2. CDATE : à utiliser lorsqu'il y a beaucoup de caractères spéciaux déroutants

Par exemple en utilisant des caractères d'échappement :

image-20230129234459723

Ou utilisez la méthode CDATA :

image-20230129234642325

Lors de l'utilisation d'un IDE avec la fonction d'auto-complétion du code, seule une partie de l'entrée est requise pour l'auto-complétion. Cette méthode est utilisée lorsqu'il y a beaucoup de caractères spéciaux.

5. Requête multi-conditions

Dans le fonctionnement réel du client, nous interrogeons souvent des données basées sur la satisfaction simultanée de plusieurs conditions, telles que l'interrogation des informations de tous les étudiants dont les scores en anglais et en mathématiques sont tous deux supérieurs à 60 dans le cas de la requête.

L'accent est mis ici sur la manière d'écrire des instructions SQL.

Nous pouvons implémenter la fonction de détails de la requête en procédant comme suit :

  • Ecrire l'interface Mapper
    • Paramètres : toutes les conditions de requête
    • résultat:List<Student>
  • Écrire le fichier de configuration de mappage sql
  • Exécuter la méthode de test

5.1 Écrire des méthodes d'interface

Pour définir la méthode de requête multi-conditions dans l'interface StudentMapper, des paramètres doivent également être définis lors de la définition de l'interface.MyBatis dispose de plusieurs méthodes de mise en œuvre pour plusieurs paramètres de requête multi-conditions.

Première méthode :

Utilisez pour @Param("参数名称")marquer chaque paramètre, qui doit être utilisé dans le fichier de configuration de mappage en tant #{参数名称}qu'espace réservé

List<Student> selectByCondition(@Param("scoreEnglish") int scoreEnglish, @Param("scoreMath") int scoreMath);

Deuxième méthode :

Encapsulez plusieurs paramètres dans un objet entité et utilisez l'objet entité comme paramètre de méthode de l'interface. Cette méthode nécessite que, #{内容}lorsqu'elle est , le contenu à l'intérieur soit cohérent avec le nom d'attribut de la classe d'entité.

List<Student> selectByCondition(Student student);

Méthode trois :

Encapsulez plusieurs paramètres dans la collection de cartes et utilisez la collection de cartes comme paramètre de méthode de l'interface. Cette méthode nécessite que, #{内容}lorsqu'elle est , le contenu à l'intérieur soit cohérent avec le nom de la clé dans la collection de cartes.

List<Student> selectByCondition(Map map);

5.2 Écrire une instruction sql

Écrivez l'instruction correspondante dans le fichier StudentMapper.xml, où resultMap est également utilisé. Exemple:

<mapper> 
	<select id="selectByCondition" resultMap="studentResultMap">
        select * from student 
                 where score_english > #{scoreEnglish} and score_math > #{scoreMath};
    </select>
</mapper>

5.3 Rédaction des méthodes de test

Dans les requêtes multiconditions, étant donné qu'il existe trois méthodes différentes de définition des paramètres lors de la définition de l'interface Mapper, les méthodes d'exécution spécifiques ici sont également divisées en trois méthodes différentes.

    @Test
    public void testSelectByCondition() throws IOException {
    
    
        //接收参数
        int scoreEnglish=60;
        int scoreMath=60;
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        //4. 执行方法
        //方法1.使用第一种方法定义参数时使用
        List<Student> students = studentMapper.selectByCondition(scoreEnglish,scoreMath);
        System.out.println(students);
        
        //方法2.使用第二种方法定义参数时使用
        Student student = new Student();
        student.setScoreEnglish(scoreEnglish);
        student.setScoreMath(scoreMath);

        List<Student> students = studentMapper.selectByCondition(student);
        System.out.println(students);
        
        //方法3.使用第三种方法定义参数时使用
        Map map = new HashMap();
        map.put("scoreEnglish" , scoreEnglish);
        map.put("scoreMath" , scoreMath);
        
        List<Student> students = studentMapper.selectByCondition(map);
        System.out.println(students);
        //5. 释放资源
        sqlSession.close();
    }
}

En utilisant trois méthodes pour exécuter le programme, les résultats sont les mêmes, comme le montre la figure :

image-20230129224312015

5.4 SQL dynamique

Ci-dessus, nous avons défini trois paramètres dans la requête multi-conditions et transmis trois paramètres lors de l'exécution du programme de test. Cependant, la réalité est que l'utilisateur ne peut pas entrer une valeur pour chaque paramètre, et à ce moment il y a un problème avec le sql ci-dessus.

Lorsque l'utilisateur saisit deux paramètres, l'instruction SQL est la suivante :

select * from student where score_english > #{scoreEnglish} and score_math > #{scoreMath};

Lorsque l'utilisateur ne saisit qu'une seule condition, l'instruction sql est la suivante :

select * from student where score_english > #{scoreEnglish} ;

Pour ce problème, MyBatis a une solution puissante :

  • si
  • choisir (quand, sinon)
  • garniture (où, ensemble)
  • pour chaque

Par exemple, utilisez la méthode suivante pour résoudre :

<select id="selectByCondition" resultMap="studentResultMap">
     select * from student 
     where
        <if test="scoreEnglish !=null">
              score_english > #{scoreEnglish}
        </if>
		<if test="scoreMath !=null">
              and score_math > #{scoreMath}
        </if>

</select>

En utilisant cette méthode, les chaînes seront épissées dynamiquement lors de l'exécution du programme. Si les deux données sont transmises, l'épissure de l'instruction sql est la suivante :

image-20230129231539021

Et si l'utilisateur ne passe pas cette dernière valeur, alors le programme s'exécute aussi normalement, la chaîne sql à ce moment :

image-20230129231659101

Mais si le premier n'a pas de données d'entrée et que seul le second a fourni des données, le programme aura une erreur, car lors de l'épissage des chaînes sql, et apparaîtra après où, et l'erreur de syntaxe sql se produira à ce moment. comme suit:

select * from student where and scoreMath > ? ;//语法错误

Ce problème peut être résolu en utilisant la balise where, qui peut remplacer le mot-clé where, et le et après la première condition sera supprimé dynamiquement. Si tous les paramètres n'ont pas de valeur donnée, le mot-clé where ne sera pas utilisé.

Remarque : À ce stade, vous devez ajouter le mot-clé et à chaque condition, et le mot-clé et <where>après la première condition sera supprimé dynamiquement.

À ce stade, le programme s'exécute avec succès et résout le problème selon lequel l'utilisateur ne peut pas saisir de valeurs pour tous les paramètres. Comme indiqué sur l'image :

image-20230129232606376

6. Requête à condition unique de SQL dynamique

Dans le client, parfois l'utilisateur peut choisir une requête conditionnelle, mais le code Java ne sait pas quelle condition choisir, il est donc nécessaire d'utiliser la seule requête conditionnelle de sql dynamique.

Une telle exigence peut être implémentée à l'aide de la choose(when,otherwise)balise , et l'utilisation de la balise choose est similaire à l'instruction Switch en Java.

6.1 Ecrire des méthodes d'interface

La méthode de requête à condition unique d'écriture SQL dynamique dans l'interface Mapper :

List<Student> selectByConditionSingle(Map map);

6.2 Écrire une instruction sql

Écrivez les instructions sql dans le fichier de configuration de mappage sql, comme suit :

<mapper>    
    <select id="selectByConditionSingle" resultMap="studentResultMap">

        select * from student
        <where>
            <choose>
                <when test="scoreEnglish !=null">
                    score_english > #{scoreEnglish}
                </when>
                <when test="scoreMath !=null">
                    score_math > #{scoreMath}
                </when>
                <otherwise>
                    1=1
                </otherwise>
            </choose>
        </where>
    </select>
</mapper>

6.3 Rédaction des méthodes de test

Ecrivez le code du test unitaire dans la classe MyBatisTest, comme suit :

@Test
    public void testSelectByConditionSingle() throws IOException {
    
    
        //接收参数
        int scoreEnglish=60;
        int scoreMath=60;
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        Map map = new HashMap();
        map.put("scoreEnglish" , scoreEnglish);
        //map.put("scoreMath" , scoreMath);

        List<Student> students = studentMapper.selectByConditionSingle(map);
        System.out.println(students);
        //5. 释放资源
        sqlSession.close();
    }

Le résultat courant est correct, comme le montre la figure :

image-20230130013053973

7. Résumé

Cet article est un exercice pratique de développement MyBatis et d'utilisation de fichiers de configuration pour mettre en œuvre des opérations d'ajout, de suppression, de modification et d'interrogation. En raison de la longueur de l'article, cet article ne concerne que les opérations d'interrogation. En tant que méthode la plus courante d'exploitation des bases de données, les opérations de requête doivent être pratiquées en permanence pour devenir efficaces. Lors de l'écriture de SQL, bien que les majuscules ne soient pas soulignées, il est recommandé d'utiliser des majuscules, car la capitalisation est une méthode SQL plus standardisée.

J'ai fini d'écrire, j'ai vérifié l'heure, il est maintenant deux heures du matin, je viens de finir d'écrire cet article, et il faisait extraordinairement calme dehors. La création n'est pas facile, j'espère que cela pourra vous aider. Aimez-le d'abord, regardez-le plus tard, faites-en une habitude et rendez-vous dans le prochain numéro.

image-20230130001121015

Je suppose que tu aimes

Origine blog.csdn.net/zhangxia_/article/details/128796222
conseillé
Classement