Aller au contenu principal

Requêtes

Sarah fournit une API fluide pour exécuter des requêtes de base de données via la classe RequestHelper. Ce guide couvre toutes les opérations de requêtes avec des exemples pratiques.

RequestHelper

Le RequestHelper est votre interface principale pour les opérations de base de données :

RequestHelper requestHelper = new RequestHelper(databaseConnection, logger);

Requêtes SELECT

Sélectionner Tous les Enregistrements

// Sélectionner tous les joueurs
List<PlayerDTO> players = requestHelper.selectAll("players", PlayerDTO.class);

Sélectionner avec Conditions

// Sélectionner les joueurs avec plus de 1000 de temps de jeu
List<PlayerDTO> activePlayers = requestHelper.select("players", PlayerDTO.class, table -> {
table.where("play_time", ">", 1000);
});

Sélectionner avec Plusieurs Conditions

List<PlayerDTO> results = requestHelper.select("players", PlayerDTO.class, table -> {
table.where("play_time", ">", 1000);
table.where("is_banned", false);
table.whereNotNull("last_login");
});

Sélectionner avec Tri

List<PlayerDTO> topPlayers = requestHelper.select("players", PlayerDTO.class, table -> {
table.where("is_banned", false);
table.orderByDesc("play_time");
});

Sélectionner avec Clause IN

List<String> names = Arrays.asList("Steve", "Alex", "Notch");
List<PlayerDTO> players = requestHelper.select("players", PlayerDTO.class, table -> {
table.whereIn("name", names);
});

Sélectionner en Maps Brutes

Quand vous n'avez pas de classe DTO :

List<Map<String, Object>> results = requestHelper.select("players", table -> {
table.where("is_online", true);
});

for (Map<String, Object> row : results) {
String name = (String) row.get("name");
long playTime = (long) row.get("play_time");
}

Compter les Enregistrements

long totalPlayers = requestHelper.count("players", table -> {});

long activePlayers = requestHelper.count("players", table -> {
table.where("play_time", ">", 1000);
});

Requêtes INSERT

Insertion Basique

requestHelper.insert("players", schema -> {
schema.uuid("uuid", playerUuid);
schema.string("name", playerName);
schema.bigInt("play_time", 0);
});

Insertion depuis un DTO

// Votre classe DTO
public record PlayerDTO(UUID uuid, String name, long playTime) {}

// Insertion
PlayerDTO player = new PlayerDTO(uuid, "Steve", 0);
requestHelper.insert("players", PlayerDTO.class, player);

Insertion avec Callback de Résultat

Obtenir l'ID auto-généré :

requestHelper.insert("homes", schema -> {
schema.uuid("player_uuid", playerUuid);
schema.string("name", "MyHome");
schema.string("world", "world");
schema.decimal("x", x);
schema.decimal("y", y);
schema.decimal("z", z);
}, generatedId -> {
System.out.println("Home créé avec l'ID : " + generatedId);
});

Insertion avec Gestion d'Erreur

requestHelper.insert("players", schema -> {
schema.uuid("uuid", playerUuid);
schema.string("name", playerName);
}, generatedId -> {
logger.info("Joueur créé avec l'ID : " + generatedId);
}, () -> {
logger.warning("Échec de la création du joueur !");
});

Insertion par Lot

List<PlayerDTO> players = Arrays.asList(
new PlayerDTO(uuid1, "Steve", 0),
new PlayerDTO(uuid2, "Alex", 0),
new PlayerDTO(uuid3, "Notch", 0)
);

requestHelper.insertMultiple("players", PlayerDTO.class, players);

Requêtes UPDATE

Mise à Jour Basique

requestHelper.update("players", schema -> {
schema.bigInt("play_time", newPlayTime);
schema.where("uuid", playerUuid);
});

Mettre à Jour Plusieurs Colonnes

requestHelper.update("players", schema -> {
schema.string("name", newName);
schema.bigInt("play_time", newPlayTime);
schema.bool("is_online", true);
schema.where("uuid", playerUuid);
});

Mise à Jour par Lot

List<Schema> updates = new ArrayList<>();
for (PlayerDTO player : playersToUpdate) {
Schema schema = SchemaBuilder.update("players", s -> {
s.bigInt("play_time", player.playTime());
s.where("uuid", player.uuid());
});
updates.add(schema);
}
requestHelper.updateMultiple(updates);

Requêtes UPSERT (Insérer ou Mettre à Jour)

Upsert insère une nouvelle ligne ou met à jour si la clé primaire existe déjà.

Upsert Basique

requestHelper.upsert("players", schema -> {
schema.uuid("uuid", playerUuid).primary();
schema.string("name", playerName);
schema.bigInt("play_time", playTime);
});
Exigence SQLite

Pour SQLite, vous devez marquer la colonne de clé primaire avec .primary() :

schema.uuid("uuid", playerUuid).primary();  // Obligatoire pour SQLite !

Upsert depuis un DTO

PlayerDTO player = new PlayerDTO(uuid, "Steve", 1000);
requestHelper.upsert("players", PlayerDTO.class, player);

Upsert par Lot

