Einführung
In diesem Projekt lernst du, wie du MyBatis, einen beliebten Java-Persistence-Framework, verwendest, um mit einer MySQL-Datenbank zu interagieren. Insbesondere lernst du, wie du Eingabeparameter in SQL-Abfragen verwendest und Kursinformationen basierend auf dem Lehrer-Namen abrufst.
👀 Vorschau
[labex] DEBUG [main] - Autocommit auf false festlegen für die JDBC-Verbindung [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Vorbereiten: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameter: Am(String)
[labex] DEBUG [main] - <== Gesamt: 2
Kursnummer: 3 Kursname: Python Lehrer: Liam
Kursnummer: 1 Kursname: HTML Lehrer: Amy
🎯 Aufgaben
In diesem Projekt wirst du lernen:
- Implementiere die
CourseMapper-Schnittstelle, um eine Methode zur Abfrage von Kursen basierend auf dem Lehrer-Namen zu definieren - Schreibe die SQL-Abfrage in der
CourseMapper.xml-Datei, um eine Suchmaske auf derteacher-Spalte durchzuführen und die Ergebnisse absteigend nach Kursnummer zu sortieren - Teste die
CourseMapper-Implementierung in derMyBatisTest-Klasse, um die gewünschte Funktionalität sicherzustellen
🏆 Errungenschaften
Nach Abschluss dieses Projekts wirst du in der Lage sein:
- MyBatis verwenden, um mit einer MySQL-Datenbank zu interagieren
- Eingabeparameter an SQL-Abfragen über eine
Mapzu übergeben - Eine Suchmaske auf einer Datenbankspalte durchführen und die Ergebnisse sortieren
- Die Funktionalität eines MyBatis-Mappers mit einem JUnit-Testfall zu testen
Implementiere die CourseMapper-Schnittstelle
In diesem Schritt wirst du die CourseMapper-Schnittstelle implementieren, um Kursinformationen basierend auf dem Lehrer-Namen abzurufen.
- Öffne die Datei
CourseMapper.javaim Paketorg.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);
}
Die CourseMapper-Schnittstelle definiert eine Methode getCoursesByTeacherName, die eine Map als Eingabeparameter akzeptiert. Diese Methode wird verwendet, um Kurse abzurufen, bei denen der Lehrer-Namen den angegebenen Wert enthält.
Implementiere die SQL-Abfrage in der Mapper-XML-Datei
In diesem Schritt wirst du die SQL-Abfrage in der CourseMapper.xml-Datei implementieren, um die Kurse basierend auf dem Lehrer-Namen abzurufen.
- Öffne die Datei
CourseMapper.xmlim Verzeichnissrc/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>
Das <select>-Element definiert die SQL-Abfrage, die ausgeführt wird, wenn die getCoursesByTeacherName-Methode aufgerufen wird. Das parameterType-Attribut gibt an, dass der Eingabeparameter ein HashMap ist, und das resultType-Attribut gibt an, dass das Ergebnis auf die Course-Klasse abgebildet werden soll.
Die SQL-Abfrage verwendet den LIKE-Operator mit der CONCAT-Funktion, um eine Suchmaske auf der teacher-Spalte durchzuführen, wobei der Lehrer-Namen den angegebenen teacherName-Wert enthält. Die Ergebnisse werden dann absteigend nach der cNo-(Kursnummer)-Spalte sortiert.
Teste die CourseMapper in der MyBatisTest-Klasse
In diesem Schritt wirst du die CourseMapper-Implementierung testen, indem du einen Testfall in der MyBatisTest.java-Datei erstellst.
- Öffne die Datei
MyBatisTest.javaim Paketorg.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";
//Lade die MyBatis-Konfigurationsdatei
Reader reader = Resources.getResourceAsReader(resource);
//Erstelle die SqlSession-Factory
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//Erstelle ein SqlSession-Objekt, das SQL-Anweisungen in der SQL-Mapping-Datei ausführen kann
session = sessionFactory.openSession();
}
@Test
public void testCourseMapper() {
CourseMapper courseMapper = session.getMapper(CourseMapper.class);
// Erstelle eine Parameterkarte
Map<String, Object> param = new HashMap<>();
param.put("teacherName", "Am");
// Rufe die in CourseMapper definierte Methode auf
List<Course> courses = courseMapper.getCoursesByTeacherName(param);
for (Course course : courses) {
System.out.println(course);
}
}
@After
public void after() {
session.close();
}
}
In der testCourseMapper-Methode erhalten wir zunächst eine Instanz der CourseMapper-Schnittstelle mit session.getMapper(CourseMapper.class). Dann erstellen wir ein HashMap als Eingabeparameter und legen den "teacherName"-Schlüssel mit dem Wert "Am" fest.
Schließlich rufen wir die getCoursesByTeacherName-Methode der CourseMapper auf und geben die abgerufenen Course-Objekte aus.
Führe den Testfall aus
Führen Sie den Testfall aus, indem Sie die folgenden Schritte ausführen:
- Öffnen Sie in Ihrem Terminal die MySQL-Datenbank und importieren Sie die
course.sql-Datei mit dem folgenden Befehl:
sudo service mysql start
mysql -u root < course.sql
- Navigieren Sie mit dem folgenden Befehl zum Projektverzeichnis
MyBatisCourseDemo:
cd ~/project/MyBatisCourseDemo/
- Führen Sie den folgenden Befehl aus, um den Testfall auszuführen:
mvn test
Die Ausgabe sollte ähnlich der folgenden sein:
[labex] DEBUG [main] - Autocommit auf false festlegen für die JDBC-Verbindung [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==> Vorbereiten: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameter: Am(String)
[labex] DEBUG [main] - <== Gesamt: 2
Kursnummer: 3 Kursname: Python Lehrer: Liam
Kursnummer: 1 Kursname: HTML Lehrer: Amy
Dies zeigt, dass die getCoursesByTeacherName-Methode in der CourseMapper wie erwartet funktioniert, die Kurse abruft, bei denen der Lehrer-Namen "Am" enthält, und sie absteigend nach Kursnummer sortiert.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben dieses Projekt abgeschlossen. Sie können in LabEx weitere Übungen absolvieren, um Ihre Fähigkeiten zu verbessern.



