summaryrefslogtreecommitdiff
path: root/src/modele
diff options
context:
space:
mode:
Diffstat (limited to 'src/modele')
-rw-r--r--src/modele/DAO_Test.java57
-rw-r--r--src/modele/dao/ResultObject.java46
-rw-r--r--src/modele/dao/SQLexecutor.java116
3 files changed, 133 insertions, 86 deletions
diff --git a/src/modele/DAO_Test.java b/src/modele/DAO_Test.java
index bf38d97..98180ad 100644
--- a/src/modele/DAO_Test.java
+++ b/src/modele/DAO_Test.java
@@ -1,12 +1,13 @@
1/* pour tester les classes, fichier à supprimer */ 1/* pour tester les classes */
2 2
3package modele; 3package modele;
4 4
5import java.sql.ResultSet;
6//import java.sql.ResultSetMetaData;
5import java.sql.SQLException; 7import java.sql.SQLException;
8import java.util.ArrayList;
6import java.util.HashMap; 9import java.util.HashMap;
7
8import modele.dao.JDBC; 10import modele.dao.JDBC;
9import modele.dao.ResultObject;
10import modele.dao.SQLexecutor; 11import modele.dao.SQLexecutor;
11 12
12/* 13/*
@@ -16,11 +17,12 @@ public class DAO_Test
16{ 17{
17 public static void main(String[] args) throws SQLException, ClassNotFoundException 18 public static void main(String[] args) throws SQLException, ClassNotFoundException
18 { 19 {
19 // envoie de tous les paramètres en même temps 20 /* paramètres de la BDD à envoyer une fois au début*/
21
22 // version envoi tout en même temps
20 JDBC.setInfos("localhost", "mysql", "tp", "root", ""); 23 JDBC.setInfos("localhost", "mysql", "tp", "root", "");
21 24
22 // même chose avec envoie un par un 25 // version envoie un par un, finir par un JDBC.setStrUlr();
23 // si un paramètre doit être modifié à la volée, faire un JDBC.setStrUlr(); après
24 JDBC.setHost("localhost"); 26 JDBC.setHost("localhost");
25 JDBC.setDBMS("mysql"); 27 JDBC.setDBMS("mysql");
26 JDBC.setDbName("tp"); 28 JDBC.setDbName("tp");
@@ -28,27 +30,50 @@ public class DAO_Test
28 JDBC.setPassword(""); 30 JDBC.setPassword("");
29 JDBC.setStrUrl(); 31 JDBC.setStrUrl();
30 32
33
34 /* début du contrôleur */
31 SQLexecutor executor = new SQLexecutor(); 35 SQLexecutor executor = new SQLexecutor();
32 36
33 // SELECT 37
34 ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); 38 executor.setCopyMode(false); // mode copie désactivé (= mode normal)
35 for(HashMap<String, Object> row : result.getData()) // foreach sur les entrées 39 // un SELECT produit un ResultSet
40 // ne pas oublier de fermer la connexion à la fin du contrôleur
41 executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1);
42 ResultSet result1 = executor.getResultSet();
43 while(result1.next())
36 { 44 {
37 System.out.println("prénom: " + row.get("prenom")); //un champ d'une entrée 45 System.out.println("prénom: " + result1.getString("prenom"));
46 }
47
48 // les requêtes INSERT, UPDATE et DELETE utilise la connexion ouverte et la laissent ouverte
49 executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22);
50 executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan");
51 executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan");
52
53 executor.close(); // fermeture !!
54
55
56
57 executor.setCopyMode(true); // mode copie activé
58 // un SELECT produit une copie dans une array list d'hashmap
59 // la connexion est fermée automatiqument après chaque requête
60 executor.executeQuery("SELECT * FROM acces WHERE id = ?", 2);
61 ArrayList<HashMap<String, Object>> result2 = executor.getResultCopy();
62
63 for(HashMap<String, Object> row : result2) // foreach sur les entrées
64 {
65 // obtenir un champ d'une entrée
66 System.out.println("prénom: " + row.get("prenom"));
38 67
39 for(HashMap.Entry<String, Object> one_field : row.entrySet()) // foreach sur les champs 68 // tout afficher avec "foreach"
69 for(HashMap.Entry<String, Object> one_field : row.entrySet())
40 { 70 {
41 System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); 71 System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n");
42 } 72 }
43 } 73 }
44 74
45 // INSERT
46 executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22); 75 executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22);
47
48 // UPDATE
49 executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan"); 76 executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan");
50
51 // DELETE
52 executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan"); 77 executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan");
53 } 78 }
54} 79}
diff --git a/src/modele/dao/ResultObject.java b/src/modele/dao/ResultObject.java
deleted file mode 100644
index 7f91824..0000000
--- a/src/modele/dao/ResultObject.java
+++ /dev/null
@@ -1,46 +0,0 @@
1package modele.dao;
2
3import java.sql.ResultSet;
4import java.sql.ResultSetMetaData;
5import java.sql.SQLException;
6import java.util.ArrayList;
7import java.util.HashMap;
8
9/**
10 * conteneur pour ResultSet dans le cas d'un SELECT,
11 * les valeurs des HashMap sont des "Object" pour gérer tous les types de données
12 */
13public class ResultObject
14{
15 private final ArrayList<HashMap<String, Object>> data = new ArrayList<>();
16
17 /**
18 * copie du ResultSet dans une ArrayList composée d'HashMap
19 * @param rs instance de ResultSet
20 * @throws SQLException en cas d'erreur avec le ResultSet
21 */
22 public ResultObject(ResultSet rs) throws SQLException
23 {
24 ResultSetMetaData metaData = rs.getMetaData();
25 int columnCount = metaData.getColumnCount();
26
27 while(rs.next())
28 {
29 HashMap<String, Object> row = new HashMap<>();
30 for (int i = 1; i <= columnCount; i++)
31 {
32 row.put(metaData.getColumnName(i), rs.getObject(i));
33 }
34 data.add(row);
35 }
36 }
37
38 /**
39 * à utiliser dans la boucle permettant de parcourir la liste
40 * @return retourne la liste encapsulée
41 */
42 public ArrayList<HashMap<String, Object>> getData()
43 {
44 return data;
45 }
46}
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}