No desenvolvimento de camadas de persistência em Java, o MyBatis se destaca pela flexibilidade e pelo controle granular sobre o SQL. Por outro lado, o MyBatis-Plus surge como uma extensão poderosa, focada em produtividade e na redução de código repetitivo (boilerplate). Este artigo analisa as características fundamentais, casos de uso e exemplos práticos de ambas as tecnologias.
1. O Núcleo do MyBatis: Controle e Flexibilidade
O MyBatis é um framework ORM (Object-Relational Mapping) de baixo acoplamento que permite aos desenvolvedores gerenciar SQL manualmente, evitando a complexidade de abstrações excessivas. Sua principal vantagem é a separação entre a lógica de banco de dados e o código Java.
Características Principais
- SQL Dinâmico: Utilização de tags XML como
<if>e<where>para construir queries complexas em tempo de execução. - Mapeamento Direto: Conversão precisa de registros do banco para POJOs (Plain Old Java Objects).
- Performance: Ideal para cenários onde a otimização de consultas é crítica e o uso de recursos do banco de dados deve ser específico.
Exemplo de Implementação Manual
Em vez de depender de geração automática, definimos o mapeametno em um arquivo XML:
<!-- AccountMapper.xml -->
<mapper namespace="br.com.sistema.repository.AccountMapper">
<select id="findAccountByOwner" resultType="Account">
SELECT id, owner_name, balance
FROM tb_accounts
WHERE owner_name LIKE CONCAT('%', #{name}, '%')
</select>
</mapper>
A interface Java correspondente:
public interface AccountMapper {
List<Account> findAccountByOwner(@Param("name") String name);
}
2. Evolução com MyBatis-Plus
O MyBatis-Plus (MP) mantém a essência do MyBatis, mas adiciona funcionalidades que automatizam operações comuns de CRUD, eliminando a necessidade de escrever SQL para tarefas triviais.
Funcionalidades de Produtividade
- BaseMapper: Uma interface genérica que já contém métodos como
insert,deleteById,updateeselectList. - Wrappers de Consulta: Construção de filtros utilizando Fluent API, reduzindo erros de sintaxe em strings.
- Gerador de Código: Ferramenta para criar automaticamente entidades, mappers e serviços a partir do esquema do banco.
Exemplo com Abstração do MyBatis-Plus
Definição da entidade com anotações de mapeamento:
@Data
@TableName("tb_products")
public class Product {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String sku;
private Double price;
}
A interface herda as funcionalidades base:
public interface ProductMapper extends BaseMapper<Product> {
// Métodos CRUD básicos já estão disponíveis
}
Uso prático com LambdaQueryWrapper para maior segurança de tipos:
List<Product> cheapProducts = productMapper.selectList(
new LambdaQueryWrapper<Product>()
.le(Product::getPrice, 50.0)
.orderByDesc(Product::getSku)
);
3. Comparativo Técnico
| Atributo | MyBatis Tradicional | MyBatis-Plus |
|---|---|---|
| Conifguração de SQL | Manual via XML ou Annotations | Automática para CRUD; Manual para casos complexos |
| Velocidade de Setup | Moderada | Alta (Ready-to-use) |
| Curva de Aprendizado | Requer domínio de SQL e sintaxe XML | Intuitivo para desenvolvedores Java |
| Flexibilidade | Total | Total (híbrido) |
4. Recursos Avançados do MyBatis-Plus
Preenchimento Automático de Campos
Comum para auditoria (data de criação e modificação):
@Component
public class AuditFieldHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdAt", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime.class, LocalDateTime.now());
}
}
Suporte a Multi-tenancy
O MyBatis-Plus facilita o isolamento de dados por inquilino (tenant) através de interceptores que injetam automaticamente a cláusula WHERE tenant_id = ? em todas as consultas realizadas pela aplicação.
5. Critérios de Escolha
A decisão entre usar MyBatis puro ou sua versão Plus depende da natureza do projeto:
- MyBatis Puro: Recomendado para sistemas legados com DBAs rigorosos, queries extremamente complexas com múltiplas junções ou quando o controle absoluto do plano de execução SQL é mandatório.
- MyBatis-Plus: Ideal para novos projetos, microserviços e aplicações Rapid Application Development (RAD). É a escolha certa quando a maioria das operações são CRUDs simples, mas você ainda quer a porta aberta para escrever SQL manual quando necessário.
Em resumo, o MyBatis-Plus não substitui o MyBatis, ele o potencializa. Ao adotar o MP, você ganha agilidade sem perder a capacidade de otimização de baixo nível que tornou o MyBatis um padrão na indústria Java.