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(*) > 0retourne 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) ouSELECT 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