summaryrefslogtreecommitdiff
path: root/src/modele/dao/SQLexecutor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/modele/dao/SQLexecutor.java')
-rw-r--r--src/modele/dao/SQLexecutor.java116
1 files changed, 92 insertions, 24 deletions
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;
3import java.sql.Connection; 3import java.sql.Connection;
4import java.sql.PreparedStatement; 4import java.sql.PreparedStatement;
5import java.sql.ResultSet; 5import java.sql.ResultSet;
6import java.sql.ResultSetMetaData;
6import java.sql.SQLException; 7import java.sql.SQLException;
8import java.util.ArrayList;
9import java.util.HashMap;
7 10
8/** 11/**
9 * exécuter des requêtes SQL: 12 * exécuter des requêtes SQL:
@@ -12,54 +15,83 @@ import java.sql.SQLException;
12 */ 15 */
13public class SQLexecutor extends JDBC 16public class SQLexecutor extends JDBC
14{ 17{
15 // constructeur par défaut 18 Connection connection = null;
19 PreparedStatement statement = null;
20 ResultSet resultSet = null;
21
22 private boolean copy_mode = false;
23 ArrayList<HashMap<String, Object>> result_copy = null;
24
25 // utilise le contructeur par défaut de java
26
27 /**
28 * retourne un ResultSet
29 * @return ResultSet
30 */
31 public ResultSet getResultSet()
32 {
33 return resultSet;
34 }
35 /**
36 * retourne une ArrayList d'HashMap
37 * @return ArrayList d'HashMap
38 */
39 public ArrayList<HashMap<String, Object>> getResultCopy()
40 {
41 return result_copy;
42 }
43
44 /**
45 * choisir si dans le cas d'un SELECT executeQuery doit retourner une copie du ResultSet
46 * @param rc copy_mode
47 */
48 public void setCopyMode(boolean rc)
49 {
50 copy_mode = rc;
51 }
16 52
17 /** 53 /**
18 * Exécute une requête SQL et retourne le résultat si applicable. 54 * Exécute une requête SQL et retourne le résultat si applicable.
19 * @param sql requête avec des ? 55 * @param sql requête avec des ?
20 * @param params nombre libre de paramètres, "Object..." permet de créer un tableau à partir des paramètres 56 * @param params nombre libre de paramètres, "Object..." permet de créer un tableau à partir des paramètres
21 * @return ResultSet si la requête est un SELECT, null sinon
22 * @throws SQLException en cas d'erreur SQL 57 * @throws SQLException en cas d'erreur SQL
23 * @throws ClassNotFoundException pour DriverManager.getConnection 58 * @throws ClassNotFoundException pour DriverManager.getConnection
24 */ 59 */
25 public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException 60 public void executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException
26 { 61 {
27 Connection connection = null; 62 boolean isSelect = sql.trim().toLowerCase().startsWith("select");
28 PreparedStatement statement = null;
29 ResultSet resultSet = null;
30
31 try { 63 try {
32 connection = getConnection(); 64 if(connection == null)
33 boolean isSelect = sql.trim().toLowerCase().startsWith("select"); 65 {
66 connection = getConnection();
67 }
34 68
35 statement = connection.prepareStatement(sql); 69 statement = connection.prepareStatement(sql);
36 if (params.length > 0) 70 if(params.length > 0)
37 { 71 {
38// if(isSelect)
39// => ResultSet.TYPE_SCROLL_INSENSITIVE;
40// navigation possible dans le ResultSet: next(), previous(), absolute();
41// ResultSet non modifiable en cas d'accès concurrent en mémoire
42// => PreparedStatement.NO_GENERATED_KEYS;
43// optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS)
44// statement = connection.prepareStatement(sql, isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS);
45
46 this.setParameters(statement, params); 72 this.setParameters(statement, params);
47 } 73 }
48 74
49 if(isSelect) { 75 if(isSelect) {
50 resultSet = statement.executeQuery(); 76 resultSet = statement.executeQuery();
51 ResultObject result = new ResultObject(resultSet); 77 if(copy_mode)
52 resultSet.close(); 78 {
53 return result; 79 result_copy = null;
80 result_copy = copyInArrayListHashMap(resultSet);
81 resultSet.close();
82 }
54 } 83 }
55 else { 84 else {
56 statement.executeUpdate(); 85 statement.executeUpdate();
57 return null;
58 } 86 }
59 } 87 }
60 finally { 88 finally {
61 statement.close(); 89 if(copy_mode)
62 connection.close(); 90 {
91 statement.close();
92 connection.close();
93 connection = null;
94 }
63 } 95 }
64 } 96 }
65 97
@@ -75,4 +107,40 @@ public class SQLexecutor extends JDBC
75 statement.setObject(i + 1, params[i]); 107 statement.setObject(i + 1, params[i]);
76 } 108 }
77 } 109 }
110
111 /**
112 * copie du ResultSet dans une ArrayList de HashMap
113 * @param rs
114 * @return
115 * @throws SQLException
116 */
117 private ArrayList<HashMap<String, Object>> copyInArrayListHashMap(ResultSet rs) throws SQLException
118 {
119 ResultSetMetaData metaData = rs.getMetaData();
120 int columnCount = metaData.getColumnCount();
121 ArrayList<HashMap<String, Object>> result = new ArrayList<HashMap<String, Object>>();
122
123 while(rs.next())
124 {
125 HashMap<String, Object> row = new HashMap<>();
126 for (int i = 1; i <= columnCount; i++)
127 {
128 row.put(metaData.getColumnName(i), rs.getObject(i));
129 }
130 result.add(row);
131 }
132 return result;
133 }
134
135 /**
136 * fermeture de la connexion et effacement de l'objet pour réutilisation
137 * @throws SQLException
138 */
139 public void close() throws SQLException
140 {
141 resultSet.close();
142 statement.close();
143 connection.close();
144 connection = null;
145 }
78} 146}