Implementação de Mapeamento SQL com Anotações no MyBatis

Em projetos que utilizam o MyBatis, as anotações podem substituir os arquivos XML para mapeamento de consultas SQL, simplificando a configuração. No entanto, essa abordagem é mais adequada para consultas simples; para operações complexas, o uso de XML pode ser mais flexível e mantível.

A seguir, demonstra-se como implementar um mapper usando anotações em Java. A interface define métodos de acesso a dados com consultas SQL enline.

package com.example.mapeamento;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.annotations.Delete;
import com.example.modelo.Cliente;

public interface ClienteMapper {
    @Select("SELECT * FROM clientes LIMIT #{offset}, #{quantidade}")
    List<Cliente> listarComPaginacao(@Param("offset") int offset, @Param("quantidade") int quantidade);

    @Select("SELECT * FROM clientes")
    List<Cliente> listarTodos();

    @Select("SELECT * FROM clientes WHERE id = #{identificador}")
    Cliente buscarPorId(int identificador);

    @Insert("INSERT INTO clientes (id, nome, email) VALUES (#{codigo}, #{nome}, #{enderecoEmail})")
    int inserir(Cliente cliente);

    @Update("UPDATE clientes SET nome = #{nomeNovo}, email = #{enderecoEmailNovo} WHERE id = #{codigo}")
    int atualizar(Cliente cliente);

    @Delete("DELETE FROM clientes WHERE id = #{identificador}")
    int excluir(int identificador);
}

Configuração do MyBatis no arquivo XML deve apontar para a interface do mapper. Exemplo:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <properties resource="configuracoes-banco.properties" />
    <typeAliases>
        <package name="com.example.modelo" />
    </typeAliases>
    <environments default="desenvolvimento">
        <environment id="desenvolvimento">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${url}" />
                <property name="username" value="${usuario}" />
                <property name="password" value="${senha}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper class="com.example.mapeamento.ClienteMapper" />
    </mappers>
</configuration>

Para validar a implemenatção, testes unitários podem executar as operações CRRUD. Exemplo de código de teste:

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.example.mapeamento.ClienteMapper;
import com.example.modelo.Cliente;
import com.example.util.SessaoMyBatis;

public class TesteCliente {
    @Test
    public void testListagem() {
        SqlSession sessao = SessaoMyBatis.obterSessao();
        ClienteMapper mapeador = sessao.getMapper(ClienteMapper.class);
        List<Cliente> lista = mapeador.listarTodos();
        for (Cliente item : lista) {
            System.out.println(item);
        }
        sessao.close();
    }

    @Test
    public void testListagemComPaginacao() {
        SqlSession sessao = SessaoMyBatis.obterSessao();
        ClienteMapper mapeador = sessao.getMapper(ClienteMapper.class);
        List<Cliente> paginados = mapeador.listarComPaginacao(0, 5);
        for (Cliente item : paginados) {
            System.out.println(item);
        }
        sessao.close();
    }

    @Test
    public void testInsercao() {
        SqlSession sessao = SessaoMyBatis.obterSessao();
        ClienteMapper mapeador = sessao.getMapper(ClienteMapper.class);
        Cliente novoCliente = new Cliente(101, "Ana Silva", "ana@email.com");
        mapeador.inserir(novoCliente);
        sessao.close();
    }

    @Test
    public void testAtualizacao() {
        SqlSession sessao = SessaoMyBatis.obterSessao();
        ClienteMapper mapeador = sessao.getMapper(ClienteMapper.class);
        Cliente clienteAtualizado = new Cliente(101, "Ana Pereira", "ana.pereira@email.com");
        mapeador.atualizar(clienteAtualizado);
        sessao.close();
    }

    @Test
    public void testExclusao() {
        SqlSession sessao = SessaoMyBatis.obterSessao();
        ClienteMapper mapeador = sessao.getMapper(ClienteMapper.class);
        mapeador.excluir(101);
        sessao.close();
    }
}

Tags: MyBatis Anotações java mapeamento-objeto-relacional SQL

Publicado em 6-3 21:51 por Thomas