Projeto de Integração com Banco de Dados MyBatis

JavaBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como usar o MyBatis, um popular framework de persistência Java, para interagir com um banco de dados MySQL. Especificamente, você aprenderá como usar parâmetros de entrada em consultas SQL e recuperar informações de cursos com base no nome do professor.

👀 Pré-visualização

[labex] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Course Number: 3        Course Name: Python     Teacher: Liam
Course Number: 1        Course Name: HTML       Teacher: Amy

🎯 Tarefas

Neste projeto, você aprenderá:

  • Implementar a interface CourseMapper para definir um método para recuperar cursos com base no nome do professor
  • Escrever a consulta SQL no arquivo CourseMapper.xml para realizar uma busca difusa (fuzzy search) na coluna teacher e ordenar os resultados em ordem decrescente pelo número do curso
  • Testar a implementação do CourseMapper na classe MyBatisTest para garantir a funcionalidade desejada

🏆 Conquistas

Após concluir este projeto, você será capaz de:

  • Usar o MyBatis para interagir com um banco de dados MySQL
  • Passar parâmetros de entrada para consultas SQL usando um Map
  • Realizar uma busca difusa (fuzzy search) em uma coluna do banco de dados e ordenar os resultados
  • Testar a funcionalidade de um mapper MyBatis usando um caso de teste JUnit

Implementar a Interface CourseMapper

Nesta etapa, você implementará a interface CourseMapper para recuperar informações do curso com base no nome do professor.

  1. Abra o arquivo CourseMapper.java localizado no pacote 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);
}

A interface CourseMapper define um método getCoursesByTeacherName que recebe um Map como parâmetro de entrada. Este método será usado para recuperar cursos onde o nome do professor contém o valor especificado.

Implementar a Consulta SQL no Arquivo Mapper XML

Nesta etapa, você implementará a consulta SQL no arquivo CourseMapper.xml para recuperar os cursos com base no nome do professor.

  1. Abra o arquivo CourseMapper.xml localizado no diretório 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>

O elemento <select> define a consulta SQL que será executada quando o método getCoursesByTeacherName for chamado. O atributo parameterType especifica que o parâmetro de entrada é um HashMap, e o atributo resultType especifica que o resultado será mapeado para a classe Course.

A consulta SQL usa o operador LIKE com a função CONCAT para realizar uma busca difusa (fuzzy search) na coluna teacher, onde o nome do professor contém o valor teacherName especificado. Os resultados são então ordenados em ordem decrescente pela coluna cNo (número do curso).

Testar o CourseMapper na Classe MyBatisTest

Nesta etapa, você testará a implementação do CourseMapper criando um caso de teste no arquivo MyBatisTest.java.

  1. Abra o arquivo MyBatisTest.java localizado no pacote 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";
        //Load the MyBatis configuration file
        Reader reader = Resources.getResourceAsReader(resource);
        //Create the SqlSession factory
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //Create a SqlSession object that can execute SQL statements in the SQL mapping file
        session = sessionFactory.openSession();
    }

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

        // Create a parameter map
        Map<String, Object> param = new HashMap<>();
        param.put("teacherName", "Am");

        // Call the method defined in CourseMapper
        List<Course> courses = courseMapper.getCoursesByTeacherName(param);
        for (Course course : courses) {
            System.out.println(course);
        }
    }

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

}

No método testCourseMapper, primeiro obtemos uma instância da interface CourseMapper usando session.getMapper(CourseMapper.class). Em seguida, criamos um HashMap como o parâmetro de entrada e colocamos a chave "teacherName" com o valor "Am".

Finalmente, chamamos o método getCoursesByTeacherName do CourseMapper e imprimimos os objetos Course recuperados.

Executar o Caso de Teste

Para executar o caso de teste, siga estes passos:

  1. No seu terminal, use o seguinte comando para iniciar o banco de dados MySQL e importar o arquivo course.sql:
sudo service mysql start
mysql -u root < course.sql
  1. Navegue até o diretório do projeto MyBatisCourseDemo usando o seguinte comando:
cd ~/project/MyBatisCourseDemo/
  1. Execute o seguinte comando para executar o caso de teste:
mvn test

A saída deve ser semelhante à seguinte:

[labex] DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@642a7222]
[labex] DEBUG [main] - ==>  Preparing: SELECT * FROM course WHERE teacher LIKE CONCAT('%', ?, '%') ORDER BY cNo DESC
[labex] DEBUG [main] - ==> Parameters: Am(String)
[labex] DEBUG [main] - <==      Total: 2
Course Number: 3        Course Name: Python     Teacher: Liam
Course Number: 1        Course Name: HTML       Teacher: Amy

Isso mostra que o método getCoursesByTeacherName no CourseMapper está funcionando conforme o esperado, recuperando os cursos onde o nome do professor contém "Am" e ordenando-os em ordem decrescente pelo número do curso.

Resumo

Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar