ORM pour Java : Comparaison et exemples
L'ORM (Object-Relational Mapping) est une technologie qui relie le modèle orienté objet de Java aux bases de données relationnelles. Elle évite au développeur d'écrire du code SQL standard et permet de travailler avec les données comme avec des objets Java ordinaires. En Java, trois approches sont les plus populaires : Hibernate (ORM complet), MyBatis (mapper SQL) et JPA (standard Java). Dans cet article, nous les comparerons à l'aide d'exemples pratiques.
1. JPA (Java Persistence API)
JPA est une spécification (norme), pas une implémentation concrète. L'implémentation la plus populaire est Hibernate, mais il en existe d'autres (EclipseLink, OpenJPA). JPA fournit des annotations pour le mapping des entités et prend en charge JPQL (Java Persistence Query Language).
Exemple d'entité JPA :
import javax.persistence.*;
@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(name = "username", nullable = false, length = 50) private String username;
@Column(name = "email") private String email;
// getters et setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}Exemple de sauvegarde via EntityManager :
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");EntityManager em = emf.createEntityManager();
em.getTransaction().begin();User user = new User();user.setUsername("ivan");user.setEmail("ivan@example.com");em.persist(user);em.getTransaction().commit();
em.close();emf.close();2. Hibernate
Hibernate est l'ORM le plus mature et le plus fonctionnel pour Java. Il implémente entièrement JPA, mais possède également ses propres extensions. Hibernate génère automatiquement le SQL, gère la mise en cache, prend en charge le chargement paresseux (lazy loading) et les opérations en cascade.
Exemple de mapping avec Hibernate (en utilisant les annotations JPA) :
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity@Table(name = "orders")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public class Order { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "order_seq") @SequenceGenerator(name = "order_seq", sequenceName = "order_sequence", allocationSize = 1) private Long id;
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user;
@Column(name = "total_amount") private Double totalAmount;
// getters et setters}Exemple de requête via l'API Criteria de Hibernate :
Session session = sessionFactory.openSession();CriteriaBuilder builder = session.getCriteriaBuilder();CriteriaQuery<User> query = builder.createQuery(User.class);Root<User> root = query.from(User.class);query.select(root).where(builder.equal(root.get("username"), "ivan"));
List<User> users = session.createQuery(query).getResultList();session.close();3. MyBatis
MyBatis n'est pas un ORM complet, mais un mapper SQL. Il ne génère pas automatiquement le SQL, mais fournit un mécanisme flexible pour écrire vos propres requêtes SQL avec un mapping des résultats sur des objets Java. MyBatis est idéal lorsque vous avez besoin d'un contrôle total sur le SQL et les performances.
Exemple de mapping en XML (UserMapper.xml) :
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUser" resultType="User">\ Aussi dans la bibliothèque
Journalisation pour TypeScript : la bibliothèque Winston
Envoi d'email en C# (.NET) avec SmtpClient et MailKit
Event Bus et le pattern Observer en Kotlin : guide avec exemples
Générateur de QR codes en Kotlin : bibliothèque ZXing et conseils d'implémentation