diff options
author | polo-pc-greta <ordipolo@gmx.fr> | 2025-02-15 11:52:51 +0100 |
---|---|---|
committer | polo-pc-greta <ordipolo@gmx.fr> | 2025-02-15 11:52:51 +0100 |
commit | d8dc2b6d0d4dbc93da853ef5a7562d6a223ee918 (patch) | |
tree | 9cb7cab318f29f3e37f8c15c301ca4aa3dee8bec | |
download | JDBC-d8dc2b6d0d4dbc93da853ef5a7562d6a223ee918.zip |
release candidate 1
-rw-r--r-- | src/DAO_Test.java | 38 | ||||
-rw-r--r-- | src/dao/JDBC.java | 90 | ||||
-rw-r--r-- | src/dao/ResultObject.java | 39 | ||||
-rw-r--r-- | src/dao/SQLexecutor.java | 80 |
4 files changed, 247 insertions, 0 deletions
diff --git a/src/DAO_Test.java b/src/DAO_Test.java new file mode 100644 index 0000000..aa6a0af --- /dev/null +++ b/src/DAO_Test.java | |||
@@ -0,0 +1,38 @@ | |||
1 | /* pour tester les classes */ | ||
2 | |||
3 | import java.sql.SQLException; | ||
4 | import java.util.HashMap; | ||
5 | import dao.JDBC; | ||
6 | import dao.ResultObject; | ||
7 | import dao.SQLexecutor; | ||
8 | |||
9 | public class DAO_Test | ||
10 | { | ||
11 | public static void main(String[] args) throws SQLException, ClassNotFoundException | ||
12 | { | ||
13 | JDBC.setInfos("localhost", "mysql", "tp", "root", ""); | ||
14 | SQLexecutor executor = new SQLexecutor(); | ||
15 | |||
16 | // SELECT | ||
17 | ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); | ||
18 | for(HashMap<String, Object> row : result.getData()) | ||
19 | { | ||
20 | System.out.println("prenom: " + row.get("prenom")); // une entrée | ||
21 | |||
22 | // foreach sur toutes les entrées | ||
23 | for(HashMap.Entry<String, Object> one_field : row.entrySet()) | ||
24 | { | ||
25 | System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); | ||
26 | } | ||
27 | } | ||
28 | |||
29 | // INSERT | ||
30 | executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22); | ||
31 | |||
32 | // UPDATE | ||
33 | executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan"); | ||
34 | |||
35 | // DELETE | ||
36 | executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan"); | ||
37 | } | ||
38 | } | ||
diff --git a/src/dao/JDBC.java b/src/dao/JDBC.java new file mode 100644 index 0000000..714803e --- /dev/null +++ b/src/dao/JDBC.java | |||
@@ -0,0 +1,90 @@ | |||
1 | package dao; | ||
2 | |||
3 | import java.sql.Connection; | ||
4 | import java.sql.DriverManager; | ||
5 | import java.sql.SQLException; | ||
6 | |||
7 | /** | ||
8 | * connexion à la BDD avec JDBC | ||
9 | * tous les paramètres de connexion et les setters sont statiques | ||
10 | * le nom de la table sélectionnée est dans ModelCRUD | ||
11 | */ | ||
12 | abstract public class JDBC | ||
13 | { | ||
14 | private static String dbms="mysql"; | ||
15 | private static String strClassName = "com.mysql.cj.jdbc.Driver"; | ||
16 | private static String port = "3306"; | ||
17 | private static String dbname; | ||
18 | private static String login; | ||
19 | private static String password; | ||
20 | private static String host= "localhost"; | ||
21 | private static String strUrl; | ||
22 | |||
23 | protected Connection getConnection() throws SQLException, ClassNotFoundException | ||
24 | { | ||
25 | Class.forName(strClassName); | ||
26 | return DriverManager.getConnection(strUrl, login, password); | ||
27 | // try { | ||
28 | // Class.forName(strClassName); // chargement du driver | ||
29 | // return DriverManager.getConnection(strUrl, login, password); | ||
30 | // } | ||
31 | // catch(ClassNotFoundException e) { | ||
32 | // System.err.println("Driver non chargé !"); | ||
33 | // e.printStackTrace(); | ||
34 | // } | ||
35 | // catch(SQLException e) { | ||
36 | // e.printStackTrace(); | ||
37 | // } | ||
38 | // return null; | ||
39 | } | ||
40 | |||
41 | // setters | ||
42 | public static void setHost(String host) { | ||
43 | JDBC.host = host; | ||
44 | } | ||
45 | public static void setDBMS(String dbms) { | ||
46 | JDBC.dbms = dbms; | ||
47 | if(dbms == "mysql") | ||
48 | { | ||
49 | JDBC.strClassName = "com.mysql.cj.jdbc.Driver"; | ||
50 | JDBC.port = "3306"; | ||
51 | } | ||
52 | else if(dbms == "mariadb") | ||
53 | { | ||
54 | JDBC.strClassName = "org.mariadb.jdbc.Driver"; | ||
55 | JDBC.port = "3306"; | ||
56 | } | ||
57 | } | ||
58 | private static void setStrUrl() { | ||
59 | JDBC.strUrl = "jdbc:" + dbms + "://" + host + ":" + port + "/" + dbname; | ||
60 | } | ||
61 | public static void setDbName(String dbName) { | ||
62 | JDBC.dbname = dbName; | ||
63 | } | ||
64 | public static void setLogin(String login) { | ||
65 | JDBC.login = login; | ||
66 | } | ||
67 | public static void setMotdepasse(String motdepasse) { | ||
68 | JDBC.password = motdepasse; | ||
69 | } | ||
70 | public static void setInfos(String host, String dbms, String dbname, String login, String password) | ||
71 | { | ||
72 | JDBC.dbname = dbname; | ||
73 | JDBC.login = login; | ||
74 | JDBC.password = password; | ||
75 | JDBC.host = host; | ||
76 | setDBMS(dbms); | ||
77 | JDBC.setStrUrl(); | ||
78 | } | ||
79 | |||
80 | // public void close() | ||
81 | // { | ||
82 | // try { | ||
83 | // this.conn.close(); // libérer le slot (même principe que l'attaque DDOS) | ||
84 | // this.conn = null; // pour pouvoir réinstancier avec d'autres paramètres | ||
85 | // } | ||
86 | // catch (SQLException e) { | ||
87 | // e.printStackTrace(); | ||
88 | // } | ||
89 | // } | ||
90 | } | ||
diff --git a/src/dao/ResultObject.java b/src/dao/ResultObject.java new file mode 100644 index 0000000..e41af0b --- /dev/null +++ b/src/dao/ResultObject.java | |||
@@ -0,0 +1,39 @@ | |||
1 | package dao; | ||
2 | |||
3 | import java.sql.ResultSet; | ||
4 | import java.sql.ResultSetMetaData; | ||
5 | import java.sql.SQLException; | ||
6 | import java.util.ArrayList; | ||
7 | import java.util.HashMap; | ||
8 | import java.util.List; | ||
9 | |||
10 | public class ResultObject | ||
11 | { | ||
12 | private final List<HashMap<String, Object>> data = new ArrayList<>(); | ||
13 | |||
14 | public ResultObject(ResultSet rs) throws SQLException | ||
15 | { | ||
16 | ResultSetMetaData metaData = rs.getMetaData(); | ||
17 | int columnCount = metaData.getColumnCount(); | ||
18 | |||
19 | while(rs.next()) | ||
20 | { | ||
21 | HashMap<String, Object> row = new HashMap<>(); | ||
22 | for (int i = 1; i <= columnCount; i++) | ||
23 | { | ||
24 | row.put(metaData.getColumnName(i), rs.getObject(i)); | ||
25 | } | ||
26 | data.add(row); | ||
27 | } | ||
28 | |||
29 | // rs.close(); | ||
30 | // rs.getStatement().close(); | ||
31 | // rs.getStatement().getConnection().close(); | ||
32 | |||
33 | } | ||
34 | |||
35 | public List<HashMap<String, Object>> getData() | ||
36 | { | ||
37 | return data; | ||
38 | } | ||
39 | } | ||
diff --git a/src/dao/SQLexecutor.java b/src/dao/SQLexecutor.java new file mode 100644 index 0000000..8f7f130 --- /dev/null +++ b/src/dao/SQLexecutor.java | |||
@@ -0,0 +1,80 @@ | |||
1 | package dao; | ||
2 | |||
3 | import java.sql.Connection; | ||
4 | import java.sql.PreparedStatement; | ||
5 | import java.sql.ResultSet; | ||
6 | import java.sql.SQLException; | ||
7 | |||
8 | public class SQLexecutor extends JDBC | ||
9 | { | ||
10 | /** | ||
11 | * Exécute une requête SQL et retourne le résultat si applicable. | ||
12 | * @param sql requête avec des ? | ||
13 | * @param params Object... permet d'ajouter autant de paramètres qu'on veut et ça fait un tableau | ||
14 | * @return Un ResultSet si la requête est un SELECT, sinon null | ||
15 | * @throws SQLException en cas d'erreur SQL | ||
16 | * @throws ClassNotFoundException pour DriverManager.getConnection | ||
17 | */ | ||
18 | public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException | ||
19 | { | ||
20 | Connection connection = null; | ||
21 | PreparedStatement statement = null; | ||
22 | ResultSet resultSet = null; | ||
23 | |||
24 | try { | ||
25 | connection = getConnection(); | ||
26 | boolean isSelect = sql.trim().toLowerCase().startsWith("select"); | ||
27 | |||
28 | if (params.length > 0) | ||
29 | { | ||
30 | int option; | ||
31 | if(isSelect) | ||
32 | { | ||
33 | option = ResultSet.TYPE_SCROLL_INSENSITIVE; | ||
34 | // navigation possible dans le ResultSet: next(), previous(), absolute(); | ||
35 | // ResultSet non modifiable en cas d'accès concurrent en mémoire | ||
36 | } | ||
37 | else | ||
38 | { | ||
39 | option = PreparedStatement.NO_GENERATED_KEYS; | ||
40 | // optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS) | ||
41 | } | ||
42 | statement = connection.prepareStatement(sql, option); | ||
43 | //isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); | ||
44 | this.setParameters(statement, params); | ||
45 | } else { | ||
46 | statement = connection.prepareStatement(sql); | ||
47 | } | ||
48 | |||
49 | if(isSelect) { | ||
50 | resultSet = statement.executeQuery(); | ||
51 | ResultObject result = new ResultObject(resultSet); | ||
52 | resultSet.close(); | ||
53 | return result; | ||
54 | } else { | ||
55 | statement.executeUpdate(); | ||
56 | return null; | ||
57 | } | ||
58 | } finally { | ||
59 | statement.close(); | ||
60 | connection.close(); | ||
61 | // if (resultSet == null) { | ||
62 | // statement.close(); | ||
63 | // connection.close(); | ||
64 | // } | ||
65 | } | ||
66 | } | ||
67 | |||
68 | /** | ||
69 | * Affecte les paramètres aux requêtes préparées. | ||
70 | * @param statement | ||
71 | * @param params Object... permet d'ajouter autant de paramètres qu'on veut et ça fait un tableau | ||
72 | * @throws SQLException en cas d'erreur SQL | ||
73 | */ | ||
74 | private void setParameters(PreparedStatement statement, Object... params) throws SQLException | ||
75 | { | ||
76 | for (int i = 0; i < params.length; i++) { | ||
77 | statement.setObject(i + 1, params[i]); | ||
78 | } | ||
79 | } | ||
80 | } | ||