summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo-pc-greta <ordipolo@gmx.fr>2025-02-15 11:52:51 +0100
committerpolo-pc-greta <ordipolo@gmx.fr>2025-02-15 11:52:51 +0100
commitd8dc2b6d0d4dbc93da853ef5a7562d6a223ee918 (patch)
tree9cb7cab318f29f3e37f8c15c301ca4aa3dee8bec
downloadJDBC-d8dc2b6d0d4dbc93da853ef5a7562d6a223ee918.zip
release candidate 1
-rw-r--r--src/DAO_Test.java38
-rw-r--r--src/dao/JDBC.java90
-rw-r--r--src/dao/ResultObject.java39
-rw-r--r--src/dao/SQLexecutor.java80
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
3import java.sql.SQLException;
4import java.util.HashMap;
5import dao.JDBC;
6import dao.ResultObject;
7import dao.SQLexecutor;
8
9public 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 @@
1package dao;
2
3import java.sql.Connection;
4import java.sql.DriverManager;
5import 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 */
12abstract 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 @@
1package dao;
2
3import java.sql.ResultSet;
4import java.sql.ResultSetMetaData;
5import java.sql.SQLException;
6import java.util.ArrayList;
7import java.util.HashMap;
8import java.util.List;
9
10public 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 @@
1package dao;
2
3import java.sql.Connection;
4import java.sql.PreparedStatement;
5import java.sql.ResultSet;
6import java.sql.SQLException;
7
8public 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}