1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
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:
* 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
{
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
private boolean copy_mode = false;
ArrayList<HashMap<String, Object>> 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<HashMap<String, Object>> 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
* @throws SQLException en cas d'erreur SQL
* @throws ClassNotFoundException pour DriverManager.getConnection
*/
public void executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException
{
boolean isSelect = sql.trim().toLowerCase().startsWith("select");
try {
if(connection == null)
{
connection = getConnection();
}
statement = connection.prepareStatement(sql);
if(params.length > 0)
{
this.setParameters(statement, params);
}
if(isSelect) {
resultSet = statement.executeQuery();
if(copy_mode)
{
result_copy = null;
result_copy = copyInArrayListHashMap(resultSet);
resultSet.close();
}
}
else {
statement.executeUpdate();
}
}
finally {
if(copy_mode)
{
statement.close();
connection.close();
connection = null;
}
}
}
/**
* 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]);
}
}
/**
* copie du ResultSet dans une ArrayList de HashMap
* @param rs
* @return
* @throws SQLException
*/
private ArrayList<HashMap<String, Object>> copyInArrayListHashMap(ResultSet rs) throws SQLException
{
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
ArrayList<HashMap<String, Object>> result = new ArrayList<HashMap<String, Object>>();
while(rs.next())
{
HashMap<String, Object> 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;
}
}
|