Vous nommerez votre projet : springdemo04.
Pour le moment, ce projet reste une application dite standalone java-jdbc-mysql (ce n’est pas du web !) mais cela ne change pas grand chose pour la suite !
Nous allons respecter le Design pattern DAO (Data Access Object) pour cet exemple. Nous aurons donc les classes suivantes :
Data Access Object
PiloteDao.java : Interface qui implémente les méthodes PiloteDaoImpl.java : Classe qui implémente l’interface PiloteDao (code les méthodes) Pilote.java : Classe qui correspond à l’entité manipulée (table Pilote de bd-avion) Demo04Application : classe spécifique qui lance l’application et exécute des commandes grâce à l’implémentation de l’interface CommandLineRunner.
Faites comme pour les projets démos précédents an ajoutant les dépendances appropriées :
Dans le répertoire src/main/resources, vous avez un fichier nommé application.properties dans lequel vous allez ajouter les lignes suivantes pour faire le lien avec la base de données avion :
# =============================== # base de données MySQL # =============================== spring.datasource.url=jdbc:mysql://localhost:3306/bd-avion?createDatabaseIfNotExist=true&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=UTC spring.datasource.username=test spring.datasource.password=test spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # ============================== # log # ============================== logging.level.root=INFO logging.file=d:/data/log-springdemo04.log logging.level.org.springframework.jdbc.core.JdbcTemplate=debug # =============================== # JPA / HIBERNATE # =============================== ## spring.jpa.show-sql=true ## spring.jpa.hibernate.ddl-auto=update ## spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect # =============================== # Permet exécuter le data.sql si besoin, nous verrons cela ultérieurement. # =============================== ## spring.datasource.initialization-mode=always
idem que dans springdemo03
Modifier la classe Demo04Application.java en implémentant l’interface CommandLineRunner qui permet d’exécuter du code automatiquement au lancement de l’application java SpringBoot.
package fr.bouget.spring.jdbc.springdemo04.model; import java.io.Serializable; public class Pilote implements Serializable { private static final long serialVersionUID = 1L; private int id; private String nom; private String site; public Pilote() {super();} /** * Constructeur * @param id * @param nom * @param site */ public Pilote(int id, String nom, String site) { super(); this.id = id; this.nom = nom; this.site = site; } /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { this.id = id; } /** * @return the nom */ public String getNom() { return nom; } /** * @param nom the nom to set */ public void setNom(String nom) { this.nom = nom.toUpperCase(); } /** * @return the site */ public String getSite() { return site; } /** * @param site the site to set */ public void setSite(String site) { this.site = site.toUpperCase();; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Pilote : "+this.getId()+ " "+this.getNom()+ " "+this.getSite(); } }
package fr.bouget.spring.jdbc.springdemo04.dao; import java.util.List; import fr.bouget.spring.jdbc.springdemo04.model.Pilote; /** * @author Philippe * */ public interface PiloteDao { public List<Pilote> findByNom (String nom); public List<Pilote> findAll(); public void addPilote(Pilote pilote); public void removePilote(Pilote pilote); public void updatePilote(Pilote pilote); }
Cette classe intégre une classe statique privée PiloteMapper qui implémente l’interface RowMapper. Nous aurions pu la mettre à l’extérieur mais elle n’a d’utilité qu’à cet endroit !
package fr.bouget.spring.jdbc.springdemo04.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.text.MessageFormat; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Component; import fr.bouget.spring.jdbc.springdemo04.Demo04Application; import fr.bouget.spring.jdbc.springdemo04.model.Pilote; /** * @author Philippe * */ @Component @Qualifier("piloteDao") public class PiloteDaoImpl implements PiloteDao { private static final Logger log = LoggerFactory.getLogger(Demo04Application.class); @Autowired private JdbcTemplate jdbcTemplate; /** * Méthode pour rechercher les pilotes par NOM * @param nom * @return */ @Override public List<Pilote> findByNom (String nom){ log.info(MessageFormat.format("Méthode findByNom() => rechercher un pilote dont le nom est {0}:", nom)); return jdbcTemplate.query( "SELECT * FROM pilote WHERE PI_NOM = ?", new Object[] {nom}, new PiloteMapper()); } /** * Méthode pour rechercher tous les pilotes de la table * @return */ @Override public List<Pilote> findAll() { log.info("Méthode findAll() => recherche tous les pilotes dans la table Pilotes"); return jdbcTemplate.query("SELECT PI_ID, PI_NOM, PI_SITE FROM pilote", new PiloteMapper()); } @Override public void addPilote(Pilote pilote) { // ... à vous de compléter le code } @Override public void removePilote(Pilote pilote) { // ... à vous de compléter le code } @Override public void updatePilote(Pilote pilote) { // ... à vous de compléter le code } /** * Classe privée interne * avec méthode pour le Mapping des objets de type Pilote * @author Philippe * */ private static final class PiloteMapper implements RowMapper<Pilote> { public Pilote mapRow(ResultSet resultSet, int rowNum) throws SQLException { Pilote p = new Pilote(); p.setId(resultSet.getInt("PI_ID")); p.setNom(resultSet.getString("PI_NOM")); p.setSite(resultSet.getString("PI_SITE")); return p; } } }
package fr.bouget.spring.jdbc.springdemo04; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import fr.bouget.spring.jdbc.springdemo04.dao.PiloteDao; import fr.bouget.spring.jdbc.springdemo04.model.Pilote; @SpringBootApplication @ComponentScan(basePackages = { "fr.bouget.spring.jdbc.springdemo04" }) public class Demo04Application implements CommandLineRunner { @Autowired private PiloteDao piloteDao; /** * méthode main() * @param args */ public static void main(String[] args) { SpringApplication.run(Demo04Application.class, args); } @Override public void run(String... args) throws Exception { // on suppose que la table Pilote existe et qu'elle contient des enregistrements. // petit test List<Pilote> pilotes = piloteDao.findAll(); for (Pilote pilote : pilotes) { System.out.println(pilote); } // on recherche élodie List<Pilote> elodies = piloteDao.findByNom("ELODIE"); for (Pilote pilote : elodies) { System.out.println(pilote); } } }
Compléter le code des méthodes ci-dessous :
@Override public void addPilote(Pilote pilote) { // ... à vous de compléter le code } @Override public void removePilote(Pilote pilote) { // ... à vous de compléter le code } @Override public void updatePilote(Pilote pilote) { // ... à vous de compléter le code }
Et ajouter le code suivant dans votre méthode main() à la suite du code existant :
// ajouter pilote Pilote p= new Pilote(); p.setNom("Philippe"); p.setSite("Paris"); p.setId(piloteDao.addPilote(p)); System.out.println("Ajout de Philippe - Paris : "+p); // modifieer le site du pilote p avec Avignon au lieu de Paris System.out.println("Modification du Pilote "+p.getNom()+" pour le nouveau site Avignon"); p.setSite("Avignon"); piloteDao.updatePilote(p); // ajouter un pilote puis le détruire Pilote toto= new Pilote(); toto.setNom("Toto"); toto.setSite("Lisbonne"); toto.setId(piloteDao.addPilote(toto)); System.out.println("Ajout de Toto - Lisbonne : "+toto); // détruire le pilote dans la base ! piloteDao.removePilote(toto);
Elle doit permettre d’afficher la liste des pilotes au format JSON dans un navigateur. Que devez-vous transformer ?