Spring & JDBC 2 : Insert

Objectifs
- Créer une route qui insère les données
Template
Afin de créer un sorcier, il va te falloir un formulaire (ici en POST) qui récupère toutes les données nécessaires :
<form action="/wizard/create" method="post">
<label for="wizard-first-name">First name:</label>
<input id="wizard-first-name" name="firstName" placeholder="Harry" required type="text">
<label for="wizard-last-name">Last name:</label>
<input id="wizard-last-name" name="lastName" placeholder="Potter" required type="text">
<label for="wizard-birthday">Birthday:</label>
<input id="wizard-birthday" name="birthday" placeholder="1980-07-31" required type="date">
<label for="wizard-birth-place">Birth Place:</label>
<input id="wizard-birth-place" name="birthPlace" placeholder="London" required type="text">
<label for="wizard-biography">Biography:</label>
<textarea id="wizard-biography" name="biography"></textarea>
<label for="wizard-is-muggle">Is Muggle ?</label>
<input id="wizard-is-muggle" name="muggle" type="checkbox" value="true">
<input type="submit" value="Send">
</form>
Controller
Dans l'étape précédente, la route appelée est /wizard/create, il va donc falloir la créer.
Les champs "biography" et "muggle" ne sont pas obligatoires et ont donc des valeurs par défaut :
@PostMapping("/wizard/create")
public String postWizard(Model model,
@RequestParam String firstName,
@RequestParam String lastName,
@RequestParam Date birthday,
@RequestParam String birthPlace,
@RequestParam(required = false, defaultValue = "") String biography,
@RequestParam(required = false, defaultValue = "false") boolean muggle
) {
model.addAttribute("wizard", repository.save(firstName, lastName,
birthday, birthPlace, biography, muggle));
return "wizard_get";
}
Repository
Tu as dû remarquer l'appel de la méthode save du repository.
Il faut la créer : c'est elle qui va se charger d'effectuer la requête à la base de données avec JDBC.
public Wizard save(String firstName, String lastName, Date birthday,
String birthPlace, String biography, boolean muggle) {
try {
Connection connection = DriverManager.getConnection(
DB_URL, DB_USER, DB_PASSWORD
);
PreparedStatement statement = connection.prepareStatement(
"INSERT INTO wizard (first_name, last_name, birthday, birth_place, biography, is_muggle) VALUES (?, ?, ?, ?, ?, ?)",
Statement.RETURN_GENERATED_KEYS
);
statement.setString(1, firstName);
statement.setString(2, lastName);
statement.setDate(3, birthday);
statement.setString(4, birthPlace);
statement.setString(5, biography);
statement.setBoolean(6, muggle);
if (statement.executeUpdate() != 1) {
throw new SQLException("failed to insert data");
}
ResultSet generatedKeys = statement.getGeneratedKeys();
if (generatedKeys.next()) {
Long id = generatedKeys.getLong(1);
return new Wizard(id, firstName, lastName, birthday,
birthPlace, biography, muggle);
} else {
throw new SQLException("failed to get inserted id");
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
La méthode qui exécute la requête de création est executeUpdate. La méthode retourne le nombre de tuples créés en base de données. Si ce nombre est différent de 1 : le processus n'a pas fonctionné. C'est pour cela qu'une erreur est levée !
Tu as dû remarquer l'utilisation de la constante Statement.RETURN_GENERATED_KEYS qui va servir à retourner l'identifiant du nouveau sorcier créé en base de données.
Pour le récupérer, tu vas utiliser l'instruction suivante : ResultSet generatedKeys = statement.getGeneratedKeys();
Si generatedKeys.next() ne récupère aucun résultat, là aussi un problème est survenu et il faut relever l'erreur.
Dans le cas contraire, tu peux créer une nouvelle instance de Wizard en lui attribuant l'identifiant relevé précédemment et les données du formulaire.
Challenge
Insertion d'une école dans la base de données

Fais un fork du dépôt suivant : https://github.com/WildCodeSchool/quest-spring-jdbc-insert.
Attention: ce projet n'est pas le même que celui de la quête précédente !
Tu reprends le développement d'un site de fan d'Harry Potter afin d'y ajouter des fonctionnalités. En l'état, le site permet la création d'un personnage de l'univers de la série.
La base de données est la même que celle de la quête précédente. Cependant, si tu l'as effacée, tu peux importer la base de données spring_jdbc_quest contenue dans le fichier suivant.
L'utilisateur est le même que celui de la quête précédente : h4rryp0tt3r avec le mot de passe Horcrux4life! et tous les droits possibles sur la base de données spring_jdbc_quest.
Tu vas commencer par tester le site et voir comment tout cela fonctionne.
Attention à bien regarder toutes les classes du dépôt avant de commencer le challenge !
- Tester que le site fonctionne correctement
- Ajouter la création d'une école à partir d'un formulaire, sur la route
/school/create
Critères de validation
- Le projet s'exécute bien sur la base de données et l'utilisateur requis.
- Il est possible de créer une école.
- L'école apparaît bien après son insertion.
- Le code JDBC est bien présent dans un repository et non un controller.
- Le code est disponible sur GitHub.