Projet d'intégration de base de données MyBatis

JavaBeginner
Pratiquer maintenant

Introduction

Dans ce projet, vous allez apprendre à utiliser MyBatis, un framework de persistance Java populaire, pour interagir avec une base de données MySQL. Plus précisément, vous allez apprendre à utiliser des paramètres d'entrée dans des requêtes SQL et à récupérer des informations sur les cours en fonction du nom du professeur.

👀 Aperçu

[labex] DEBUG [main] - Définition de l'autocommit sur false pour la connexion JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Préparation: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Paramètres: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Numéro de cours: 3        Nom du cours: Python     Professeur: Liam
Numéro de cours: 1        Nom du cours: HTML       Professeur: Amy

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Implémenter l'interface CourseMapper pour définir une méthode de récupération de cours en fonction du nom du professeur
  • Écrire la requête SQL dans le fichier CourseMapper.xml pour effectuer une recherche approximative sur la colonne teacher et trier les résultats par numéro de cours dans l'ordre décroissant
  • Tester l'implémentation de CourseMapper dans la classe MyBatisTest pour vous assurer de la fonctionnalité souhaitée

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Utiliser MyBatis pour interagir avec une base de données MySQL
  • Passer des paramètres d'entrée à des requêtes SQL à l'aide d'un Map
  • Effectuer une recherche approximative sur une colonne de base de données et trier les résultats
  • Tester la fonctionnalité d'un mappeur MyBatis à l'aide d'un cas de test JUnit

Implémenter l'interface CourseMapper

Dans cette étape, vous allez implémenter l'interface CourseMapper pour récupérer des informations sur les cours en fonction du nom du professeur.

  1. Ouvrez le fichier CourseMapper.java situé dans le package org.labex.mapper.
package org.labex.mapper;

import java.util.List;
import java.util.Map;

import org.labex.pojo.Course;

public interface CourseMapper {
    List<Course> getCoursesByTeacherName(Map<String, Object> params);
}

L'interface CourseMapper définit une méthode getCoursesByTeacherName qui prend une Map en tant que paramètre d'entrée. Cette méthode sera utilisée pour récupérer les cours dont le nom du professeur contient la valeur spécifiée.

Implémenter la requête SQL dans le fichier Mapper XML

Dans cette étape, vous allez implémenter la requête SQL dans le fichier CourseMapper.xml pour récupérer les cours en fonction du nom du professeur.

  1. Ouvrez le fichier CourseMapper.xml situé dans le répertoire src/main/java/org/labex/mapper.
<?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.labex.mapper.CourseMapper">
    <select id="getCoursesByTeacherName" parameterType="java.util.HashMap" resultType="org.labex.pojo.Course">
        SELECT * FROM course
        WHERE teacher LIKE CONCAT('%', #{teacherName}, '%')
        ORDER BY cNo DESC
    </select>
</mapper>

L'élément <select> définit la requête SQL qui sera exécutée lorsque la méthode getCoursesByTeacherName est appelée. L'attribut parameterType spécifie que le paramètre d'entrée est un HashMap, et l'attribut resultType spécifie que le résultat sera mappé sur la classe Course.

La requête SQL utilise l'opérateur LIKE avec la fonction CONCAT pour effectuer une recherche approximative sur la colonne teacher, où le nom du professeur contient la valeur teacherName spécifiée. Les résultats sont ensuite triés par ordre décroissant de la colonne cNo (numéro de cours).

Tester CourseMapper dans la classe MyBatisTest

Dans cette étape, vous allez tester l'implémentation de CourseMapper en créant un cas de test dans le fichier MyBatisTest.java.

  1. Ouvrez le fichier MyBatisTest.java situé dans le package org.labex.test.
package org.labex.test;

import java.io.IOException;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.labex.mapper.CourseMapper;
import org.labex.pojo.Course;

public class MyBatisTest {

    SqlSessionFactory sessionFactory = null;
    SqlSession session = null;

    @Before
    public void before() throws IOException{
        String resource = "mybatis-config.xml";
        // Charger le fichier de configuration MyBatis
        Reader reader = Resources.getResourceAsReader(resource);
        // Créer la factory SqlSession
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        // Créer un objet SqlSession capable d'exécuter des instructions SQL dans le fichier de mapping SQL
        session = sessionFactory.openSession();
    }

    @Test
    public void testCourseMapper() {
        CourseMapper courseMapper = session.getMapper(CourseMapper.class);

        // Créer une carte de paramètres
        Map<String, Object> param = new HashMap<>();
        param.put("teacherName", "Am");

        // Appeler la méthode définie dans CourseMapper
        List<Course> courses = courseMapper.getCoursesByTeacherName(param);
        for (Course course : courses) {
            System.out.println(course);
        }
    }

    @After
    public void after() {
        session.close();
    }

}

Dans la méthode testCourseMapper, nous obtenons d'abord une instance de l'interface CourseMapper en utilisant session.getMapper(CourseMapper.class). Ensuite, nous créons un HashMap en tant que paramètre d'entrée et mettons la clé "teacherName" avec la valeur "Am".

Enfin, nous appelons la méthode getCoursesByTeacherName de CourseMapper et imprimons les objets Course récupérés.

Exécuter le cas de test

Pour exécuter le cas de test, suivez ces étapes :

  1. Dans votre terminal, utilisez la commande suivante pour démarrer la base de données MySQL et importer le fichier course.sql :
sudo service mysql start
mysql -u root < course.sql
  1. Accédez au répertoire du projet MyBatisCourseDemo en utilisant la commande suivante :
cd ~/project/MyBatisCourseDemo/
  1. Exécutez la commande suivante pour exécuter le cas de test :
mvn test

La sortie devrait être similaire à ceci :

[labex] DEBUG [main] - Définition de l'autocommit sur false pour la connexion JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Préparation: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Paramètres: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Numéro de cours: 3        Nom du cours: Python     Professeur: Liam
Numéro de cours: 1        Nom du cours: HTML       Professeur: Amy

Cela montre que la méthode getCoursesByTeacherName dans CourseMapper fonctionne comme prévu, en récupérant les cours dont le nom du professeur contient "Am" et en les triant par ordre décroissant de numéro de cours.

Résumé

Félicitations ! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.

✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer