diff options
| author | polo <ordipolo@gmx.fr> | 2025-02-15 15:25:40 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-02-15 15:25:40 +0100 |
| commit | 30c38f78018c160fdeb44175e4ef97f0c2868b37 (patch) | |
| tree | b785851b95bac67305212d9da076fcdb62872d26 /src/modele/dao | |
| parent | efed27a703022ecb366a301340f5fcbb8135a2fd (diff) | |
| download | JDBC-30c38f78018c160fdeb44175e4ef97f0c2868b37.tar.gz JDBC-30c38f78018c160fdeb44175e4ef97f0c2868b37.tar.bz2 JDBC-30c38f78018c160fdeb44175e4ef97f0c2868b37.zip | |
release candidate 3
Diffstat (limited to 'src/modele/dao')
| -rw-r--r-- | src/modele/dao/JDBC.java | 92 | ||||
| -rw-r--r-- | src/modele/dao/ResultObject.java | 46 | ||||
| -rw-r--r-- | src/modele/dao/SQLexecutor.java | 78 |
3 files changed, 216 insertions, 0 deletions
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 @@ | |||
| 1 | package modele.dao; | ||
| 2 | |||
| 3 | import java.sql.Connection; | ||
| 4 | import java.sql.DriverManager; | ||
| 5 | import java.sql.SQLException; | ||
| 6 | |||
| 7 | /** | ||
| 8 | * connexion avec JDBC pour utilisation par la classe fille: SQLexecutor, | ||
| 9 | * les paramètres de connexion et les setters sont statiques | ||
| 10 | * | ||
| 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 | /** | ||
| 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 | */ | ||
| 29 | protected Connection getConnection() throws SQLException, ClassNotFoundException | ||
| 30 | { | ||
| 31 | Class.forName(strClassName); | ||
| 32 | return DriverManager.getConnection(strUrl, login, password); | ||
| 33 | } | ||
| 34 | |||
| 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 | |||
| 48 | public static void setHost(String host) { | ||
| 49 | JDBC.host = host; | ||
| 50 | } | ||
| 51 | public static void setDBMS(String dbms) { | ||
| 52 | JDBC.dbms = dbms; | ||
| 53 | if(dbms == "mysql") | ||
| 54 | { | ||
| 55 | JDBC.strClassName = "com.mysql.cj.jdbc.Driver"; | ||
| 56 | JDBC.port = "3306"; | ||
| 57 | } | ||
| 58 | else if(dbms == "mariadb") | ||
| 59 | { | ||
| 60 | JDBC.strClassName = "org.mariadb.jdbc.Driver"; | ||
| 61 | JDBC.port = "3306"; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | public static void setDbName(String dbName) { | ||
| 65 | JDBC.dbname = dbName; | ||
| 66 | } | ||
| 67 | public static void setLogin(String login) { | ||
| 68 | JDBC.login = login; | ||
| 69 | } | ||
| 70 | public static void setPassword(String motdepasse) { | ||
| 71 | JDBC.password = motdepasse; | ||
| 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 | */ | ||
| 83 | public static void setInfos(String host, String dbms, String dbname, String login, String password) | ||
| 84 | { | ||
| 85 | JDBC.dbname = dbname; | ||
| 86 | JDBC.login = login; | ||
| 87 | JDBC.password = password; | ||
| 88 | JDBC.host = host; | ||
| 89 | setDBMS(dbms); | ||
| 90 | JDBC.setStrUrl(); | ||
| 91 | } | ||
| 92 | } | ||
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 @@ | |||
| 1 | package modele.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 | |||
| 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 | */ | ||
| 13 | public 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 new file mode 100644 index 0000000..484f52e --- /dev/null +++ b/src/modele/dao/SQLexecutor.java | |||
| @@ -0,0 +1,78 @@ | |||
| 1 | package modele.dao; | ||
| 2 | |||
| 3 | import java.sql.Connection; | ||
| 4 | import java.sql.PreparedStatement; | ||
| 5 | import java.sql.ResultSet; | ||
| 6 | import java.sql.SQLException; | ||
| 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 | */ | ||
| 13 | public class SQLexecutor extends JDBC | ||
| 14 | { | ||
| 15 | // constructeur par défaut | ||
| 16 | |||
| 17 | /** | ||
| 18 | * Exécute une requête SQL et retourne le résultat si applicable. | ||
| 19 | * @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 | ||
| 21 | * @return ResultSet si la requête est un SELECT, null sinon | ||
| 22 | * @throws SQLException en cas d'erreur SQL | ||
| 23 | * @throws ClassNotFoundException pour DriverManager.getConnection | ||
| 24 | */ | ||
| 25 | public ResultObject executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException | ||
| 26 | { | ||
| 27 | Connection connection = null; | ||
| 28 | PreparedStatement statement = null; | ||
| 29 | ResultSet resultSet = null; | ||
| 30 | |||
| 31 | try { | ||
| 32 | connection = getConnection(); | ||
| 33 | boolean isSelect = sql.trim().toLowerCase().startsWith("select"); | ||
| 34 | |||
| 35 | statement = connection.prepareStatement(sql); | ||
| 36 | if (params.length > 0) | ||
| 37 | { | ||
| 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); | ||
| 47 | } | ||
| 48 | |||
| 49 | if(isSelect) { | ||
| 50 | resultSet = statement.executeQuery(); | ||
| 51 | ResultObject result = new ResultObject(resultSet); | ||
| 52 | resultSet.close(); | ||
| 53 | return result; | ||
| 54 | } | ||
| 55 | else { | ||
| 56 | statement.executeUpdate(); | ||
| 57 | return null; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | finally { | ||
| 61 | statement.close(); | ||
| 62 | connection.close(); | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | /** | ||
| 67 | * Affecte les paramètres aux requêtes préparées. | ||
| 68 | * @param statement | ||
| 69 | * @param params Object... permet d'ajouter autant de paramètres qu'on veut et ça fait un tableau | ||
| 70 | * @throws SQLException en cas d'erreur SQL | ||
| 71 | */ | ||
| 72 | private void setParameters(PreparedStatement statement, Object... params) throws SQLException | ||
| 73 | { | ||
| 74 | for (int i = 0; i < params.length; i++) { | ||
| 75 | statement.setObject(i + 1, params[i]); | ||
| 76 | } | ||
| 77 | } | ||
| 78 | } | ||
