Proyecto de integración de base de datos MyBatis

JavaJavaBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este proyecto, aprenderá a usar MyBatis, un popular marco de persistencia Java, para interactuar con una base de datos MySQL. Específicamente, aprenderá a usar parámetros de entrada en consultas SQL y recuperar información de cursos basada en el nombre del profesor.

👀 Vista previa

[labex] DEBUG [main] - Estableciendo autocommit en falso en la conexión JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparando: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parámetros: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Número de curso: 3        Nombre del curso: Python     Profesor: Liam
Número de curso: 1        Nombre del curso: HTML       Profesor: Amy

🎯 Tareas

En este proyecto, aprenderá:

  • Implementar la interfaz CourseMapper para definir un método para recuperar cursos basados en el nombre del profesor
  • Escribir la consulta SQL en el archivo CourseMapper.xml para realizar una búsqueda difusa en la columna teacher y ordenar los resultados en orden descendente por número de curso
  • Probar la implementación de CourseMapper en la clase MyBatisTest para asegurar la funcionalidad deseada

🏆 Logros

Después de completar este proyecto, podrá:

  • Usar MyBatis para interactuar con una base de datos MySQL
  • Pasar parámetros de entrada a consultas SQL usando un Map
  • Realizar una búsqueda difusa en una columna de base de datos y ordenar los resultados
  • Probar la funcionalidad de un mapper de MyBatis usando un caso de prueba JUnit

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/interface("Interface") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/hashmap("HashMap") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/generics("Generics") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/jdbc("JDBC") java/SystemandDataProcessingGroup -.-> java/xml_dom4j("XML/Dom4j") subgraph Lab Skills java/collections_methods -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/classes_objects -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/interface -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/hashmap -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/generics -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/jdbc -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} java/xml_dom4j -.-> lab-300374{{"Proyecto de integración de base de datos MyBatis"}} end

Implementar la interfaz CourseMapper

En este paso, implementará la interfaz CourseMapper para recuperar información de cursos basada en el nombre del profesor.

  1. Abra el archivo CourseMapper.java ubicado en el paquete 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);
}

La interfaz CourseMapper define un método getCoursesByTeacherName que toma un Map como parámetro de entrada. Este método se utilizará para recuperar cursos donde el nombre del profesor contenga el valor especificado.

✨ Revisar Solución y Practicar

Implementar la consulta SQL en el archivo XML del mapper

En este paso, implementará la consulta SQL en el archivo CourseMapper.xml para recuperar los cursos basados en el nombre del profesor.

  1. Abra el archivo CourseMapper.xml ubicado en el directorio 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>

El elemento <select> define la consulta SQL que se ejecutará cuando se llame al método getCoursesByTeacherName. El atributo parameterType especifica que el parámetro de entrada es un HashMap, y el atributo resultType especifica que el resultado se mapeará a la clase Course.

La consulta SQL utiliza el operador LIKE con la función CONCAT para realizar una búsqueda difusa en la columna teacher, donde el nombre del profesor contiene el valor especificado teacherName. Los resultados se ordenan luego en orden descendente por la columna cNo (número de curso).

✨ Revisar Solución y Practicar

Probar CourseMapper en la clase MyBatisTest

En este paso, probará la implementación de CourseMapper creando un caso de prueba en el archivo MyBatisTest.java.

  1. Abra el archivo MyBatisTest.java ubicado en el paquete 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";
        //Cargar el archivo de configuración de MyBatis
        Reader reader = Resources.getResourceAsReader(resource);
        //Crear la fábrica de SqlSession
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //Crear un objeto SqlSession que puede ejecutar instrucciones SQL en el archivo de mapeo SQL
        session = sessionFactory.openSession();
    }

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

        // Crear un mapa de parámetros
        Map<String, Object> param = new HashMap<>();
        param.put("teacherName", "Am");

        // Llamar al método definido en CourseMapper
        List<Course> courses = courseMapper.getCoursesByTeacherName(param);
        for (Course course : courses) {
            System.out.println(course);
        }
    }

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

}

En el método testCourseMapper, primero obtenemos una instancia de la interfaz CourseMapper usando session.getMapper(CourseMapper.class). Luego, creamos un HashMap como parámetro de entrada y ponemos la clave "teacherName" con el valor "Am".

Finalmente, llamamos al método getCoursesByTeacherName de CourseMapper e imprimimos los objetos Course recuperados.

✨ Revisar Solución y Practicar

Ejecutar el caso de prueba

Para ejecutar el caso de prueba, siga estos pasos:

  1. En su terminal, use el siguiente comando para iniciar la base de datos MySQL e importar el archivo course.sql:
sudo service mysql start
mysql -u root < course.sql
  1. Navegue hasta el directorio del proyecto MyBatisCourseDemo usando el siguiente comando:
cd ~/project/MyBatisCourseDemo/
  1. Ejecute el siguiente comando para ejecutar el caso de prueba:
mvn test

La salida debe ser similar a la siguiente:

[labex] DEBUG [main] - Estableciendo autocommit en falso en la conexión JDBC [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparando: SELECT * FROM course WHERE teacher LIKE CONCAT('%',?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parámetros: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Número de curso: 3        Nombre del curso: Python     Profesor: Liam
Número de curso: 1        Nombre del curso: HTML       Profesor: Amy

Esto muestra que el método getCoursesByTeacherName en el CourseMapper está funcionando como se esperaba, recuperando los cursos donde el nombre del profesor contiene "Am" y ordenándolos en orden descendente por número de curso.

✨ Revisar Solución y Practicar

Resumen

¡Felicitaciones! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.