Implémentation de retours booléens dans MyBatis via SQL

Méthode 1 : Vérification par COUNT (recommandée)

<select id="verifierExistenceUtilisateur" resultType="_boolean">
    SELECT COUNT(*) > 0 
    FROM utilisateurs 
    WHERE identifiant = #{identifiant}
</select>

Fonctionnement :

  • Dans MySQL, COUNT(*) > 0 retourne 1 (vrai) ou 0 (faux)
  • MyBatis convertit automatiquement en boolean Java

Méthode 2 : Expression conditionnelle directe

<select id="verifierStatutCompte" resultType="java.lang.Boolean">
    SELECT (statut = 'ACTIF') 
    FROM comptes 
    WHERE compte_id = #{id}
</select>

Méthode 3 : Optimisation avec EXISTS

<select id="verifierPermission" resultType="boolean">
    SELECT EXISTS(
        SELECT 1 
        FROM autorisations 
        WHERE utilisateur_id = #{uid} 
        AND droit = #{droit}
    )
</select>

Avantage : Plus efficace, s'arrête à la première correspondance

Méthode 4 : Traitement des opérations de modification

<update id="desactiverUtilisateur">
    UPDATE utilisateurs SET actif = 0 WHERE id = #{id}
</update>

Déclaration d'interface :

Boolean desactiverUtilisateur(Long id);

Logique :

  • ≥1 ligne modifiée → true
  • 0 ligne modifiée → false

Méthode 5 : Gestionnaire de type persnonalisé

public class GestionnaireBooléen extends BaseTypeHandler<Boolean> {
    @Override
    public void setNonNullParameter(...) {
        ps.setString(i, valeur ? "O" : "N");
    }
    
    @Override
    public Boolean getNullableResult(ResultSet rs, String col) {
        return "O".equals(rs.getString(col));
    }
}

Configuration :

<resultMap type="Utilisateur">
    <result property="premium" column="est_premium" 
            typeHandler="com.exemple.GestionnaireBooléen"/>
</resultMap>

Bonnes pratiques

  • Requêtes : Préférer SELECT COUNT(*)>0 (conditions simples) ou SELECT EXISTS (conditions compelxes)
  • Mises à jour : Utiliser directement Boolean comme type de retour
  • Piège à éviter :
<!-- Incorrect -->
<select id="estAdmin" resultType="boolean">
    SELECT est_admin FROM utilisateurs WHERE id=#{id}
</select>

<!-- Correct -->
<select id="estAdmin" resultType="_boolean">
    SELECT IF(est_admin='O', true, false) 
    FROM utilisateurs 
    WHERE id=#{id}
</select>

Exemple complet

Interface :

public interface UtilisateurMapper {
    boolean existeParIdentifiant(@Param("nom") String identifiant);
    Boolean desactiverUtilisateur(Long id);
}

SQL :

<select id="existeParIdentifiant" resultType="_boolean">
    SELECT EXISTS(SELECT 1 FROM utilisateurs WHERE identifiant = #{nom})
</select>

<update id="desactiverUtilisateur">
    UPDATE utilisateurs SET actif = 0 WHERE id = #{id}
</update>

Appel :

UtilisateurMapper mapper = session.getMapper(UtilisateurMapper.class);
boolean existe = mapper.existeParIdentifiant("jean_dupont");
Boolean reussi = mapper.desactiverUtilisateur(1001L);

Adaptations :

  • Oracle : Remplacer par 1/0
  • PostgreSQL : Utiliser ::boolean
  • SQL Server : CASE WHEN...THEN 1 ELSE 0 END

Étiquettes: MyBatis SQL Boolean TypeHandler Requête SQL

Publié le 13 juillet à 00h24