From 7c5ad53e764ffc6a9d40071ec328e797fc354357 Mon Sep 17 00:00:00 2001 From: polo-pc-greta Date: Mon, 17 Feb 2025 15:28:07 +0100 Subject: =?UTF-8?q?2=20modes=20connexion=20qui=20reste=20ouverte=20ou=20fe?= =?UTF-8?q?rmeture=20imm=C3=A9diate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modele/dao/SQLexecutor.java | 116 +++++++++++++++++++++++++++++++--------- 1 file changed, 92 insertions(+), 24 deletions(-) (limited to 'src/modele/dao/SQLexecutor.java') diff --git a/src/modele/dao/SQLexecutor.java b/src/modele/dao/SQLexecutor.java index 484f52e..686928a 100644 --- a/src/modele/dao/SQLexecutor.java +++ b/src/modele/dao/SQLexecutor.java @@ -3,7 +3,10 @@ package modele.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; /** * exécuter des requêtes SQL: @@ -12,54 +15,83 @@ import java.sql.SQLException; */ public class SQLexecutor extends JDBC { - // constructeur par défaut + Connection connection = null; + PreparedStatement statement = null; + ResultSet resultSet = null; + + private boolean copy_mode = false; + ArrayList> result_copy = null; + + // utilise le contructeur par défaut de java + + /** + * retourne un ResultSet + * @return ResultSet + */ + public ResultSet getResultSet() + { + return resultSet; + } + /** + * retourne une ArrayList d'HashMap + * @return ArrayList d'HashMap + */ + public ArrayList> getResultCopy() + { + return result_copy; + } + + /** + * choisir si dans le cas d'un SELECT executeQuery doit retourner une copie du ResultSet + * @param rc copy_mode + */ + public void setCopyMode(boolean rc) + { + copy_mode = rc; + } /** * 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 + public void executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException { - Connection connection = null; - PreparedStatement statement = null; - ResultSet resultSet = null; - + boolean isSelect = sql.trim().toLowerCase().startsWith("select"); try { - connection = getConnection(); - boolean isSelect = sql.trim().toLowerCase().startsWith("select"); + if(connection == null) + { + connection = getConnection(); + } statement = connection.prepareStatement(sql); - if (params.length > 0) + 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; + if(copy_mode) + { + result_copy = null; + result_copy = copyInArrayListHashMap(resultSet); + resultSet.close(); + } } else { statement.executeUpdate(); - return null; } } finally { - statement.close(); - connection.close(); + if(copy_mode) + { + statement.close(); + connection.close(); + connection = null; + } } } @@ -75,4 +107,40 @@ public class SQLexecutor extends JDBC statement.setObject(i + 1, params[i]); } } + + /** + * copie du ResultSet dans une ArrayList de HashMap + * @param rs + * @return + * @throws SQLException + */ + private ArrayList> copyInArrayListHashMap(ResultSet rs) throws SQLException + { + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + ArrayList> result = new ArrayList>(); + + while(rs.next()) + { + HashMap row = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) + { + row.put(metaData.getColumnName(i), rs.getObject(i)); + } + result.add(row); + } + return result; + } + + /** + * fermeture de la connexion et effacement de l'objet pour réutilisation + * @throws SQLException + */ + public void close() throws SQLException + { + resultSet.close(); + statement.close(); + connection.close(); + connection = null; + } } -- cgit v1.2.3