package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * exécuter des requêtes SQL: * connexion avec JDBC => préparation de la requête => exécution * => copie du ResultSet dans une ArrayList d'HashMap => fermeture de la connexion */ public class SQLexecutor extends JDBC { // constructeur par défaut /** * Exécute une requête SQL et retourne le résultat si applicable. * @param sql requête avec des ? * @param params nombre libre de paramètres, "Object..." permet de créer un tableau à partir des paramètres * @return ResultSet si la requête est un SELECT, null sinon * @throws SQLException en cas d'erreur SQL * @throws ClassNotFoundException pour DriverManager.getConnection */ public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = getConnection(); boolean isSelect = sql.trim().toLowerCase().startsWith("select"); statement = connection.prepareStatement(sql); if (params.length > 0) { // if(isSelect) // => ResultSet.TYPE_SCROLL_INSENSITIVE; // navigation possible dans le ResultSet: next(), previous(), absolute(); // ResultSet non modifiable en cas d'accès concurrent en mémoire // => PreparedStatement.NO_GENERATED_KEYS; // optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS) // statement = connection.prepareStatement(sql, isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); this.setParameters(statement, params); } if(isSelect) { resultSet = statement.executeQuery(); ResultObject result = new ResultObject(resultSet); resultSet.close(); return result; } else { statement.executeUpdate(); return null; } } finally { statement.close(); connection.close(); } } /** * Affecte les paramètres aux requêtes préparées. * @param statement * @param params Object... permet d'ajouter autant de paramètres qu'on veut et ça fait un tableau * @throws SQLException en cas d'erreur SQL */ private void setParameters(PreparedStatement statement, Object... params) throws SQLException { for (int i = 0; i < params.length; i++) { statement.setObject(i + 1, params[i]); } } }