SQL-Datenbank zu HTML und CSV

+ andere TechDocs
+ SQL mit Java
+ SQL
+


Dieses Programmierbeispiel liest über konfigurierbare SQL-Kommandos Datenbankinhalte und gibt den Inhalt auf der Konsole aus, erzeugt eine HTML-Datei und eine in Excel ladbare CSV-Datei (Comma Separated Values).



Programmierbeispiel: SQL-Datenbank zu HTML und CSV

  1. Beachten Sie die grundsätzlichen Hinweise zu SQL, SQL-Kommandos und SQL mit Java.
  2. Downloaden Sie ein aktuelles Java SE JDK von http://java.sun.com/javase und installieren Sie es wie beschrieben unter java-install.htm.
  3. Legen Sie eine Projektverzeichnisstruktur an, zum Beispiel so:

    [\MeinWorkspace]
      '- [DbZuCsvOderHtml]
           |- [bin]
           |- [lib]
           |    '- mysql-connector-java-5.1.11-bin.jar
           |- [src]
           |    '- [db2csv2html]
           |         '- DbZuCsvOderHtml.java
           '- DbZuCsvOderHtml.properties
    
  4. Das Beispiel benötigt eine Datenbank. Falls Sie noch keine installiert haben können Sie zum Beispiel MySQL installieren wie beschrieben unter: mysql.htm#InstallationUnterWindows.
    Weiterhin wird eine Datenbanktabelle mit Inhalt erwartet. Wählen Sie zum Beispiel als 'Database-Name' "MeineDb" ('CREATE DATABASE MeineDb;') und erstellen und füllen Sie eine Test-Datenbanktabelle (wie z.B. für 'MeineTestTabelle' gezeigt).
    Sie können das Beispiel natürlich auch an andere Datenbanken, Database-Namen und Tabellen anpassen.
    Downloaden Sie den zu Ihrer Datenbank passenden JDBC-Treiber in das 'lib'-Verzeichnis. Für MySQL z.B.: 'mysql-connector-java-5.1.11-bin.jar' aus 'mysql-connector-java-5.1.11.zip'.
  5. Erzeugen Sie im Package-Verzeichnis 'db2csv2html' folgende Java-Sourcedatei 'DbZuCsvOderHtml.java':

    package db2csv2html;
    
    import java.io.*;
    import java.sql.*;
    import java.text.*;
    import java.util.*;
    import java.util.Date;
    
    public class DbZuCsvOderHtml
    {
      private static final SimpleDateFormat YYYY_MM_DD_HH_MM_SS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
      public static void main( String[] args )
      {
        // Lies 'Key=Value'-Paare aus Property-Datei fuer Voreinstellungen:
        String propFile = "DbZuCsvOderHtml.properties";
        if( 0 < args.length && args[0].startsWith( "prop=") )
          propFile = args[0].substring( 5 );
        Properties prop = new Properties();
        try {
          prop.load( new FileInputStream( propFile ) );
        } catch( FileNotFoundException ex ) {
          System.out.println( "Fehler: Property-Datei '" +
                              propFile + "' fuer Voreinstellungen fehlt." );
        } catch( IOException ex ) {
          System.out.println( "Fehler beim Lesen der Datei '" +
                              propFile + "': " + ex.getMessage() );
        }
        // Lies 'Key=Value'-Paare aus Kommandozeilenparametern
        // (können Parameter aus obiger Property-Datei überschreiben):
        for( int i=0; i<args.length; i++ ) {
          int delim = args[i].indexOf( '=' );
          if( delim > 0 && delim <= args[i].length()-2 ) {
            prop.put( args[i].substring( 0, delim ), args[i].substring( delim+1 ) );
          }
        }
        // Pruefe die wichtigsten Properties:
        String dbDrv = (String) prop.get( "dbDrv" );
        String dbUrl = (String) prop.get( "dbUrl" );
        String dbUsr = (String) prop.get( "dbUsr" );
        String sql1  = (String) prop.get( "sql1"  );
        if( null == dbDrv )
          System.out.println( "Fehler: dbDrv muss gesetzt sein, " +
                              "z.B.: dbDrv=com.mysql.jdbc.Driver" );
        if( null == dbUrl )
          System.out.println( "Fehler: dbUrl muss gesetzt sein, " +
                              "z.B.: dbUrl=jdbc:mysql://localhost:3306/MeineDb" );
        if( null == sql1 )
          System.out.println( "Fehler: sql1 muss gesetzt sein, " +
                              "z.B.: sql1=select * from MeineTestTabelle" );
        if( null == dbDrv || null == dbUrl || null == sql1 )
          System.exit( 1 );
        System.out.println( "\npropFile: " + propFile + "\ndbDrv: " + dbDrv
                            + "\ndbUrl: " + dbUrl + "\ndbUsr: " + dbUsr );
    
        // Lies Datenbanktabelle:
        Connection        cn = null;
        PreparedStatement st = null;
        ResultSet         rs = null;
        try {
          // Datenbank-Connection:
          Class.forName( dbDrv );
          cn = DriverManager.getConnection( dbUrl, dbUsr, (String) prop.get( "dbPwd" ) );
          int idxSql = 0;
          while( true ) {
            // PrepareStatement:
            String sql = (String) prop.get( "sql" + ++idxSql );
            if( null == sql || 0 >= sql.trim().length() ) break;
            System.out.println( "\nsql" + idxSql + ": " + sql );
            st = cn.prepareStatement( sql );
            int idxParm = 0;
            while( true ) {
              String parm = (String) prop.get( "sql" + idxSql + ".parm" + ++idxParm );
              if( null == parm || 0 >= parm.trim().length() ) break;
              System.out.println( "sql" + idxSql + ".parm" + idxParm + ": " + parm );
              st.setObject( idxParm, parm );
            }
            // ResultSet zu String-Array:
            rs = st.executeQuery();
            ResultSetMetaData rsmd = rs.getMetaData();
            int i, n = rsmd.getColumnCount();
            Vector vec = new Vector();
            String[] row = new String[n];
            for( i=0; i<n; i++ )
              row[i] = rsmd.getColumnName( i+1 );
            vec.add( row );
            while( rs.next() ) {
              row = new String[n];
              for( i = 0; i<n; i++ ) {
                Object obj = rs.getObject( i+1 );
                if( null != obj && obj instanceof Date )
                  row[i] = YYYY_MM_DD_HH_MM_SS.format( (Date) obj );
                else {
                  String s = rs.getString( i+1 );
                  row[i] = ( null != s ) ? s.replace( '\n', ' ' ) : "null";
                }
              }
              vec.add( row );
            }
            String[][] ss = (String[][]) vec.toArray( new String[vec.size()][n] );
            // Ausgabe auf Konsole, als CSV-Datei oder als HTML-Datei:
            String console  = (String) prop.get( "console" );
            String csvFile  = (String) prop.get( "csvFile" );
            String htmlFile = (String) prop.get( "htmlFile" );
            if( null == console || !console.equalsIgnoreCase( "false" ) )
              ausgabeKonsole( ss, 20 );
            if( null != csvFile && 0 < csvFile.length() )
              ausgabeCsv( ss, csvFile + idxSql + ".csv" );
            if( null != htmlFile && 0 < htmlFile.length() ) {
              String htmlFileWithoutHtmlTag = (String) prop.get( "htmlFileWithoutHtmlTag" );
              ausgabeHtml( ss, htmlFile + idxSql + ".html",
                           "true".equalsIgnoreCase( htmlFileWithoutHtmlTag ) );
            }
            rs.close();
            rs = null;
            st.close();
            st = null;
          }
        } catch( Exception ex ) {
          System.out.println( "Fehler beim Lesen der Datenbank: " + ex );
          ex.printStackTrace();
        } finally {
          try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
          try { if( null != st ) st.close(); } catch( Exception ex ) {}
          try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
        }
      }
    
      // Ausgabe als CSV-Datei (Comma Separated Values, z.B. fuer Excel)
      private static final void ausgabeCsv( String[][] ss, String csvFile )
      {
        if( null == ss || 0 >= ss.length || null == ss[0] ||
            null == csvFile || 0 >= csvFile.length() ) return;
        try {
          BufferedWriter out = new BufferedWriter( new OutputStreamWriter(
              new FileOutputStream( csvFile ) ) );
          int n = ss[0].length;
          for( int j=0; j<ss.length; j++ ) {
            for( int i=0; i<n; i++ )
              out.write( ss[j][i] + ";" );
            out.newLine();
          }
          out.close();
          System.out.println( csvFile + " erzeugt." );
        } catch( Exception ex ) {
          System.out.println( "Fehler beim Erzeugen der CSV-Datei '" +
                              csvFile + "': " + ex );
        }
      }
    
      // Ausgabe als HTML-Datei
      private static final void ausgabeHtml( String[][] ss, String htmlFile,
                                             boolean htmlFileWithoutHtmlTag )
      {
        if( null == ss || 0 >= ss.length || null == ss[0] ||
            null == htmlFile || 0 >= htmlFile.length() ) return;
        try {
          BufferedWriter out = new BufferedWriter( new OutputStreamWriter(
              new FileOutputStream( htmlFile ) ) );
          int i, j, n = ss[0].length;
          if( !htmlFileWithoutHtmlTag ) out.write( "<html>\n" );
          out.write( "<table border=1 cellspacing=0 cellpadding=2>\n<tr bgcolor='#EBEEEE'>" );
          for( i=0; i<n; i++ )
            out.write( "<th>" + ss[0][i] + "</th>" );
          for( j=1; j<ss.length; j++ ) {
            out.write( "</tr>\n<tr>" );
            for( i=0; i<n; i++ )
              out.write( "<td>" + ss[j][i] + "</td>" );
          }
          out.write( "</tr>\n</table>\n" );
          if( !htmlFileWithoutHtmlTag ) out.write( "</html>\n" );
          out.close();
          System.out.println( htmlFile + " erzeugt." );
        } catch( Exception ex ) {
          System.out.println( "Fehler beim Erzeugen der HTML-Datei '" +
                              htmlFile + "': " + ex );
        }
      }
    
      // Ausgabe auf Konsole (Kommandozeilenfenster)
      private static final void ausgabeKonsole( String[][] ss, int maxZeilen )
      {
        String leerString  = "                     ";
        String minusString = "---------------------";
        if( null == ss || 0 >= ss.length || null == ss[0] ) return;
        int i, j, m = ss.length, n = ss[0].length;
        if( m > ++maxZeilen ) {
          m = maxZeilen;
          System.out.println( "Achtung: Begrenzt auf " + (m-1) + " Zeilen.\n" );
        }
        int maxLength = 0;
        for( j=0; j<m; j++ )
          for( i=0; i<n; i++ )
            if( null != ss[j][i] && maxLength < ss[j][i].length() )
              maxLength = ss[j][i].length();
        maxLength++;
        if( maxLength > leerString.length() )
            maxLength = leerString.length();
        if( maxLength > minusString.length() )
            maxLength = minusString.length();
        leerString  = leerString.substring( 0, maxLength );
        minusString = minusString.substring( 0, maxLength );
        for( i=0; i<n; i++ )
          System.out.print( "+-" + minusString );
        System.out.println( "+" );
        for( j=0; j<m; j++ ) {
          for( i=0; i<n; i++ )
            System.out.print( "| " + extendString( ss[j][i], leerString ) );
          System.out.println( "|" );
          if( 0 == j ) {
            for( i=0; i<n; i++ )
              System.out.print( "+-" + minusString );
            System.out.println( "+" );
          }
        }
        for( i=0; i<n; i++ )
          System.out.print( "+-" + minusString );
        System.out.println( "+" );
      }
    
      private static final String extendString( String s, String maxLeerString )
      {
        if( null == s )
          s = "";
        final int iWantLen = maxLeerString.length();
        final int iActLen = s.length();
        if( iActLen < iWantLen )
          return (s + maxLeerString).substring( 0, iWantLen );
        if( iActLen > 2 * iWantLen )
          return s.substring( 0, 2 * iWantLen );
        return s;
      }
    }
    
  6. Erzeugen Sie im Projektverzeichnis 'DbZuCsvOderHtml' folgende Property-Datei 'DbZuCsvOderHtml.properties':

    console=true
    csvFile=MeineCsvDatei
    htmlFile=MeineHtmlDatei
    htmlFileWithoutHtmlTag=false
    dbDrv=com.mysql.jdbc.Driver
    dbUrl=jdbc:mysql://192.168.0.100:3306/MeineDb
    dbUsr=root
    dbPwd=mysqlpwd
    sql1=select * from MeineTestTabelle
    sql2=select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1=12
    
  7. Kompilation und Ausführung können folgendermaßen im Kommandozeilenfenster aus dem Projektverzeichnis 'DbZuCsvOderHtml' heraus erfolgen:

    cd \MeinWorkspace\DbZuCsvOderHtml

    set CLASSPATH=.;src;bin;lib/mysql-connector-java-5.1.11-bin.jar

    javac -d bin src/db2csv2html/*.java

    java db2csv2html.DbZuCsvOderHtml

    dir

    type MeineCsvDatei1.csv

    type MeineHtmlDatei1.html

    start MeineCsvDatei1.csv

    start MeineCsvDatei2.csv

    start MeineHtmlDatei1.html

    start MeineHtmlDatei2.html

  8. Falls Sie eine Datenbanktabelle wie unter 'MeineTestTabelle' beschrieben eingerichtet haben, erhalten Sie vom Kommando 'java db2csv2html.DbZuCsvOderHtml' folgendes Ergebnis:

    D:\MeinWorkspace\DbZuCsvOderHtml>java db2csv2html.DbZuCsvOderHtml
    
    propFile: DbZuCsvOderHtml.properties
    dbDrv: com.mysql.jdbc.Driver
    dbUrl: jdbc:mysql://192.168.0.100:3306/MeineDb
    dbUsr: root
    
    sql1: select * from MeineTestTabelle
    +------------+------------+------------+------------+
    | i          | c          | s          | dt         |
    +------------+------------+------------+------------+
    | 11         | ABC        | Blubb      | 2000-01-01 |
    | 12         | ab         | Blabla     | 2000-12-31 |
    | 42         | xy         | õ÷³¯º?     | 2005-06-06 |
    +------------+------------+------------+------------+
    MeineCsvDatei1.csv erzeugt.
    MeineHtmlDatei1.html erzeugt.
    
    sql2: select i, c, s from MeineTestTabelle where i <= ?
    sql2.parm1: 12
    +--------+--------+--------+
    | i      | c      | s      |
    +--------+--------+--------+
    | 11     | ABC    | Blubb  |
    | 12     | ab     | Blabla |
    +--------+--------+--------+
    MeineCsvDatei2.csv erzeugt.
    MeineHtmlDatei2.html erzeugt.
    
  9. Wenn Sie das Kommando

    java db2csv2html.DbZuCsvOderHtml "sql1=select s from MeineTestTabelle where c = 'ab'" "sql2= "

    eingeben, werden Voreinstellungen der Property-Datei überschrieben und Sie erhalten:

    sql1: select s from MeineTestTabelle where c = 'ab'
    +--------+
    | s      |
    +--------+
    | Blabla |
    +--------+
    MeineCsvDatei1.csv erzeugt.
    MeineHtmlDatei1.html erzeugt.
    
  10. Wie gezeigt können Sie die Konfigurationsparameter über die Kommandozeile oder in der Property-Datei definieren. In beiden Fällen setzen Sie die Parameter über 'Key=Value'-Paare. Bei gleichen Keys setzen sich Kommandozeilenparameter durch. Die einzelnen Parameter bedeuten:

    Konfigurationsparameter
    prop Dateiname der zu verwendenen Property-Datei, (z.B. 'prop=DbZuCsvOderHtml.properties');
    Dieser Parameter macht nur auf der Kommandozeile Sinn und muss dort der erste Parameter sein;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    console true: Datenbanktabelle wird im Kommandozeilenfenster ausgegeben
    csvFile Dateiname (ohne Extension) für CSV-Datei, falls CSV-Datei erstellt werden soll;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    htmlFile Dateiname (ohne Extension) für HTML-Datei, falls HTML-Datei erstellt werden soll;
    Falls Pfade vorangestellt werden: Der Backslash '\' unter Windows muss doppelt geschrieben werden
    htmlFileWithoutHtmlTag true: In die HTML-Datei wird nur das HTML-Tabellencode-Fragment erzeugt, ohne umschließendes '<html>'-Tag
    (Fragmentdatei kann dann mit Vor- und Nachspanndatei zusammenkopiert werden)
    dbDrv JDBC-Treiberklasse, z.B. 'com.mysql.jdbc.Driver'
    dbUrl URL der SQL-Datenbank, z.B. 'jdbc:mysql://192.168.0.100:3306/MeineDb'
    dbUsr Datenbank-Benutzername
    dbPwd Datenbank-Kennwort
    sql1
    sql2
    ...
    SQL-Kommandos, können wahlweise parameterlose SQL-Kommandos sein
    (z.B. '
    select * from MeineTestTabelle'),
    oder zu parametrisierende SQL-Kommandos
    (z.B. '
    select * from MeineTestTabelle where i <= ?')
    sql_.parm1
    sql_.parm2
    ...
    Die einzelnen Parameter falls zu parametrisierendes SQL-Kommando
    (den Unterstrich '_' durch die Nummer des passenden SQL-Kommandos ersetzen)




Weitere Themen: andere TechDocs | SQL mit Java | SQL | Glossar
© 1998-2007 Torsten Horn, Aachen