List<PlayerDTO> players = getPlayersToSave();
requestHelper.upsertMultiple("players", PlayerDTO.class, players);

Requêtes DELETE

Suppression avec Condition

requestHelper.delete("players", schema -> {
schema.where("uuid", playerUuid);
});

Suppression avec Plusieurs Conditions

requestHelper.delete("sessions", schema -> {
schema.where("player_uuid", playerUuid);
schema.where("is_expired", true);
});

Supprimer les Anciens Enregistrements

requestHelper.delete("logs", schema -> {
schema.where("created_at", "<", thirtyDaysAgo);
});

Conditions WHERE

Égalité

schema.where("name", "Steve");
schema.where("uuid", playerUuid); // Support UUID

Opérateurs de Comparaison

schema.where("play_time", ">", 1000);
schema.where("balance", ">=", 100.0);
schema.where("level", "<", 10);
schema.where("score", "<=", 50);
schema.where("name", "!=", "Admin");

Vérifications NULL

schema.whereNull("deleted_at");
schema.whereNotNull("verified_at");

Clause IN

schema.whereIn("status", "active", "pending", "review");
schema.whereIn("name", Arrays.asList("Steve", "Alex"));

Combiner les Conditions

Toutes les conditions sont combinées avec AND :

requestHelper.select("players", PlayerDTO.class, table -> {
table.where("is_banned", false);
table.where("play_time", ">", 100);
table.whereNotNull("last_login");
table.whereIn("rank", "vip", "mvp", "admin");
});
// WHERE is_banned = 0 AND play_time > 100 AND last_login IS NOT NULL AND rank IN ('vip', 'mvp', 'admin')

Objets de Transfert de Données (DTOs)

Sarah mappe automatiquement les résultats de requêtes vers des objets Java.

Utiliser les Records (Java 14+)

public record PlayerDTO(
UUID uuid,
String name,
long playTime,
boolean isBanned
) {}

// Sarah mappera automatiquement les colonnes aux paramètres du constructeur
List<PlayerDTO> players = requestHelper.selectAll("players", PlayerDTO.class);

Utiliser des Classes avec l'Annotation @Column

Pour les anciennes versions de Java ou les noms de colonnes personnalisés :

public class PlayerDTO {
@Column("uuid")
private UUID uuid;

@Column("name")
private String name;

@Column("play_time")
private long playTime;

@Column("is_banned")
private boolean banned;

// Constructeur correspondant à l'ordre des colonnes
public PlayerDTO(UUID uuid, String name, long playTime, boolean banned) {
this.uuid = uuid;
this.name = name;
this.playTime = playTime;
this.banned = banned;
}

// Getters...
}

Mapping des Noms de Colonnes

Sarah convertit entre le camelCase Java et le snake_case SQL :

Champ JavaColonne Base de Données
playTimeplay_time
isBannedis_banned
lastLoginAtlast_login_at
uuiduuid

Exemples Complets

Système de Statistiques de Joueurs

public class PlayerStatsManager {
private final RequestHelper requestHelper;

public PlayerStatsManager(RequestHelper requestHelper) {
this.requestHelper = requestHelper;
}

public void saveStats(UUID uuid, PlayerStats stats) {
requestHelper.upsert("player_stats", schema -> {
schema.uuid("uuid", uuid).primary();
schema.bigInt("kills", stats.getKills());
schema.bigInt("deaths", stats.getDeaths());
schema.bigInt("play_time", stats.getPlayTime());
schema.decimal("balance", stats.getBalance());
});
}

public PlayerStats getStats(UUID uuid) {
List<PlayerStats> results = requestHelper.select("player_stats", PlayerStats.class, table -> {
table.where("uuid", uuid);
});
return results.isEmpty() ? new PlayerStats() : results.get(0);
}

public List<PlayerStats> getTopPlayers(int limit) {
return requestHelper.select("player_stats", PlayerStats.class, table -> {
table.orderByDesc("kills");
// Note : LIMIT est appliqué après la requête pour l'instant
}).stream().limit(limit).toList();
}
}

Système de Homes

public class HomeManager {
private final RequestHelper requestHelper;

public void createHome(UUID playerUuid, String name, Location location) {
requestHelper.insert("homes", schema -> {
schema.uuid("player_uuid", playerUuid);
schema.string("name", name);
schema.string("world", location.getWorld().getName());
schema.decimal("x", location.getX());
schema.decimal("y", location.getY());
schema.decimal("z", location.getZ());
schema.decimal("yaw", location.getYaw());
schema.decimal("pitch", location.getPitch());
});
}

public List<HomeDTO> getHomes(UUID playerUuid) {
return requestHelper.select("homes", HomeDTO.class, table -> {
table.where("player_uuid", playerUuid);
});
}

public void deleteHome(UUID playerUuid, String name) {
requestHelper.delete("homes", schema -> {
schema.where("player_uuid", playerUuid);
schema.where("name", name);
});
}

public long countHomes(UUID playerUuid) {
return requestHelper.count("homes", table -> {
table.where("player_uuid", playerUuid);
});
}
}

Prochaines Étapes

Copyright © 2026 GroupeZ|Build #loading...|-