ORM para Java: comparação entre Hibernate, MyBatis e Spring Data JPA
No desenvolvimento em Java, escolher a ferramenta certa para trabalhar com bancos de dados é crucial. ORM (Object-Relational Mapping) permite trabalhar com tabelas SQL como objetos, poupando o desenvolvedor da tarefa rotineira de escrever consultas SQL. Neste artigo, compararemos as três abordagens mais populares: Hibernate (provedor JPA completo), MyBatis (híbrido de SQL e ORM) e Spring Data JPA (abstração sobre JPA).
O que é ORM e para que serve?
ORM é uma técnica que conecta bancos de dados relacionais a linguagens orientadas a objetos. As principais tarefas do ORM:
- Conversão automática de linhas de tabelas em objetos Java (e vice-versa).
- Gerenciamento de transações e cache.
- Geração de consultas SQL com base em operações de objetos.
1. Hibernate (JPA)
Hibernate é o ORM mais maduro e poderoso para Java. Ele implementa completamente a especificação JPA (Jakarta Persistence). A abordagem principal é code-first: você descreve as entidades com anotações, e o Hibernate cria as tabelas e consultas automaticamente.
Exemplo de código Hibernate
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(nullable = false) private String name;
private String email;
// getters e setters}
// UsoEntityManager em = entityManagerFactory.createEntityManager();em.getTransaction().begin();User user = new User();user.setName("Alexey");user.setEmail("alex@example.com");em.persist(user);em.getTransaction().commit();Vantagens do Hibernate:
- Suporte completo a JPA — portabilidade entre bancos de dados.
- Geração automática do esquema do banco de dados.
- Cache poderoso (L1, L2) e lazy loading.
- Integração profunda com Spring Boot.
Desvantagens:
- Complexidade de configuração para consultas não padronizadas.
- Problema de consultas N+1 com configuração incorreta.
- Pesado para projetos simples.
2. MyBatis
MyBatis não é um ORM completo, mas sim um SQL Mapper. Você escreve consultas SQL manualmente, e o MyBatis mapeia automaticamente os resultados para objetos Java. Ideal para projetos onde é necessário controle total sobre o SQL.
Exemplo de código MyBatis
// Interface Mapperpublic interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(Long id);
@Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})") @Options(useGeneratedKeys = true, keyProperty = "id") void insertUser(User user);}
// UsoSqlSession session = sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1L);Vantagens do MyBatis:
- Controle total sobre SQL — consultas otimizadas.
- Simplicidade para JOINs complexos e procedures armazenadas.
- Curva de aprendizado pequena para quem conhece SQL.
- Suporte a consultas dinâmicas (via XML ou anotações).
Desvantagens:
- É necessário escrever SQL manualmente (mais código).
- Sem gerenciamento automático do esquema do banco de dados.
- Menos otimizações embutidas (cache, lazy load).
3. Spring Data JPA
Spring Data JPA é uma camada sobre JPA (geralmente Hibernate) que simplifica o trabalho com repositórios. O principal destaque é a implementação automática de métodos CRUD com base no nome do método.
Exemplo de código Spring Data JPA
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> { // Spring Data implementa este método automaticamente List<Us