summaryrefslogtreecommitdiff
path: root/src/modele/dao
diff options
context:
space:
mode:
Diffstat (limited to 'src/modele/dao')
-rw-r--r--src/modele/dao/JDBC.java92
-rw-r--r--src/modele/dao/ResultObject.java46
-rw-r--r--src/modele/dao/SQLexecutor.java78
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 @@
1package modele.dao;
2
3import java.sql.Connection;
4import java.sql.DriverManager;
5import 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 */
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 /**
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 @@
1package modele.dao;
2
3import java.sql.ResultSet;
4import java.sql.ResultSetMetaData;
5import java.sql.SQLException;
6import java.util.ArrayList;
7import 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 */
13public 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 @@
1package modele.dao;
2
3import java.sql.Connection;
4import java.sql.PreparedStatement;
5import java.sql.ResultSet;
6import 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 */
13public 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}