Objets jdbc

Description

L'objet Database encapsule l'ensemble des objets nécessaires à la connexion à une base de données, et dispose de méthodes simples pour l'exécution de requêtes et l'accès aux métadonnées.

L'objet DataSet (renvoyé par la méthode executeQuery de Database) encapsule un objet ResultSet et renvoie les données sous forme d'un tableau de valeurs. Il contient également des méthodes permettant d'accéder aux métadonnées du ResultSet.

Source / Exemple :


//Classe Database

import java.sql.*;
import java.io.*;
import java.util.*;
import javax.swing.JOptionPane;

public class Database {
  private
    Connection cnt;
    DataSet results;
    ResultSetMetaData rsmd;
    DatabaseMetaData dma;
    String[] types;
    String productName;
    String productVersion;

  public Database(String driver) {
    try{
      types = new String[1];
      types[0] = "TABLE";
      Class.forName(driver);
    }
    catch (Exception ex){
      JOptionPane.showMessageDialog(null, "Erreur lors du chargement du driver :"+ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public void open(String url, String username, String password) {
    try{
      cnt = DriverManager.getConnection(url, username, password);
      dma = cnt.getMetaData();
      productName = dma.getDatabaseProductName();
      productVersion = dma.getDatabaseProductVersion();
      results = new DataSet(dma.getCatalogs());
      String s[] = null;
      while(results.hasMoreElements()) {
        s = results.nextElement();
      }
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, "Echec d'ouverture :"+ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public void close(){
    try{
      cnt.close();
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, "Echec lors de la fermeture :"+ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public String[] getTableNames() {
    String[] tbnames = null;
    Vector tname = new Vector();

    try{
      results = new DataSet(dma.getTables(null, null, "%", types));
      while (results.hasMoreElements())
        tname.addElement(results.getColumnValue("TABLE_NAME"));
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    tbnames = new String[tname.size()];
    for(int i=0;i<tname.size();i++)
      tbnames[i] = (String)tname.elementAt(i);
    return tbnames;
  }

  public String[] getTableMetaData() {
    results = null;

    try{
      results = new DataSet(dma.getTables(null, null, "%", types));
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return results.getMetaData();
  }

  public String[] getColumnMetaData(String tablename) {
    results = null;

    try{
      results = new DataSet(dma.getColumns(null, null, tablename, null));
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return results.getMetaData();
  }

  public String[] getColumnNames(String table) {
    String[] tbnames = null;
    Vector tname = new Vector();

    try{
      results = new DataSet(dma.getTables(null, null, table, null));
      while (results.hasMoreElements())
        tname.addElement(results.getColumnValue("COLUMN_NAME"));
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    tbnames = new String[tname.size()];
    for(int i=0;i<tname.size();i++)
      tbnames[i] = (String)tname.elementAt(i);
    return tbnames;
  }

  public void getColumnValue(String table, String columnName) {
    try{
      if (table.length()>0)
        results = executeQuery("Select "+columnName+" from "+table+" order by "+columnName);
    }
    catch (Exception ex){
      JOptionPane.showMessageDialog(null, "Erreur sur la valeur de la colonne "+columnName+ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public String getNextValue(String columnName) {
    String res = "";
    try{
      if (results.hasMoreElements())
        res = results.getColumnValue(columnName);
    }
    catch (Exception ex){
      JOptionPane.showMessageDialog(null, "Erreur sur la valeur suivante "+columnName+ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return res;
  }

  public DataSet executeQuery(String sql){
    results = null;
    try{
      Statement stmt = cnt.createStatement();
      results = new DataSet(stmt.executeQuery(sql));
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return results;
  }

  public void executeUpdate(String sql){
    try{
      Statement stmt = cnt.createStatement();
      stmt.executeUpdate(sql);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public String getProductName(){
    return productName;
  }

  public String getProductVersion(){
    return productVersion;
  }
}

//Classe DataSet

import java.sql.*;
import javax.swing.JOptionPane;

public class DataSet {
  ResultSet results;
  ResultSetMetaData rsmd;
  int columnCount;
  String[] columnNames;

  public DataSet(ResultSet results){
    try {
      this.results = results;
      rsmd = results.getMetaData();
      columnCount = rsmd.getColumnCount();
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
  }

  public boolean hasMoreElements() {
    try{
      return results.next();
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return false;
    }
  }

  public String[] getMetaData() {
    String[] s;
    s = new String[columnCount+1];
    try{
      results.next();
      for (int i=1; i<=columnCount; i++){
        s[i] = results.getString(i);
      }
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return s;
  }

  public String[] nextElement() {
    String[] line;
    line = new String[columnCount+1];
    try{
      for (int i = 1; i <= columnCount; i++){
        line[i] = results.getString(i);
      }
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
    }
    return line;
  }

  public String getColumnValue(String columnName) {
    try{
      return results.getString(columnName);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }

  public int getColumnCount(){
    return columnCount;
  }

  public String getColumnName(int i) {
    try{
      return rsmd.getColumnName(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }

  public String getColumnLabel(int i) throws SQLException {
    try{
      return rsmd.getColumnLabel(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }

  public int getColumnDisplaySize(int i) throws SQLException {
    try{
      return rsmd.getColumnDisplaySize(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return 0;
    }
  }

  public int getColumnType(int i) throws SQLException{
    try{
      return rsmd.getColumnType(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return 0;
    }
  }

  public String getColumnTypeName(int i) throws SQLException{
    try{
      return rsmd.getColumnTypeName(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }

  public String getCatalogName(int i) throws SQLException{
    try{
      return rsmd.getCatalogName(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }

  public boolean isAutoIncrement(int i) throws SQLException{
    try{
      return rsmd.isAutoIncrement(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return false;
    }
  }

  public String getSchemaName(int i) throws SQLException{
    try{
      return rsmd.getSchemaName(i);
    }
    catch (SQLException ex){
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Exception SQL", JOptionPane.ERROR_MESSAGE);
      return "";
    }
  }
}

Conclusion :


Je me suis inspiré d'un code proposé sur le site www.commentcamarche.net que j'ai corrigé, complété et amélioré.

Je n'ai pas encore beaucoup testé ce code mais tout a l'air de fonctionner, à l'exception des méthodes qui renvoient les métadonnées, qui ne sont pas au point...

Exemple d'utilisation :

Database database = new Database("sun.jdbc.odbc.JdbcOdbcDriver");
database.open("jdbc:odbc:customers","","");
System.out.println(database.getProductName()+" "+database.getProductVersion());

DataSet data = database.executeQuery("select * from t_Customer");

database.getColumnMetaData("t_Customer");

String[] line = null;
int i = 0 ;

if (data.hasMoreElements()) {
i++ ;
line = data.nextElement();
System.out.println(line[i]);
}

database.close();

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_Mandrake)