MyBatis permet d'encapsuler les requêtes SQL dans des fichiers XML, réduisant ainsi la dépendance entre le code applicatif et les requêtes SQL. Cette approche remplace l'implémentation manuelle des DAO par des fichiers de configuration XML.
Configuration de base Créez un projet Maven avec les dépendances nécessaires. Le fichier de configuration principal doit définir les paramètres de connexion à la base de données :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/gestion_utilisateurs?useSSL=false"/>
<property name="username" value="admin"/>
<property name="password" value="securepass"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="fr/monprojet/mapper/UtilisateurMapper.xml"/>
</mappers>
</configuration>
Classe d'outils pour la session Utilisez une classe centrale pour initialiser la session SQL :
public class SessionManager {
private static SqlSessionFactory factory;
static {
try {
InputStream config = Resources.getResourceAsStream("config-mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(config);
} catch (IOException e) {
throw new RuntimeException("Erreur de configuration", e);
}
}
public static SqlSession obtenirSession() {
return factory.openSession();
}
}
Mappper XML et interface Définissez l'interface et son implémentation XML :
// Interface UtilisateurMapper.java
public interface UtilisateurMapper {
List<Utilisateur> obtenirTous();
Utilisateur obtenirParId(int identifiant);
int creerUtilisateur(Utilisateur user);
}
<!-- UtilisateurMapper.xml -->
<mapper namespace="fr.monprojet.mapper.UtilisateurMapper">
<select id="obtenirTous" resultType="fr.monprojet.model.Utilisateur">
SELECT * FROM utilisateurs
</select>
<select id="obtenirParId" parameterType="int" resultType="fr.monprojet.model.Utilisateur">
SELECT * FROM utilisateurs WHERE id = #{identifiant}
</select>
<insert id="creerUtilisateur" parameterType="fr.monprojet.model.Utilisateur">
INSERT INTO utilisateurs (id, nom, mot_de_passe)
VALUES (#{id}, #{nom}, #{motDePasse})
</insert>
</mapper>
Opérations CRUD Pour les opérations de modification, n'oubliez pas de valider les transactions :
@Test
public void testCreation() {
try (SqlSession session = SessionManager.obtenirSession()) {
UtilisateurMapper mapper = session.getMapper(UtilisateurMapper.class);
Utilisateur nouveau = new Utilisateur(101, "Dupont", "mdp123");
mapper.creerUtilisateur(nouveau);
session.commit(); // Validation obligatoire
}
}
Utilisation de Map pour les requêtes flexibles Lorsque les paramètres sont nombreux, utilisez un Map :
// Interface
int ajouterParMap(Map<String, Object> parametres);
// Mapper XML
<insert id="ajouterParMap" parameterType="map">
INSERT INTO utilisateurs (id, nom, mot_de_passe)
VALUES (#{id}, #{nom}, #{motDePasse})
</insert>
// Test
@Test
public void testMap() {
Map<String, Object> params = new HashMap<>();
params.put("id", 102);
params.put("nom", "Martin");
params.put("motDePasse", "secure");
mapper.ajouterParMap(params);
session.commit();
}
Recherche avec critères Pour les requêtes de recherche partielles :
<select id="rechercherParNom" parameterType="String" resultType="Utilisateur">
SELECT * FROM utilisateurs
WHERE nom LIKE CONCAT('%', #{motCle}, '%')
</select>
@Test
public void testRecherche() {
List<Utilisateur> resultats = mapper.rechercherParNom("Jean");
// Affichage des résultats
}