Vous êtes sur la page 1sur 5

Formations Alternance Pour les entreprises

Accueil > Cours > Développez des sites web avec Java EE > Utiliser le modèle DAO

Développez des sites web avec Java EE

20 heures
 Difficile Licence

Mis à jour le 05/07/2021

 

Enregistrer
Utiliser le modèle DAO  dans une base 
de données

 Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours ! 1. Travailler avec
JDBC et une base
Téléchargez le fichier audiodescription : Partie 5, Chapitre 3 de données

2. Lire et enregistrer
Vous trouverez sous la vidéo les codes source du cours.
des données en
SQL

3. Utiliser le modèle
DAO

4. Gérer ses erreurs


avec son DAO

 Quiz : Quiz 5
Codes source Winnovative PDF Tools Demo
Notre contrôleur Test.java charge le DAO sans savoir si celui-ci stocke dans une base de ACCÉDER AU

données MySQL ou ailleurs. Il demande simplement d'aller stocker des données ou FORUM

d'en récupérer :

  
java

package com.octest.servlets;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.octest.bdd.Noms;
import com.octest.beans.Utilisateur;
import com.octest.dao.*;

/**
* Servlet implementation class Test
*/
@WebServlet("/Test")
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
private UtilisateurDao utilisateurDao;

public void init() throws ServletException {


DaoFactory daoFactory = DaoFactory.getInstance();
this.utilisateurDao = daoFactory.getUtilisateurDao();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) th


rows ServletException, IOException {
request.setAttribute("utilisateurs", utilisateurDao.lister());
this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward
(request, response);
}

public void doPost( HttpServletRequest request, HttpServletResponse response ) th


rows ServletException, IOException {
Utilisateur utilisateur = new Utilisateur();
utilisateur.setNom(request.getParameter("nom"));
utilisateur.setPrenom(request.getParameter("prenom"));

utilisateurDao.ajouter(utilisateur);

request.setAttribute("utilisateurs", utilisateurDao.lister());

this.getServletContext().getRequestDispatcher("/WEB-INF/bonjour.jsp").forward
(request, response);
}

La DAO Factory (DaoFactory.java) permet d'initialiser le DAO en chargeant notamment


les drivers nécessaires (ici un driver JDBC MySQL) et se connecte à la base de données.
La Factory peut fournir plusieurs DAO (ici, il n'y en a qu'unPDF
Winnovative seul, UtilisateurDao,
Tools Demoqui
correspond à une table de la base).
java

package com.octest.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DaoFactory {


private String url;
private String username;
private String password;

DaoFactory(String url, String username, String password) {


this.url = url;
this.username = username;
this.password = password;
}

public static DaoFactory getInstance() {


try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {

DaoFactory instance = new DaoFactory(


"jdbc:mysql://localhost:3306/javaee", "root", "");
return instance;
}

public Connection getConnection() throws SQLException {


return DriverManager.getConnection(url, username, password);
}

// Récupération du Dao
public UtilisateurDao getUtilisateurDao() {
return new UtilisateurDaoImpl(this);
}
}

On utilise une interface UtilisateurDao.java pour définir les méthodes d'accès aux
données des utilisateurs, indépendamment de la méthode de stockage. On indique
juste des noms de méthodes ici.
java

package com.octest.dao;

import java.util.List;

import com.octest.beans.Utilisateur;

public interface UtilisateurDao {


void ajouter( Utilisateur utilisateur );
List<Utilisateur> lister();
}

L'implémentation réelle de ces méthodes (le code à l'intérieur) indiquera si on stocke


en SQL dans MySQL, dans Oracle, dans des fichiers ou ailleurs.

Parlons de l'implémentation de ces méthodes justement ! Ici, je ne vais faire qu'une


implémentation MySQL du stockage (mais ce serait un bon exercice de faire une autre
implémentation qui enregistre dans des fichiers pour s'entraîner !). Il s'agit du fichier
UtilisateurDaoImpl.java :
java

package com.octest.dao; Winnovative PDF Tools Demo


import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import com.octest.beans.Utilisateur;

public class UtilisateurDaoImpl implements UtilisateurDao {


private DaoFactory daoFactory;

UtilisateurDaoImpl(DaoFactory daoFactory) {
this.daoFactory = daoFactory;
}

@Override
public void ajouter(Utilisateur utilisateur) {
Connection connexion = null;
PreparedStatement preparedStatement = null;

try {
connexion = daoFactory.getConnection();
preparedStatement = connexion.prepareStatement("INSERT INTO noms(nom, pre
nom) VALUES(?, ?);");
preparedStatement.setString(1, utilisateur.getNom());
preparedStatement.setString(2, utilisateur.getPrenom());

preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}

}
@Override
public List<Utilisateur> lister() {
List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
Connection connexion = null;
Statement statement = null;
ResultSet resultat = null;

try {
connexion = daoFactory.getConnection();
statement = connexion.createStatement();
resultat = statement.executeQuery("SELECT nom, prenom FROM noms;");

while (resultat.next()) {
String nom = resultat.getString("nom");
String prenom = resultat.getString("prenom");

Utilisateur utilisateur = new Utilisateur();


utilisateur.setNom(nom);
utilisateur.setPrenom(prenom);

utilisateurs.add(utilisateur);
}
} catch (SQLException e) {
e.printStackTrace();
}
return utilisateurs;
}

Comme toujours, on a besoin de notre Java Bean Utilisateur.java pour transporter les
données. Celui-ci ne change pas :
java

package com.octest.beans;
Winnovative PDF Tools Demo
public class Utilisateur {
private String nom;
private String prenom;

public String getNom() {


return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getPrenom() {
return prenom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
}

Et notre JSP bonjour.jsp ne change pas non plus. Un formulaire, une boucle qui liste les
utilisateurs et c'est tout ! On a changé tout le modèle sans affecter la vue un seul instant.
jsp

<%@ page pageEncoding="UTF-8" %>


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
<form method="post" action="bonjour">
<p>
<label for="nom">Nom : </label>
<input type="text" name="nom" id="nom" />
</p>
<p>
<label for="prenom">Prénom : </label>
<input type="text" name="prenom" id="prenom" />
</p>

<input type="submit" />


</form>

<ul>
<c:forEach var="utilisateur" items="${ utilisateurs }">
<li><c:out value="${ utilisateur.prenom }" /> <c:out value="${ utilisateu
r.nom }" /></li>
</c:forEach>
</ul>
</body>
</html>

LIRE ET ENREGISTRER DES DONNÉES


 GÉRER SES ERREURS AVEC SON DAO 
EN SQL

Le professeur
Mathieu Nebra
Entrepreneur à plein temps, auteur à plein temps et co-fondateur d'OpenClassrooms :o)

Winnovative PDF Tools Demo

Vous aimerez peut-être aussi