package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class SQLexecutor extends JDBC { /** * Exécute une requête SQL et retourne le résultat si applicable. * @param sql requête avec des ? * @param params Object... permet d'ajouter autant de paramètres qu'on veut et ça fait un tableau * @return Un ResultSet si la requête est un SELECT, sinon null * @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"); if (params.length > 0) { int option; if(isSelect) { option = ResultSet.TYPE_SCROLL_INSENSITIVE; // navigation possible dans le ResultSet: next(), previous(), absolute(); // ResultSet non modifiable en cas d'accès concurrent en mémoire } else { option = 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, option); //isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); this.setParameters(statement, params); } else { statement = connection.prepareStatement(sql); } if(isSelect) { resultSet = statement.executeQuery(); ResultObject result = new ResultObject(resultSet); resultSet.close(); return result; } else { statement.executeUpdate(); return null; } } finally { statement.close(); connection.close(); // if (resultSet == null) { // 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]); } } }