From 30c38f78018c160fdeb44175e4ef97f0c2868b37 Mon Sep 17 00:00:00 2001 From: polo Date: Sat, 15 Feb 2025 15:25:40 +0100 Subject: release candidate 3 --- src/DAO_Test.java | 51 ---------------------- src/dao/JDBC.java | 92 ---------------------------------------- src/dao/ResultObject.java | 46 -------------------- src/dao/SQLexecutor.java | 78 ---------------------------------- src/modele/DAO_Test.java | 54 +++++++++++++++++++++++ src/modele/dao/JDBC.java | 92 ++++++++++++++++++++++++++++++++++++++++ src/modele/dao/ResultObject.java | 46 ++++++++++++++++++++ src/modele/dao/SQLexecutor.java | 78 ++++++++++++++++++++++++++++++++++ 8 files changed, 270 insertions(+), 267 deletions(-) delete mode 100644 src/DAO_Test.java delete mode 100644 src/dao/JDBC.java delete mode 100644 src/dao/ResultObject.java delete mode 100644 src/dao/SQLexecutor.java create mode 100644 src/modele/DAO_Test.java create mode 100644 src/modele/dao/JDBC.java create mode 100644 src/modele/dao/ResultObject.java create mode 100644 src/modele/dao/SQLexecutor.java diff --git a/src/DAO_Test.java b/src/DAO_Test.java deleted file mode 100644 index 673f2b7..0000000 --- a/src/DAO_Test.java +++ /dev/null @@ -1,51 +0,0 @@ -/* pour tester les classes */ - -import java.sql.SQLException; -import java.util.HashMap; -import dao.JDBC; -import dao.ResultObject; -import dao.SQLexecutor; - -/* - * fonction main pour tester des commandes - */ -public class DAO_Test -{ - public static void main(String[] args) throws SQLException, ClassNotFoundException - { - // envoie de tous les paramètres en même temps - JDBC.setInfos("localhost", "mysql", "tp", "root", ""); - - // même chose avec envoie un par un - // si un paramètre doit être modifié à la volée, faire un JDBC.setStrUlr(); après - JDBC.setHost("localhost"); - JDBC.setDBMS("mysql"); - JDBC.setDbName("tp"); - JDBC.setLogin("root"); - JDBC.setPassword(""); - JDBC.setStrUrl(); - - SQLexecutor executor = new SQLexecutor(); - - // SELECT - ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); - for(HashMap row : result.getData()) // foreach sur les entrées - { - System.out.println("prénom: " + row.get("prenom")); //un champ d'une entrée - - for(HashMap.Entry one_field : row.entrySet()) // foreach sur les champs - { - System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); - } - } - - // INSERT - executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22); - - // UPDATE - executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan"); - - // DELETE - executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan"); - } -} diff --git a/src/dao/JDBC.java b/src/dao/JDBC.java deleted file mode 100644 index 324ff2d..0000000 --- a/src/dao/JDBC.java +++ /dev/null @@ -1,92 +0,0 @@ -package dao; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * connexion avec JDBC pour utilisation par la classe fille: SQLexecutor, - * les paramètres de connexion et les setters sont statiques - * - */ -abstract public class JDBC -{ - private static String dbms="mysql"; - private static String strClassName = "com.mysql.cj.jdbc.Driver"; - private static String port = "3306"; - private static String dbname; - private static String login; - private static String password; - private static String host= "localhost"; - private static String strUrl; - - /** - * retourne une instance de Connection avec JDBC - * @return instance de Connection - * @throws SQLException en cas d'erreur de connexion - * @throws ClassNotFoundException pour Class.forName() - */ - protected Connection getConnection() throws SQLException, ClassNotFoundException - { - Class.forName(strClassName); - return DriverManager.getConnection(strUrl, login, password); - } - - // setters - /** - * génère l'url utilisée par le driver, - * à n'exécuter que lorsque tous les paramètres ont été renseignés (en particulier dbname, login et password), - * certains: host, dbms, strClassName et port ont des valeurs par défaut pour un serveur mysql sur localhost - */ - public static void setStrUrl() { - if(dbname != null && login != null && password != null) { - JDBC.strUrl = "jdbc:" + dbms + "://" + host + ":" + port + "/" + dbname; - } - else System.out.print("il manque des paramètres nécéssaires à la connexion au driver"); - } - - public static void setHost(String host) { - JDBC.host = host; - } - public static void setDBMS(String dbms) { - JDBC.dbms = dbms; - if(dbms == "mysql") - { - JDBC.strClassName = "com.mysql.cj.jdbc.Driver"; - JDBC.port = "3306"; - } - else if(dbms == "mariadb") - { - JDBC.strClassName = "org.mariadb.jdbc.Driver"; - JDBC.port = "3306"; - } - } - public static void setDbName(String dbName) { - JDBC.dbname = dbName; - } - public static void setLogin(String login) { - JDBC.login = login; - } - public static void setPassword(String motdepasse) { - JDBC.password = motdepasse; - } - - /** - * donner tous les paramètres de connexion en une fois - * il est également possible de les donner un par un avec les setters en finissant pas JDBC.setStrUrl() - * @param host adresse du serveur - * @param dbms obtenir le nom du driver et le numéro du port à partir du nom du SGBD - * @param dbname de la base de données - * @param login nom d'utilisateur - * @param password mot de passe - */ - public static void setInfos(String host, String dbms, String dbname, String login, String password) - { - JDBC.dbname = dbname; - JDBC.login = login; - JDBC.password = password; - JDBC.host = host; - setDBMS(dbms); - JDBC.setStrUrl(); - } -} diff --git a/src/dao/ResultObject.java b/src/dao/ResultObject.java deleted file mode 100644 index 1df9d88..0000000 --- a/src/dao/ResultObject.java +++ /dev/null @@ -1,46 +0,0 @@ -package dao; - -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; - -/** - * conteneur pour ResultSet dans le cas d'un SELECT, - * les valeurs des HashMap sont des "Object" pour gérer tous les types de données - */ -public class ResultObject -{ - private final ArrayList> data = new ArrayList<>(); - - /** - * copie du ResultSet dans une ArrayList composée d'HashMap - * @param rs instance de ResultSet - * @throws SQLException en cas d'erreur avec le ResultSet - */ - public ResultObject(ResultSet rs) throws SQLException - { - ResultSetMetaData metaData = rs.getMetaData(); - int columnCount = metaData.getColumnCount(); - - while(rs.next()) - { - HashMap row = new HashMap<>(); - for (int i = 1; i <= columnCount; i++) - { - row.put(metaData.getColumnName(i), rs.getObject(i)); - } - data.add(row); - } - } - - /** - * à utiliser dans la boucle permettant de parcourir la liste - * @return retourne la liste encapsulée - */ - public ArrayList> getData() - { - return data; - } -} diff --git a/src/dao/SQLexecutor.java b/src/dao/SQLexecutor.java deleted file mode 100644 index 430c1c0..0000000 --- a/src/dao/SQLexecutor.java +++ /dev/null @@ -1,78 +0,0 @@ -package dao; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * 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 -{ - // constructeur par défaut - - /** - * 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 - * @return ResultSet si la requête est un SELECT, null sinon - * @throws SQLException en cas d'erreur SQL - * @throws ClassNotFoundException pour DriverManager.getConnection - */ - public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException - { - Connection connection = null; - PreparedStatement statement = null; - ResultSet resultSet = null; - - try { - connection = getConnection(); - boolean isSelect = sql.trim().toLowerCase().startsWith("select"); - - statement = connection.prepareStatement(sql); - if (params.length > 0) - { -// if(isSelect) -// => ResultSet.TYPE_SCROLL_INSENSITIVE; -// navigation possible dans le ResultSet: next(), previous(), absolute(); -// ResultSet non modifiable en cas d'accès concurrent en mémoire -// => PreparedStatement.NO_GENERATED_KEYS; -// optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS) -// statement = connection.prepareStatement(sql, isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); - - this.setParameters(statement, params); - } - - if(isSelect) { - resultSet = statement.executeQuery(); - ResultObject result = new ResultObject(resultSet); - resultSet.close(); - return result; - } - else { - statement.executeUpdate(); - return null; - } - } - finally { - statement.close(); - connection.close(); - } - } - - /** - * 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]); - } - } -} diff --git a/src/modele/DAO_Test.java b/src/modele/DAO_Test.java new file mode 100644 index 0000000..bf38d97 --- /dev/null +++ b/src/modele/DAO_Test.java @@ -0,0 +1,54 @@ +/* pour tester les classes, fichier à supprimer */ + +package modele; + +import java.sql.SQLException; +import java.util.HashMap; + +import modele.dao.JDBC; +import modele.dao.ResultObject; +import modele.dao.SQLexecutor; + +/* + * fonction main pour tester des commandes + */ +public class DAO_Test +{ + public static void main(String[] args) throws SQLException, ClassNotFoundException + { + // envoie de tous les paramètres en même temps + JDBC.setInfos("localhost", "mysql", "tp", "root", ""); + + // même chose avec envoie un par un + // si un paramètre doit être modifié à la volée, faire un JDBC.setStrUlr(); après + JDBC.setHost("localhost"); + JDBC.setDBMS("mysql"); + JDBC.setDbName("tp"); + JDBC.setLogin("root"); + JDBC.setPassword(""); + JDBC.setStrUrl(); + + SQLexecutor executor = new SQLexecutor(); + + // SELECT + ResultObject result = executor.executeQuery("SELECT * FROM acces WHERE id = ?", 1); + for(HashMap row : result.getData()) // foreach sur les entrées + { + System.out.println("prénom: " + row.get("prenom")); //un champ d'une entrée + + for(HashMap.Entry one_field : row.entrySet()) // foreach sur les champs + { + System.out.print(one_field.getKey() + ": " + one_field.getValue() + "\n"); + } + } + + // INSERT + executor.executeQuery("INSERT INTO acces (prenom, login, password, statut, age) VALUES (?, ?, ?, ?, ?)", "Dylan", "Toto", "Titi", "Etudiant", 22); + + // UPDATE + executor.executeQuery("UPDATE acces SET statut = ? WHERE prenom = ?", "joue à fortnite", "Dylan"); + + // DELETE + executor.executeQuery("DELETE FROM acces WHERE prenom = ?", "Dylan"); + } +} diff --git a/src/modele/dao/JDBC.java b/src/modele/dao/JDBC.java new file mode 100644 index 0000000..3e05865 --- /dev/null +++ b/src/modele/dao/JDBC.java @@ -0,0 +1,92 @@ +package modele.dao; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +/** + * connexion avec JDBC pour utilisation par la classe fille: SQLexecutor, + * les paramètres de connexion et les setters sont statiques + * + */ +abstract public class JDBC +{ + private static String dbms="mysql"; + private static String strClassName = "com.mysql.cj.jdbc.Driver"; + private static String port = "3306"; + private static String dbname; + private static String login; + private static String password; + private static String host= "localhost"; + private static String strUrl; + + /** + * retourne une instance de Connection avec JDBC + * @return instance de Connection + * @throws SQLException en cas d'erreur de connexion + * @throws ClassNotFoundException pour Class.forName() + */ + protected Connection getConnection() throws SQLException, ClassNotFoundException + { + Class.forName(strClassName); + return DriverManager.getConnection(strUrl, login, password); + } + + // setters + /** + * génère l'url utilisée par le driver, + * à n'exécuter que lorsque tous les paramètres ont été renseignés (en particulier dbname, login et password), + * certains: host, dbms, strClassName et port ont des valeurs par défaut pour un serveur mysql sur localhost + */ + public static void setStrUrl() { + if(dbname != null && login != null && password != null) { + JDBC.strUrl = "jdbc:" + dbms + "://" + host + ":" + port + "/" + dbname; + } + else System.out.print("il manque des paramètres nécéssaires à la connexion au driver"); + } + + public static void setHost(String host) { + JDBC.host = host; + } + public static void setDBMS(String dbms) { + JDBC.dbms = dbms; + if(dbms == "mysql") + { + JDBC.strClassName = "com.mysql.cj.jdbc.Driver"; + JDBC.port = "3306"; + } + else if(dbms == "mariadb") + { + JDBC.strClassName = "org.mariadb.jdbc.Driver"; + JDBC.port = "3306"; + } + } + public static void setDbName(String dbName) { + JDBC.dbname = dbName; + } + public static void setLogin(String login) { + JDBC.login = login; + } + public static void setPassword(String motdepasse) { + JDBC.password = motdepasse; + } + + /** + * donner tous les paramètres de connexion en une fois + * il est également possible de les donner un par un avec les setters en finissant pas JDBC.setStrUrl() + * @param host adresse du serveur + * @param dbms obtenir le nom du driver et le numéro du port à partir du nom du SGBD + * @param dbname de la base de données + * @param login nom d'utilisateur + * @param password mot de passe + */ + public static void setInfos(String host, String dbms, String dbname, String login, String password) + { + JDBC.dbname = dbname; + JDBC.login = login; + JDBC.password = password; + JDBC.host = host; + setDBMS(dbms); + JDBC.setStrUrl(); + } +} diff --git a/src/modele/dao/ResultObject.java b/src/modele/dao/ResultObject.java new file mode 100644 index 0000000..7f91824 --- /dev/null +++ b/src/modele/dao/ResultObject.java @@ -0,0 +1,46 @@ +package modele.dao; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * conteneur pour ResultSet dans le cas d'un SELECT, + * les valeurs des HashMap sont des "Object" pour gérer tous les types de données + */ +public class ResultObject +{ + private final ArrayList> data = new ArrayList<>(); + + /** + * copie du ResultSet dans une ArrayList composée d'HashMap + * @param rs instance de ResultSet + * @throws SQLException en cas d'erreur avec le ResultSet + */ + public ResultObject(ResultSet rs) throws SQLException + { + ResultSetMetaData metaData = rs.getMetaData(); + int columnCount = metaData.getColumnCount(); + + while(rs.next()) + { + HashMap row = new HashMap<>(); + for (int i = 1; i <= columnCount; i++) + { + row.put(metaData.getColumnName(i), rs.getObject(i)); + } + data.add(row); + } + } + + /** + * à utiliser dans la boucle permettant de parcourir la liste + * @return retourne la liste encapsulée + */ + public ArrayList> getData() + { + return data; + } +} diff --git a/src/modele/dao/SQLexecutor.java b/src/modele/dao/SQLexecutor.java new file mode 100644 index 0000000..484f52e --- /dev/null +++ b/src/modele/dao/SQLexecutor.java @@ -0,0 +1,78 @@ +package modele.dao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * 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 +{ + // constructeur par défaut + + /** + * 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 + * @return ResultSet si la requête est un SELECT, null sinon + * @throws SQLException en cas d'erreur SQL + * @throws ClassNotFoundException pour DriverManager.getConnection + */ + public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException + { + Connection connection = null; + PreparedStatement statement = null; + ResultSet resultSet = null; + + try { + connection = getConnection(); + boolean isSelect = sql.trim().toLowerCase().startsWith("select"); + + statement = connection.prepareStatement(sql); + if (params.length > 0) + { +// if(isSelect) +// => ResultSet.TYPE_SCROLL_INSENSITIVE; +// navigation possible dans le ResultSet: next(), previous(), absolute(); +// ResultSet non modifiable en cas d'accès concurrent en mémoire +// => PreparedStatement.NO_GENERATED_KEYS; +// optimisation en ne retournant pas les clé générés lors d'un INSERT (RETURN_GENERATED_KEYS) +// statement = connection.prepareStatement(sql, isSelect ? ResultSet.TYPE_SCROLL_INSENSITIVE : PreparedStatement.NO_GENERATED_KEYS); + + this.setParameters(statement, params); + } + + if(isSelect) { + resultSet = statement.executeQuery(); + ResultObject result = new ResultObject(resultSet); + resultSet.close(); + return result; + } + else { + statement.executeUpdate(); + return null; + } + } + finally { + statement.close(); + connection.close(); + } + } + + /** + * 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]); + } + } +} -- cgit v1.2.3