diff options
| author | polo-pc-greta <ordipolo@gmx.fr> | 2025-02-15 14:12:55 +0100 |
|---|---|---|
| committer | polo-pc-greta <ordipolo@gmx.fr> | 2025-02-15 14:12:55 +0100 |
| commit | efed27a703022ecb366a301340f5fcbb8135a2fd (patch) | |
| tree | a58593f0522156a3fca146eb973ec2aba8c8cb51 /src | |
| parent | d8dc2b6d0d4dbc93da853ef5a7562d6a223ee918 (diff) | |
| download | JDBC-efed27a703022ecb366a301340f5fcbb8135a2fd.tar.gz JDBC-efed27a703022ecb366a301340f5fcbb8135a2fd.tar.bz2 JDBC-efed27a703022ecb366a301340f5fcbb8135a2fd.zip | |
release candidate 2
Diffstat (limited to 'src')
| -rw-r--r-- | src/DAO_Test.java | 21 | ||||
| -rw-r--r-- | src/dao/JDBC.java | 62 | ||||
| -rw-r--r-- | src/dao/ResultObject.java | 25 | ||||
| -rw-r--r-- | src/dao/SQLexecutor.java | 48 |
4 files changed, 88 insertions, 68 deletions
diff --git a/src/DAO_Test.java b/src/DAO_Test.java index aa6a0af..673f2b7 100644 --- a/src/DAO_Test.java +++ b/src/DAO_Test.java | |||
| @@ -6,21 +6,34 @@ import dao.JDBC; | |||
| 6 | import dao.ResultObject; | 6 | import dao.ResultObject; |
| 7 | import dao.SQLexecutor; | 7 | import dao.SQLexecutor; |
| 8 | 8 | ||
| 9 | /* | ||
| 10 | * fonction main pour tester des commandes | ||
| 11 | */ | ||
| 9 | public class DAO_Test | 12 | public class DAO_Test |
| 10 | { | 13 | { |
| 11 | public static void main(String[] args) throws SQLException, ClassNotFoundException | 14 | public static void main(String[] args) throws SQLException, ClassNotFoundException |
| 12 | { | 15 | { |
| 16 | // envoie de tous les paramètres en même temps | ||
| 13 | JDBC.setInfos("localhost", "mysql", "tp", "root", ""); | 17 | JDBC.setInfos("localhost", "mysql", "tp", "root", ""); |
| 18 | |||
| 19 | // même chose avec envoie un par un | ||
| 20 | // si un paramètre doit être modifié à la volée, faire un JDBC.setStrUlr(); après | ||
| 21 | JDBC.setHost("localhost"); | ||
| 22 | JDBC.setDBMS("mysql"); | ||
| 23 | JDBC.setDbName("tp"); | ||
| 24 | JDBC.setLogin("root"); | ||
| 25 | JDBC.setPassword(""); | ||
| 26 | JDBC.setStrUrl(); | ||
| 27 | |||
| 14 | SQLexecutor executor = new SQLexecutor(); | 28 | SQLexecutor executor = new SQLexecutor(); |
| 15 | 29 | ||
| 16 | // SELECT | 30 | // SELECT |
| 17 | ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); | 31 | ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); |
| 18 | for(HashMap<String, Object> row : result.getData()) | 32 | for(HashMap<String, Object> row : result.getData()) // foreach sur les entrées |
| 19 | { | 33 | { |
| 20 | System.out.println("prenom: " + row.get("prenom")); // une entrée | 34 | System.out.println("prénom: " + row.get("prenom")); //un champ d'une entrée |
| 21 | 35 | ||
| 22 | // foreach sur toutes les entrées | 36 | for(HashMap.Entry<String, Object> one_field : row.entrySet()) // foreach sur les champs |
| 23 | for(HashMap.Entry<String, Object> one_field : row.entrySet()) | ||
| 24 | { | 37 | { |
| 25 | System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); | 38 | System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); |
| 26 | } | 39 | } |
diff --git a/src/dao/JDBC.java b/src/dao/JDBC.java index 714803e..324ff2d 100644 --- a/src/dao/JDBC.java +++ b/src/dao/JDBC.java | |||
| @@ -5,9 +5,9 @@ import java.sql.DriverManager; | |||
| 5 | import java.sql.SQLException; | 5 | import java.sql.SQLException; |
| 6 | 6 | ||
| 7 | /** | 7 | /** |
| 8 | * connexion à la BDD avec JDBC | 8 | * connexion avec JDBC pour utilisation par la classe fille: SQLexecutor, |
| 9 | * tous les paramètres de connexion et les setters sont statiques | 9 | * les paramètres de connexion et les setters sont statiques |
| 10 | * le nom de la table sélectionnée est dans ModelCRUD | 10 | * |
| 11 | */ | 11 | */ |
| 12 | abstract public class JDBC | 12 | abstract public class JDBC |
| 13 | { | 13 | { |
| @@ -20,25 +20,31 @@ abstract public class JDBC | |||
| 20 | private static String host= "localhost"; | 20 | private static String host= "localhost"; |
| 21 | private static String strUrl; | 21 | private static String strUrl; |
| 22 | 22 | ||
| 23 | /** | ||
| 24 | * retourne une instance de Connection avec JDBC | ||
| 25 | * @return instance de Connection | ||
| 26 | * @throws SQLException en cas d'erreur de connexion | ||
| 27 | * @throws ClassNotFoundException pour Class.forName() | ||
| 28 | */ | ||
| 23 | protected Connection getConnection() throws SQLException, ClassNotFoundException | 29 | protected Connection getConnection() throws SQLException, ClassNotFoundException |
| 24 | { | 30 | { |
| 25 | Class.forName(strClassName); | 31 | Class.forName(strClassName); |
| 26 | return DriverManager.getConnection(strUrl, login, password); | 32 | 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 | } | 33 | } |
| 40 | 34 | ||
| 41 | // setters | 35 | // setters |
| 36 | /** | ||
| 37 | * génère l'url utilisée par le driver, | ||
| 38 | * à n'exécuter que lorsque tous les paramètres ont été renseignés (en particulier dbname, login et password), | ||
| 39 | * certains: host, dbms, strClassName et port ont des valeurs par défaut pour un serveur mysql sur localhost | ||
| 40 | */ | ||
| 41 | public static void setStrUrl() { | ||
| 42 | if(dbname != null && login != null && password != null) { | ||
| 43 | JDBC.strUrl = "jdbc:" + dbms + "://" + host + ":" + port + "/" + dbname; | ||
| 44 | } | ||
| 45 | else System.out.print("il manque des paramètres nécéssaires à la connexion au driver"); | ||
| 46 | } | ||
| 47 | |||
| 42 | public static void setHost(String host) { | 48 | public static void setHost(String host) { |
| 43 | JDBC.host = host; | 49 | JDBC.host = host; |
| 44 | } | 50 | } |
| @@ -55,18 +61,25 @@ abstract public class JDBC | |||
| 55 | JDBC.port = "3306"; | 61 | JDBC.port = "3306"; |
| 56 | } | 62 | } |
| 57 | } | 63 | } |
| 58 | private static void setStrUrl() { | ||
| 59 | JDBC.strUrl = "jdbc:" + dbms + "://" + host + ":" + port + "/" + dbname; | ||
| 60 | } | ||
| 61 | public static void setDbName(String dbName) { | 64 | public static void setDbName(String dbName) { |
| 62 | JDBC.dbname = dbName; | 65 | JDBC.dbname = dbName; |
| 63 | } | 66 | } |
| 64 | public static void setLogin(String login) { | 67 | public static void setLogin(String login) { |
| 65 | JDBC.login = login; | 68 | JDBC.login = login; |
| 66 | } | 69 | } |
| 67 | public static void setMotdepasse(String motdepasse) { | 70 | public static void setPassword(String motdepasse) { |
| 68 | JDBC.password = motdepasse; | 71 | JDBC.password = motdepasse; |
| 69 | } | 72 | } |
| 73 | |||
| 74 | /** | ||
| 75 | * donner tous les paramètres de connexion en une fois | ||
| 76 | * il est également possible de les donner un par un avec les setters en finissant pas JDBC.setStrUrl() | ||
| 77 | * @param host adresse du serveur | ||
| 78 | * @param dbms obtenir le nom du driver et le numéro du port à partir du nom du SGBD | ||
| 79 | * @param dbname de la base de données | ||
| 80 | * @param login nom d'utilisateur | ||
| 81 | * @param password mot de passe | ||
| 82 | */ | ||
| 70 | public static void setInfos(String host, String dbms, String dbname, String login, String password) | 83 | public static void setInfos(String host, String dbms, String dbname, String login, String password) |
| 71 | { | 84 | { |
| 72 | JDBC.dbname = dbname; | 85 | JDBC.dbname = dbname; |
| @@ -76,15 +89,4 @@ abstract public class JDBC | |||
| 76 | setDBMS(dbms); | 89 | setDBMS(dbms); |
| 77 | JDBC.setStrUrl(); | 90 | JDBC.setStrUrl(); |
| 78 | } | 91 | } |
| 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 | } | 92 | } |
diff --git a/src/dao/ResultObject.java b/src/dao/ResultObject.java index e41af0b..1df9d88 100644 --- a/src/dao/ResultObject.java +++ b/src/dao/ResultObject.java | |||
| @@ -5,12 +5,20 @@ import java.sql.ResultSetMetaData; | |||
| 5 | import java.sql.SQLException; | 5 | import java.sql.SQLException; |
| 6 | import java.util.ArrayList; | 6 | import java.util.ArrayList; |
| 7 | import java.util.HashMap; | 7 | import java.util.HashMap; |
| 8 | import java.util.List; | ||
| 9 | 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 | */ | ||
| 10 | public class ResultObject | 13 | public class ResultObject |
| 11 | { | 14 | { |
| 12 | private final List<HashMap<String, Object>> data = new ArrayList<>(); | 15 | private final ArrayList<HashMap<String, Object>> data = new ArrayList<>(); |
| 13 | 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 | */ | ||
| 14 | public ResultObject(ResultSet rs) throws SQLException | 22 | public ResultObject(ResultSet rs) throws SQLException |
| 15 | { | 23 | { |
| 16 | ResultSetMetaData metaData = rs.getMetaData(); | 24 | ResultSetMetaData metaData = rs.getMetaData(); |
| @@ -24,15 +32,14 @@ public class ResultObject | |||
| 24 | row.put(metaData.getColumnName(i), rs.getObject(i)); | 32 | row.put(metaData.getColumnName(i), rs.getObject(i)); |
| 25 | } | 33 | } |
| 26 | data.add(row); | 34 | data.add(row); |
| 27 | } | 35 | } |
| 28 | |||
| 29 | // rs.close(); | ||
| 30 | // rs.getStatement().close(); | ||
| 31 | // rs.getStatement().getConnection().close(); | ||
| 32 | |||
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | public List<HashMap<String, Object>> getData() | 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() | ||
| 36 | { | 43 | { |
| 37 | return data; | 44 | return data; |
| 38 | } | 45 | } |
diff --git a/src/dao/SQLexecutor.java b/src/dao/SQLexecutor.java index 8f7f130..430c1c0 100644 --- a/src/dao/SQLexecutor.java +++ b/src/dao/SQLexecutor.java | |||
| @@ -5,13 +5,20 @@ import java.sql.PreparedStatement; | |||
| 5 | import java.sql.ResultSet; | 5 | import java.sql.ResultSet; |
| 6 | import java.sql.SQLException; | 6 | import java.sql.SQLException; |
| 7 | 7 | ||
| 8 | /** | ||
| 9 | * exécuter des requêtes SQL: | ||
| 10 | * connexion avec JDBC => préparation de la requête => exécution | ||
| 11 | * => copie du ResultSet dans une ArrayList d'HashMap => fermeture de la connexion | ||
| 12 | */ | ||
| 8 | public class SQLexecutor extends JDBC | 13 | public class SQLexecutor extends JDBC |
| 9 | { | 14 | { |
| 15 | // constructeur par défaut | ||
| 16 | |||
| 10 | /** | 17 | /** |
| 11 | * Exécute une requête SQL et retourne le résultat si applicable. | 18 | * Exécute une requête SQL et retourne le résultat si applicable. |
| 12 | * @param sql requête avec des ? | 19 | * @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 | 20 | * @param params nombre libre de paramètres, "Object..." permet de créer un tableau à partir des paramètres |
| 14 | * @return Un ResultSet si la requête est un SELECT, sinon null | 21 | * @return ResultSet si la requête est un SELECT, null sinon |
| 15 | * @throws SQLException en cas d'erreur SQL | 22 | * @throws SQLException en cas d'erreur SQL |
| 16 | * @throws ClassNotFoundException pour DriverManager.getConnection | 23 | * @throws ClassNotFoundException pour DriverManager.getConnection |
| 17 | */ | 24 | */ |
| @@ -24,26 +31,19 @@ public class SQLexecutor extends JDBC | |||
| 24 | try { | 31 | try { |
| 25 | connection = getConnection(); | 32 | connection = getConnection(); |
| 26 | boolean isSelect = sql.trim().toLowerCase().startsWith("select"); | 33 | boolean isSelect = sql.trim().toLowerCase().startsWith("select"); |
| 27 | 34 | ||
| 35 | statement = connection.prepareStatement(sql); | ||
| 28 | if (params.length > 0) | 36 | if (params.length > 0) |
| 29 | { | 37 | { |
| 30 | int option; | 38 | // if(isSelect) |
| 31 | if(isSelect) | 39 | // => ResultSet.TYPE_SCROLL_INSENSITIVE; |
| 32 | { | 40 | // navigation possible dans le ResultSet: next(), previous(), absolute(); |
| 33 | option = ResultSet.TYPE_SCROLL_INSENSITIVE; | 41 | // ResultSet non modifiable en cas d'accès concurrent en mémoire |
| 34 | // navigation possible dans le ResultSet: next(), previous(), absolute(); | 42 | // => PreparedStatement.NO_GENERATED_KEYS; |
| 35 | // ResultSet non modifiable en cas d'accès concurrent en mémoire | 43 | // optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS) |
| 36 | } | 44 | // statement = connection.prepareStatement(sql, isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); |
| 37 | else | 45 | |
| 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); | 46 | this.setParameters(statement, params); |
| 45 | } else { | ||
| 46 | statement = connection.prepareStatement(sql); | ||
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | if(isSelect) { | 49 | if(isSelect) { |
| @@ -51,17 +51,15 @@ public class SQLexecutor extends JDBC | |||
| 51 | ResultObject result = new ResultObject(resultSet); | 51 | ResultObject result = new ResultObject(resultSet); |
| 52 | resultSet.close(); | 52 | resultSet.close(); |
| 53 | return result; | 53 | return result; |
| 54 | } else { | 54 | } |
| 55 | else { | ||
| 55 | statement.executeUpdate(); | 56 | statement.executeUpdate(); |
| 56 | return null; | 57 | return null; |
| 57 | } | 58 | } |
| 58 | } finally { | 59 | } |
| 60 | finally { | ||
| 59 | statement.close(); | 61 | statement.close(); |
| 60 | connection.close(); | 62 | connection.close(); |
| 61 | // if (resultSet == null) { | ||
| 62 | // statement.close(); | ||
| 63 | // connection.close(); | ||
| 64 | // } | ||
| 65 | } | 63 | } |
| 66 | } | 64 | } |
| 67 | 65 | ||
