MyBatis-Datenbankintegrationsprojekt

JavaJavaBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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 der teacher-Spalte durchzuführen und die Ergebnisse absteigend nach Kursnummer zu sortieren
  • Teste die CourseMapper-Implementierung in der MyBatisTest-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 Map zu ü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.

  1. Öffne die Datei CourseMapper.java im Paket 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);
}

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.

✨ Lösung prüfen und üben

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.

  1. Öffne die Datei CourseMapper.xml im Verzeichnis 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>

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.

✨ Lösung prüfen und üben

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.

  1. Öffne die Datei MyBatisTest.java im Paket 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";
        //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.

✨ Lösung prüfen und üben

Führe den Testfall aus

Führen Sie den Testfall aus, indem Sie die folgenden Schritte ausführen:

  1. Ö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
  1. Navigieren Sie mit dem folgenden Befehl zum Projektverzeichnis MyBatisCourseDemo:
cd ~/project/MyBatisCourseDemo/
  1. 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.

✨ Lösung prüfen und üben

Zusammenfassung

Herzlichen Glückwunsch! Sie haben dieses Projekt abgeschlossen. Sie können in LabEx weitere Übungen absolvieren, um Ihre Fähigkeiten zu verbessern.