523 lines
13 KiB
Java
523 lines
13 KiB
Java
![]() |
package com.gestionnaires;
|
|||
|
|
|||
|
/*
|
|||
|
* Remarque : Type de caract<EFBFBD>res utilis<EFBFBD>s dans ce fichier : UTF-8
|
|||
|
*/
|
|||
|
|
|||
|
//JDBC
|
|||
|
import java.sql.*;
|
|||
|
import java.util.Vector;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* Op<EFBFBD>rations possibles avec GestionConnexion.
|
|||
|
* @author 3fvorillion
|
|||
|
*/
|
|||
|
enum OperationBDD
|
|||
|
{
|
|||
|
/**
|
|||
|
* opération de sélection .
|
|||
|
*/
|
|||
|
OP_BDD_SELECTION,
|
|||
|
/**
|
|||
|
* opération de création de table.
|
|||
|
*/
|
|||
|
OP_BDD_CREER_TABLE,
|
|||
|
/**
|
|||
|
* opération de suppression de table.
|
|||
|
*/
|
|||
|
OP_BDD_SUPPR_TABLE
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gestionnaire d'une connexion à une base de données.
|
|||
|
* @author 3fvorillion
|
|||
|
*/
|
|||
|
public class GestionConnexion
|
|||
|
{
|
|||
|
/*
|
|||
|
* VARIABLES
|
|||
|
*/
|
|||
|
// param<61>tres
|
|||
|
private ParametresConnexion paramsConn;
|
|||
|
|
|||
|
// connexion
|
|||
|
private Connection connection = null;
|
|||
|
private Statement statement = null;
|
|||
|
|
|||
|
// requ<71>te SQL
|
|||
|
private String requeteSQL = "";
|
|||
|
private ResultSet resultSet = null;
|
|||
|
|
|||
|
// erreurs - anomalies
|
|||
|
private Vector<String> vs_erreurs = null;
|
|||
|
private Vector<String> vs_anomalies = null;
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* CONSTRUCTEUR
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Constructeur par défaut.<br>
|
|||
|
* Instancie le gestionnaire d'une connexion à une base de données.
|
|||
|
* @exception ClassNotFoundException La classe n'a pas été trouvée
|
|||
|
*/
|
|||
|
public GestionConnexion()
|
|||
|
throws ClassNotFoundException, Exception
|
|||
|
{
|
|||
|
/*
|
|||
|
* Init les autres variables
|
|||
|
*/
|
|||
|
this.statement = null;
|
|||
|
this.resultSet = null;
|
|||
|
this.requeteSQL = "";
|
|||
|
|
|||
|
this.paramsConn = new ParametresConnexion();
|
|||
|
|
|||
|
//init la gestion des erreurs - anomalies
|
|||
|
this.vs_erreurs = new Vector<String>();
|
|||
|
this.vs_anomalies = new Vector<String>();
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// R<>cup<75>ration du driver
|
|||
|
Class.forName(ParametresConnexion.CLASSE).newInstance();
|
|||
|
}
|
|||
|
catch (ClassNotFoundException ex)
|
|||
|
{
|
|||
|
//remonte l'exception
|
|||
|
throw new ClassNotFoundException("La classe '"+ParametresConnexion.CLASSE+"' n'a pas <20>t<EFBFBD> trouv<75>e.");
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
//remonte l'exception
|
|||
|
throw ex;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
* METHODES D'INSTANCES
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Ouvre une connexion avec les paramètres spécifiés.
|
|||
|
* @param params Objet contenant les paramètres à appliquer pour la connexion.
|
|||
|
*/
|
|||
|
public void ouvrir(ParametresConnexion params)
|
|||
|
{
|
|||
|
//V<>rifie le param<61>tre
|
|||
|
if (params == null)
|
|||
|
throw new NullPointerException();
|
|||
|
|
|||
|
//Copie les param<61>tres
|
|||
|
this.paramsConn.CopierDepuis(params);
|
|||
|
|
|||
|
//Appelle la m<>thode sans param<61>tres
|
|||
|
this.ouvrir();
|
|||
|
}
|
|||
|
/**
|
|||
|
* Ouvre une connexion avec les paramètres déjà chargés.<br>
|
|||
|
* Note : si aucun paramètre n'a été chargé, utilise les paramètres de connexion par défaut (cf classe ParametresConnexion).
|
|||
|
*/
|
|||
|
public void ouvrir()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// ferme la conexion pr<70>c<EFBFBD>dente
|
|||
|
this.fermerConnexion();
|
|||
|
|
|||
|
// init la nouvelle connexion
|
|||
|
this.connection = DriverManager.getConnection(this.paramsConn.Url,
|
|||
|
this.paramsConn.Utilisateur, this.paramsConn.Pwd);
|
|||
|
|
|||
|
this.traiterWarning(this.connection.getWarnings());
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
|
|||
|
this.fermerConnexion();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Donne l'état de la connexion en cours.
|
|||
|
* @return true si la connexion est ouverte; false si fermée.
|
|||
|
*/
|
|||
|
public boolean estOuverte()
|
|||
|
{
|
|||
|
boolean bOuverte = false;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
if (this.connection != null)
|
|||
|
bOuverte = !this.connection.isClosed();
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
|
|||
|
return bOuverte;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Ferme les ressources utilisées par la requête:<br>
|
|||
|
* - ferme le ResultSet et le Statement;<br>
|
|||
|
* - vide le contenu de la requête.
|
|||
|
*/
|
|||
|
public void fermerRessourcesRequete()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// Ferme le resultSet
|
|||
|
if (this.resultSet != null)
|
|||
|
{
|
|||
|
this.resultSet.close();
|
|||
|
this.resultSet = null;
|
|||
|
}
|
|||
|
|
|||
|
// Ferme le statement
|
|||
|
if (this.statement != null)
|
|||
|
{
|
|||
|
this.statement.close();
|
|||
|
this.statement = null;
|
|||
|
}
|
|||
|
|
|||
|
// Vide la requ<71>te
|
|||
|
this.requeteSQL = "";
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Ferme la connexion et libère les autres ressources qui ont pu être utilisées.
|
|||
|
*/
|
|||
|
public void fermerConnexion()
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// Ferme le statement
|
|||
|
this.fermerRessourcesRequete();
|
|||
|
|
|||
|
// Ferme la connexion
|
|||
|
if (this.connection != null)
|
|||
|
{
|
|||
|
this.connection.close();
|
|||
|
this.connection = null;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Lance la requête SQL de sélection spécifiée.
|
|||
|
* @param query Requête SQL de type SELECT à exécuter.
|
|||
|
* @return true si la requête a réussie; false sinon.
|
|||
|
*/
|
|||
|
public boolean lancerRequeteSelection(String query)
|
|||
|
{
|
|||
|
boolean res = true;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// verifie la connexion
|
|||
|
if (this.connection != null)
|
|||
|
{
|
|||
|
// lib<69>re les ressources de la pr<70>c<EFBFBD>dente requ<71>te
|
|||
|
this.fermerRessourcesRequete();
|
|||
|
|
|||
|
// prepare la requete
|
|||
|
this.statement = this.connection.createStatement();
|
|||
|
this.traiterWarning(this.statement.getWarnings());
|
|||
|
|
|||
|
// emet la requete
|
|||
|
this.resultSet = this.statement.executeQuery(query);
|
|||
|
this.traiterWarning(this.resultSet.getWarnings());
|
|||
|
|
|||
|
// si on est arriv<69> jusqu'ici, c'est qu'il n'y a pas eu de lev<65>e d'exception
|
|||
|
// =>actualise la requ<71>te
|
|||
|
this.requeteSQL = query;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
|
|||
|
// lib<69>re les ressources utilis<69>es
|
|||
|
this.fermerRessourcesRequete();
|
|||
|
|
|||
|
//annonce l'<27>chec de la requ<71>te SQL
|
|||
|
res = false;
|
|||
|
}
|
|||
|
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Lance la requête SQL spécifiée qui modifie la base de donnée.
|
|||
|
* @param query Requête SQL de type DELETE, UPDATE, INSERT à exécuter.
|
|||
|
* @return nombre de lignes modifiées pour requête DDL;<br>
|
|||
|
* 0 pour requête ne donnant aucun r<EFBFBD>eacute;sultat;<br>
|
|||
|
* -1 si une erreur est survenue lors de l'ex<EFBFBD>cution de la requ<EFBFBD>te;
|
|||
|
*/
|
|||
|
public int lancerRequeteModifBDD(String query)
|
|||
|
{
|
|||
|
int res = 0;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// verifie la connexion
|
|||
|
if (this.connection != null)
|
|||
|
{
|
|||
|
// lib<69>re les ressources de la pr<70>c<EFBFBD>dente requ<71>te
|
|||
|
this.fermerRessourcesRequete();
|
|||
|
|
|||
|
// prepare la requete
|
|||
|
this.statement = this.connection.createStatement();
|
|||
|
|
|||
|
// emet la requete
|
|||
|
res = this.statement.executeUpdate(query);
|
|||
|
this.traiterWarning(this.statement.getWarnings());
|
|||
|
|
|||
|
// si on est arriv<69> jusqu'ici, c'est qu'il n'y a pas eu de lev<65>e d'exception
|
|||
|
// =>actualise la requ<71>te
|
|||
|
this.requeteSQL = query;
|
|||
|
}
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
this.traiterSQLException(ex);
|
|||
|
|
|||
|
// lib<69>re les ressources utilis<69>es
|
|||
|
this.fermerRessourcesRequete();
|
|||
|
|
|||
|
//annonce l'<27>chec de la requ<71>te SQL
|
|||
|
res = -1;
|
|||
|
}
|
|||
|
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Retourne une copie de l'objet contenant les paramètres de la connexion courante.
|
|||
|
* @return Copie de l'objet contenant les paramètres de connexion.
|
|||
|
*/
|
|||
|
public ParametresConnexion getParametresConnexion()
|
|||
|
{
|
|||
|
//Retourne une copie de l'objet contenant les param<61>tres de connexion
|
|||
|
return new ParametresConnexion(this.paramsConn);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Retourne la requête SQL qui a été lancée avec succès.
|
|||
|
* @return Requête SQL qui a été exécutée.<br>Si pas de résultats disponibles, renvoie une cha<EFBFBD>ne vide.
|
|||
|
*/
|
|||
|
public String getRequeteSQL()
|
|||
|
{
|
|||
|
return this.requeteSQL;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Donne les infos sur la connexion courante.
|
|||
|
* @return Liste des infos de la connexion en cours.
|
|||
|
*/
|
|||
|
public Vector<String> getInfosConnexion()
|
|||
|
{
|
|||
|
Vector<String> vs_infosConn = new Vector<String>();
|
|||
|
DatabaseMetaData dmd;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// V<>rifie que la connexion soit ouverte
|
|||
|
if (this.estOuverte())
|
|||
|
{
|
|||
|
// Etat de la connexion
|
|||
|
vs_infosConn.add("Etat de la connexion : ouverte");
|
|||
|
vs_infosConn.add("------------------------------");
|
|||
|
|
|||
|
// Obtient les meta-datas de la base
|
|||
|
dmd = this.connection.getMetaData();
|
|||
|
|
|||
|
vs_infosConn.add("Connexion : " + dmd.getURL());
|
|||
|
vs_infosConn.add("Driver : " + dmd.getDriverName());
|
|||
|
vs_infosConn.add("Version : " + dmd.getDriverVersion());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Etat de la connexion
|
|||
|
vs_infosConn.add("Etat de la connexion : ferm<72>e");
|
|||
|
vs_infosConn.add("------------------------------");
|
|||
|
|
|||
|
vs_infosConn.add("Connexion : " + this.paramsConn.Url);//contient le Serveur, le Port et la Base
|
|||
|
vs_infosConn.add("Utilisateur : " + this.paramsConn.Utilisateur);
|
|||
|
vs_infosConn.add("Mot de passe : " + this.paramsConn.Pwd.length() + " caract<63>re(s)");
|
|||
|
}
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
// Erreur lors de l'obtention du nom des colonnes
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
|
|||
|
return vs_infosConn;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Récupère la liste des noms des colonnes issues du résultat de la requête SQL précédemment lancée.
|
|||
|
* @return Liste des noms des colonnes issues du résultat de la requête SQL.
|
|||
|
*/
|
|||
|
public Vector<String> getNomsColonnes()
|
|||
|
{
|
|||
|
Vector<String> vs_cols = new Vector<String>();
|
|||
|
ResultSetMetaData rsmd;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// V<>rifie si la requ<71>te a d<>jà <20>t<EFBFBD> lanc<6E>e
|
|||
|
if (this.resultSet != null)
|
|||
|
{
|
|||
|
rsmd = this.resultSet.getMetaData(); // obtient les meta-datas de la requ<71>te
|
|||
|
int nbrCols = rsmd.getColumnCount();
|
|||
|
|
|||
|
for (int idCol = 1; idCol <= nbrCols; idCol++)
|
|||
|
if (rsmd.isSearchable(idCol))
|
|||
|
vs_cols.add(rsmd.getColumnName(idCol));
|
|||
|
}
|
|||
|
else if (this.statement == null)
|
|||
|
// anomalie
|
|||
|
this.vs_anomalies.add("Vous n'avez pas encore lanc<6E> la requ<71>te!!");
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
// Erreur lors de l'obtention du nom des colonnes
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
|
|||
|
return vs_cols;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Récupère le résultat de la requête SQL précédemment lancée dans un tableau d'objets.<br>
|
|||
|
* Note : Ce tableau est composé d'une liste de lignes.<br>Ces lignes sont elles-mêmes composées d'une liste d'objets.
|
|||
|
* @return Tableau d'objets correspondant au résultat de la requête SQL.
|
|||
|
*/
|
|||
|
public Vector<Vector<Object>> getDataVector()
|
|||
|
{
|
|||
|
Vector<Vector<Object>> v_datas = new Vector<Vector<Object>>();
|
|||
|
ResultSetMetaData rsmd;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
rsmd = this.resultSet.getMetaData();
|
|||
|
// V<>rifie qu'il y ai un r<>sultat et place le curseur au d<>but
|
|||
|
if (rsmd.getColumnCount() > 0)
|
|||
|
{
|
|||
|
while (this.resultSet.next())
|
|||
|
{
|
|||
|
Vector<Object> vo_ligne = new Vector<Object>();
|
|||
|
// cr<63><72> la ligne
|
|||
|
for (int idCol = 1; idCol <= rsmd.getColumnCount(); idCol++)
|
|||
|
vo_ligne.add(this.resultSet.getObject(idCol));
|
|||
|
// ajoute la ligne au vecteur principal
|
|||
|
v_datas.add(vo_ligne);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (v_datas.isEmpty()) // anomalie
|
|||
|
this.vs_anomalies.add("Aucune donn<6E>e trouv<75>e!!");
|
|||
|
}
|
|||
|
catch (SQLException ex)
|
|||
|
{
|
|||
|
// Probleme lors de l'obtention des donnees
|
|||
|
this.traiterSQLException(ex);
|
|||
|
}
|
|||
|
|
|||
|
return v_datas;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* GESTION DES ERREURS - ANOMALIES
|
|||
|
*/
|
|||
|
/**
|
|||
|
* Trace les erreurs SQL qui ont été levées par une exception donnée.
|
|||
|
* @param ex SQLException à tracer.
|
|||
|
*/
|
|||
|
public void traiterSQLException(SQLException ex)
|
|||
|
{
|
|||
|
String str_ex;
|
|||
|
|
|||
|
str_ex = "********* SQLException *********\n";
|
|||
|
while (ex != null)
|
|||
|
{
|
|||
|
str_ex = "SQLState : " + ex.getSQLState() + "\n";
|
|||
|
str_ex += "Message : " + ex.getMessage() + "\n";
|
|||
|
str_ex += "------------------------------\n";
|
|||
|
this.vs_erreurs.add(str_ex);
|
|||
|
|
|||
|
ex = ex.getNextException();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Trace les anomalies SQL données.
|
|||
|
* @param warn Anomalies SQL à tracer.
|
|||
|
*/
|
|||
|
public void traiterWarning(SQLWarning warn)
|
|||
|
{
|
|||
|
String str_an;
|
|||
|
|
|||
|
str_an = "********* SQLWarning *********\n";
|
|||
|
while (warn != null)
|
|||
|
{
|
|||
|
str_an = "SQLState : " + warn.getSQLState() + "\n";
|
|||
|
str_an += "Message : " + warn.getMessage() + "\n";
|
|||
|
str_an += "------------------------------\n";
|
|||
|
this.vs_anomalies.add(str_an);
|
|||
|
|
|||
|
warn = warn.getNextWarning();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Récupère la liste des erreurs tracées.
|
|||
|
* @return Liste des erreurs tracées.<br>Note : retourne une copie du vecteur interne pour empêcher la modification directe de celui-ci.
|
|||
|
*/
|
|||
|
public Vector<String> getErreurs()
|
|||
|
{
|
|||
|
return new Vector<String>(this.vs_erreurs);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Récupère la liste des anomalies tracées.
|
|||
|
* @return Liste des anomalies tracées.<br>Note : retourne une copie du vecteur interne pour empêcher la modification directe de celui-ci.
|
|||
|
*/
|
|||
|
public Vector<String> getAnomalies()
|
|||
|
{
|
|||
|
return new Vector<String>(this.vs_anomalies);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Efface la liste des erreurs tracées.
|
|||
|
*/
|
|||
|
public void effaceErreurs()
|
|||
|
{
|
|||
|
this.vs_erreurs.clear();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Efface la liste des anomalies tracées.
|
|||
|
*/
|
|||
|
public void effaceAnomalies()
|
|||
|
{
|
|||
|
this.vs_anomalies.clear();
|
|||
|
}
|
|||
|
}
|