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
CourseMapperpour 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.xmlpour effectuer une recherche approximative sur la colonneteacheret trier les résultats par numéro de cours dans l'ordre décroissant - Tester l'implémentation de
CourseMapperdans la classeMyBatisTestpour 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.
- Ouvrez le fichier
CourseMapper.javasitué dans le packageorg.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.
- Ouvrez le fichier
CourseMapper.xmlsitué dans le répertoiresrc/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.
- Ouvrez le fichier
MyBatisTest.javasitué dans le packageorg.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 :
- 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
- Accédez au répertoire du projet
MyBatisCourseDemoen utilisant la commande suivante :
cd ~/project/MyBatisCourseDemo/
- 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.



