Diese Programmierbeispiele lesen über konfigurierbare SQL-Kommandos Datenbankinhalte und geben den Inhalt auf der Konsole aus, erzeugen eine HTML-Datei und eine in Excel ladbare CSV-Datei (Comma Separated Values).
Beachten Sie die grundsätzlichen Hinweise zu SQL, SQL-Kommandos und SQL mit Java.
Installieren Sie ein aktuelles Java SE JDK.
Legen Sie in Ihrem Workspace-Verzeichnis (z.B. \MeinWorkspace) eine neue Projektverzeichnisstruktur an, zum Beispiel so:
md \MeinWorkspace\DbZuCsvOderHtml
cd \MeinWorkspace\DbZuCsvOderHtml
md bin
md lib
md src\dbcsvhtml
Das Beispiel benötigt eine Datenbank.
Falls Sie noch keine installiert haben, können Sie beispielsweise
MySQL
(z.B. wie beschrieben unter:
mysql.htm#InstallationUnterWindows)
oder die Oracle Database
(z.B. wie beschrieben unter:
oraclexe-db.htm)
installieren.
Weiterhin wird eine Datenbanktabelle mit Inhalt erwartet.
Für MySQL können Sie zum Beispiel als 'Database-Name' "MeineDb" wählen
('CREATE DATABASE MeineDb;')
und eine Test-Datenbanktabelle füllen, wie z.B. für
'MeineTestTabelle' gezeigt.
Sie können das Beispiel natürlich auch für beliebige andere Datenbanken, Database-Namen und Tabellen verwenden,
indem Sie die entsprechenden Parameter in der unten gezeigten DbZuCsvOderHtml.properties konfigurieren.
Downloaden Sie den zu Ihrer Datenbank passenden JDBC-Treiber
in das lib-Verzeichnis.
Zum Beispiel für MySQL:
mysql-connector-java-5.1.16-bin.jar aus
mysql-connector-java-5.1.16.zip.
Oder zum Beispiel für die Oracle Database:
ojdbc7.jar.
Bitte beachten Sie: Dieses Beispiel ist nur geeignet, wenn die gelesenen Inhalte komplett ins RAM passen. Wenn Sie größere Datenbanktabellen lesen wollen, verwenden Sie bitte das andere weiter unten gezeigte Beispiel DbZuCsv.java.
Erzeugen Sie im src\dbcsvhtml-Verzeichnis folgende Java-Sourcedatei: DbZuCsvOderHtml.java
package dbcsvhtml; import java.io.*; import java.sql.*; import java.text.SimpleDateFormat; import java.util.*; /** * Lies Datenbanktabellen und gib sie auf der Konsole, als CSV-Datei oder als HTML-Datei aus. * Die Parametrisierung erfolgt ueber Kommandozeilenparameter oder ueber eine Properties-Datei. */ 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 ) { // Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile: Properties parms = getParms( args, "DbZuCsvOderHtml.properties" ); // Pruefe die wichtigsten Properties: String csvToHtmlFile = parms.getProperty( "csvToHtmlFile" ); String dbDrv = parms.getProperty( "dbDrv" ); String dbUrl = parms.getProperty( "dbUrl" ); String dbUsr = parms.getProperty( "dbUsr" ); String sql1 = parms.getProperty( "sql1" ); String encoding = parms.getProperty( "encoding" ); String noTrimStr = parms.getProperty( "noTrim" ); boolean noTrim = noTrimStr != null && noTrimStr.trim().length() > 0 && noTrimStr.trim().equalsIgnoreCase( "true" ); if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; } // Nicht DB lesen, sondern CSV-Datei in HTML-Datei konvertieren? if( csvToHtmlFile != null && csvToHtmlFile.length() > 0 ) { System.out.println( "\npropFile : " + parms.getProperty( "propFile" ) + "\ncsvToHtmlFile: " + csvToHtmlFile + "\nencoding : " + encoding ); try { csvToHtml( csvToHtmlFile, encoding, ";" ); } catch( IOException ex ) { System.out.println( "\nFehler beim Lesen oder Schreiben der Datei '" + csvToHtmlFile + "': " + ex.getMessage() ); } if( dbDrv == null && dbUrl == null && sql1 == null ) { return; } } // Aus DB lesen: System.out.println( "\npropFile: " + parms.getProperty( "propFile" ) + "\ndbDrv: " + dbDrv + "\ndbUrl: " + dbUrl + "\ndbUsr: " + dbUsr + "\nencoding: " + encoding ); 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 MeineTabelle" ); } if( dbDrv == null || dbUrl == null || sql1 == null ) { System.exit( 1 ); } // Lies Datenbanktabelle: Connection cn = null; PreparedStatement st = null; ResultSet rs = null; try { // Datenbank-Connection: Class.forName( dbDrv ); cn = DriverManager.getConnection( dbUrl, dbUsr, parms.getProperty( "dbPwd" ) ); int idxSql = 0; while( true ) { // SQL-Kommando und PrepareStatement: String sql = parms.getProperty( "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 = parms.getProperty( "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(); List<List<String>> tbl = new ArrayList<List<String>>(); List<String> row = new ArrayList<String>(); for( i = 0; i < n; i++ ) { String s = rsmd.getColumnName( i + 1 ); if( s != null && !noTrim ) { s = s.trim(); } row.add( s ); } tbl.add( row ); while( rs.next() ) { row = new ArrayList<String>(); for( i = 0; i < n; i++ ) { Object obj = rs.getObject( i + 1 ); if( null != obj && obj instanceof java.sql.Date ) { row.add( YYYY_MM_DD_HH_MM_SS.format( (java.sql.Date) obj ) ); } else { String s = rs.getString( i + 1 ); if( s != null && !noTrim ) { s = s.trim(); } row.add( (s != null) ? s.replace( '\n', ' ' ) : "null" ); } } tbl.add( row ); } rs.close(); rs = null; st.close(); st = null; // Ausgabe auf Konsole, als CSV-Datei oder als HTML-Datei: String console = parms.getProperty( "console" ); String csvFile = parms.getProperty( "csvFile" ); String htmlFile = parms.getProperty( "htmlFile" ); if( null == console || !console.equalsIgnoreCase( "false" ) ) { ausgabeKonsole( tbl, 20, encoding ); } if( null != csvFile && 0 < csvFile.trim().length() ) { ausgabeCsv( tbl, csvFile + idxSql + ".csv", encoding ); } if( null != htmlFile && 0 < htmlFile.trim().length() ) { String htmlFileWithoutHtmlTag = parms.getProperty( "htmlFileWithoutHtmlTag" ); ausgabeHtml( tbl, htmlFile + idxSql + ".html", encoding, "true".equalsIgnoreCase( htmlFileWithoutHtmlTag ) ); } } } catch( Exception ex ) { System.out.println( "\nFehler beim Lesen der Datenbank: " + ex ); ex.printStackTrace(); } finally { try { if( rs != null ) { rs.close(); } } catch( Exception ex ) {/* nothing to do */} try { if( st != null ) { st.close(); } } catch( Exception ex ) {/* nothing to do */} try { if( cn != null ) { cn.close(); } } catch( Exception ex ) {/* nothing to do */} } } /** Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile */ private static final Properties getParms( String[] args, String propFileDefault ) { // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen: String propFile = ( args.length > 0 && args[0].startsWith( "prop=" ) ) ? args[0].substring( 5 ) : propFileDefault; Properties parms = new Properties(); InputStream in = null; try { in = new FileInputStream( propFile ); parms.load( in ); parms.setProperty( "propFile", propFile ); } catch( FileNotFoundException ex ) { System.out.println( "\nWarnung: Keine Properties-Datei '" + propFile + "' fuer Voreinstellungen gefunden." ); } catch( IOException ex ) { System.out.println( "\nFehler beim Lesen der Datei '" + propFile + "': " + ex.getMessage() ); } finally { try { if( in != null ) { in.close(); } } catch( IOException e ) {/* nothing to do */} } // Lies 'Key=Value'-Paare aus Kommandozeilenparametern // (koennen Parameter aus obiger Properties-Datei ueberschreiben): for( int i = 0; i < args.length; i++ ) { int delim = args[i].indexOf( '=' ); if( delim > 0 && delim <= args[i].length() - 2 ) { parms.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) ); } } return parms; } /** Wandle CSV-Datei (Comma Separated Values) in HTML-Datei */ private static final void csvToHtml( String csvDatei, String encoding, String delimiter ) throws IOException { List<List<String>> tbl = new ArrayList<List<String>>(); BufferedReader in = new BufferedReader( new InputStreamReader( new FileInputStream( csvDatei ), encoding ) ); try { String line; while( (line = in.readLine()) != null ) { tbl.add( Arrays.asList( line.split( delimiter ) ) ); } } finally { in.close(); } ausgabeHtml( tbl, csvDatei + ".html", encoding, false ); } /** Ausgabe als CSV-Datei (Comma Separated Values, z.B. fuer Excel) */ private static final void ausgabeCsv( List<List<String>> tbl, String csvFile, String encoding ) { if( tbl == null || tbl.size() == 0 || csvFile == null || csvFile.trim().length() == 0 ) { return; } try { BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( csvFile ), encoding ) ); try { for( List<String> row : tbl ) { if( row != null ) { for( String s : row ) { out.write( correctStringForCsv( s, true ) + ";" ); } out.newLine(); } } } finally { out.close(); } System.out.println( "\n" + csvFile + " erzeugt." ); } catch( Exception ex ) { System.out.println( "\nFehler beim Erzeugen der CSV-Datei '" + csvFile + "': " + ex ); } } /** Ausgabe als HTML-Datei */ private static final void ausgabeHtml( List<List<String>> tbl, String htmlFile, String encoding, boolean htmlFileWithoutHtmlTag ) { if( tbl == null || tbl.size() == 0 || htmlFile == null || htmlFile.trim().length() == 0 ) { return; } try { BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( htmlFile ), encoding ) ); try { int i, r, lenRow0 = tbl.get( 0 ).size(); if( !htmlFileWithoutHtmlTag ) { out.write( "<head><meta http-equiv='content-type' content='text/html;charset=" + encoding + "'></head>\n<html>\n" ); } out.write( "<table border=1 cellspacing=0 cellpadding=2>\n<tr bgcolor='#EBEEEE'>" ); for( String s : tbl.get( 0 ) ) { out.write( "<th>" + s + "</th>" ); } for( r = 1; r < tbl.size(); r++ ) { if( tbl.get( r ) != null ) { out.write( "</tr>\n<tr>" ); for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) { out.write( "<td>" + tbl.get( r ).get( i ) + "</td>" ); } } } out.write( "</tr>\n</table>\n" ); if( !htmlFileWithoutHtmlTag ) { out.write( "</html>\n" ); } } finally { out.close(); } System.out.println( "\n" + htmlFile + " erzeugt." ); } catch( Exception ex ) { System.out.println( "\nFehler beim Erzeugen der HTML-Datei '" + htmlFile + "': " + ex ); } } /** Ausgabe auf Konsole (Kommandozeilenfenster) */ private static final void ausgabeKonsole( List<List<String>> tbl, int maxZeilen, String encoding ) { if( tbl == null || tbl.size() == 0 ) { return; } PrintWriter pw; try { pw = new PrintWriter( new OutputStreamWriter( System.out, encoding ) ); } catch( UnsupportedEncodingException ex ) { pw = new PrintWriter( new OutputStreamWriter( System.out ) ); } try { String leerString = " "; String minusString = "---------------------"; int i, r, maxRows = tbl.size(), lenRow0 = tbl.get( 0 ).size(); if( maxRows > maxZeilen + 1 ) { maxRows = maxZeilen + 1; pw.println( "\nWarnung: Begrenzt auf " + (maxRows - 1) + " Zeilen.\n" ); } int maxLength = 0; for( r = 0; r < maxRows; r++ ) { if( tbl.get( r ) != null ) { for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) { String s = tbl.get( r ).get( i ); if( s != null && maxLength < s.length() ) { maxLength = s.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 < lenRow0; i++ ) { pw.print( "+-" + minusString ); } pw.println( "+" ); for( r = 0; r < maxRows; r++ ) { if( tbl.get( r ) != null ) { for( i = 0; i < Math.min( lenRow0, tbl.get( r ).size() ); i++ ) { pw.print( "| " + extendString( tbl.get( r ).get( i ), leerString ) ); } pw.println( "|" ); if( 0 == r ) { for( i = 0; i < lenRow0; i++ ) { pw.print( "+-" + minusString ); } pw.println( "+" ); } } } for( i = 0; i < lenRow0; i++ ) { pw.print( "+-" + minusString ); } pw.println( "+" ); } finally { pw.flush(); } } /** Verlaengere String linksbuendig auf vorgegebene Laenge */ private static final String extendString( String s, String maxLeerString ) { String si = ( s != null ) ? s : ""; final int iWantLen = maxLeerString.length(); final int iActLen = si.length(); if( iActLen < iWantLen ) { return (si + maxLeerString).substring( 0, iWantLen ); } if( iActLen > 2 * iWantLen ) { return si.substring( 0, 2 * iWantLen ); } return si; } /** Ersetze Semikolons und bestimmte Sonderzeichen */ private static final String correctStringForCsv( String s, boolean noTrim ) { final String[] replStrings = { ";", ",", "\n", ". ", "&", "&", "€", "\u20AC", "§", "§", "®", "®", "²", "²", "°", "°", "¿", "¿" }; String si = ( s == null ) ? "" : ( noTrim ) ? s : s.trim(); for( int i = 0; i < replStrings.length - 1; i += 2 ) { si = si.replace( replStrings[i], replStrings[i + 1] ); } return si; } }
Erzeugen Sie im DbZuCsvOderHtml-Projektverzeichnis folgende Properties-Datei (passen Sie die Parameter an Ihre Datenbank und Tabellen an): DbZuCsvOderHtml.properties
Beispiel für MySQL: | Beispiel für Oracle XE: | |
console=true csvFile=MeineCsvDatei htmlFile=MeineHtmlDatei htmlFileWithoutHtmlTag=false dbDrv=com.mysql.jdbc.Driver dbUrl=jdbc:mysql://localhost:3306/MeineDb dbUsr=root dbPwd=mysqlpwd sql1=select * from MeineTestTabelle sql2=select i, c, s from MeineTestTabelle where i <= ? sql2.parm1=12 |
console=true csvFile=MeineCsvDatei htmlFile=MeineHtmlDatei htmlFileWithoutHtmlTag=false dbDrv=oracle.jdbc.OracleDriver dbUrl=jdbc:oracle:thin:@localhost:1521:XE dbUsr=MeinBenutzername dbPwd=TEMP sql1=select * from MeineTestTabelle sql2=select i, c, s from MeineTestTabelle where i <= ? sql2.parm1=12 |
Erläuterungen zu den Properties finden Sie unten.
Ihr Projektverzeichnis sieht jetzt folgendermaßen aus:
[\MeinWorkspace] '- [DbZuCsvOderHtml] |- [bin] |- [lib] | |- mysql-connector-java-5.1.16-bin.jar [falls MySQL] | '- ojdbc7.jar [falls Oracle-DB] |- [src] | '- [dbcsvhtml] | '- DbZuCsvOderHtml.java '- DbZuCsvOderHtml.properties
Kompilation und Ausführung können folgendermaßen im Kommandozeilenfenster aus dem Projektverzeichnis 'DbZuCsvOderHtml' heraus erfolgen:
cd \MeinWorkspace\DbZuCsvOderHtml
javac -cp .;bin;lib/* -d bin src/dbcsvhtml/*.java
java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml
dir
type MeineCsvDatei1.csv
type MeineHtmlDatei1.html
start MeineCsvDatei1.csv
start MeineCsvDatei2.csv
start MeineHtmlDatei1.html
start MeineHtmlDatei2.html
Falls Sie eine Datenbanktabelle wie unter 'MeineTestTabelle' beschrieben eingerichtet haben, erhalten Sie beispielsweise folgendes Ergebnis:
propFile: DbZuCsvOderHtml.properties dbDrv: com.mysql.jdbc.Driver dbUrl: jdbc:mysql://localhost:3306/MeineDb dbUsr: root encoding: UTF-8 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.
Auch wenn der Datenbank-String "äöüߧ€" korrekt aus der Datenbank ausgelesen wird, kann er je nach Betriebssystem, Ablaufumgebung und vorgegebenem Encoding eventuell falsch dargestellt werden.
Zum Beispiel erhalten Sie im Windows-Kommandozeilenfenster einen völlig anderen String (bei UTF-8 sogar einen zu langen String wegen der Mehrfachbytes). Bis auf das in der Cp850-Codepage nicht darstellbare €-Zeichen erhalten Sie korrekte Zeichen im Windows-Kommandozeilenfenster bei westeuropäischer Windows-Einstellung mit:
java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml "encoding=Cp850"
Allerdings wird Cp850 außer im Windows-Kommandozeilenfenster sonst nirgendwo verwendet.
Sinnvolle Encoding-Einstellungen können sein:
UTF-8, windows-1252 und ISO-8859-15, alle mit €-Zeichen,
ISO-8859-1 ohne €-Zeichen, aber sehr verbreitet,
US-ASCII ohne €-Zeichen und ohne Umlaute und Sonderzeichen.
Sehen Sie sich die Erläuterungen zu Encodings an.
Wenn Sie das Kommando
java -cp .;bin;lib/* dbcsvhtml.DbZuCsvOderHtml "sql1=select s from MeineTestTabelle where c = 'ab'" "sql2= "
eingeben, werden Voreinstellungen der Properties-Datei überschrieben und Sie erhalten:
sql1: select s from MeineTestTabelle where c = 'ab' +--------+ | s | +--------+ | Blabla | +--------+ MeineCsvDatei1.csv erzeugt. MeineHtmlDatei1.html erzeugt.
Wie gezeigt können Sie die Konfigurationsparameter über die Kommandozeile oder in der Properties-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 Properties-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) |
encoding | Encoding der erzeugten Dateien und der Konsolenausgabe, z.B. 'UTF-8', 'ISO-8859-1', 'windows-1252' oder 'US-ASCII' |
noTrim | Wenn dieser Wert nicht auf 'true' gesetzt wird, werden führende und nachfolgende Leerzeichen entfernt |
dbDrv | JDBC-Treiberklasse, z.B. 'com.mysql.jdbc.Driver' oder 'oracle.jdbc.OracleDriver' |
dbUrl | URL der SQL-Datenbank, z.B. 'jdbc:mysql://localhost:3306/MeineDb' oder 'jdbc:oracle:thin:@localhost:1521:XE' |
dbUsr | Datenbank-Benutzername |
dbPwd | Datenbank-Kennwort |
sql1 sql2 ... |
SQL-Kommandos,
können wahlweise parameterlose SQL-Kommandos sein (z.B. 'select * from MeineTabelle'), oder zu parametrisierende SQL-Kommandos (z.B. 'select * from MeineTabelle where i <= ?') |
sql_.parm1 sql_.parm2 ... |
Die einzelnen Parameter falls zu parametrisierendes SQL-Kommando (den Unterstrich '_' durch die Nummer des passenden SQL-Kommandos ersetzen) |
csvToHtmlFile | Alternative Betriebsart: Die angegebene CSV-Datei wird in eine HTML-Datei konvertiert |
Beim obigen Beispiel wird der selektierte DB-Tabelleninhalt in String-Listen geladen und kann anschließend flexibel weiterverarbeitet oder ausgegeben werden. Dies funktioniert allerdings so nur, wenn die gelesenen Strings alle in den zur Verfügung stehenden RAM-Speicher passen.
Wenn Sie große DB-Tabellen in CSV-Dateien speichern wollen, müssen Sie zeilenweise lesen und speichern, wie es das folgende Beispiel zeigt.
Die Parametrisierung erfolgt genau so wie beim letzten Beispiel per Kommandozeile oder über eine Properties-Datei.
Erzeugen Sie die im obigen Beispiel gezeigte Verzeichnisstruktur (inklusive des JDBC-Treibers und der Properties-Datei DbZuCsvOderHtml.properties).
Erzeugen Sie im src\dbcsvhtml-Verzeichnis folgende Java-Sourcedatei: DbZuCsv.java
package dbcsvhtml; import java.io.*; import java.sql.*; import java.text.SimpleDateFormat; import java.util.Properties; /** * Lies Datenbanktabellen und gib sie als CSV-Datei aus. * Die Parametrisierung erfolgt ueber Kommandozeilenparameter oder ueber eine Properties-Datei. */ public class DbZuCsv { private static final SimpleDateFormat YYYY_MM_DD_HH_MM_SS = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); public static void main( String[] args ) { // Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile: Properties parms = getParms( args, "DbZuCsv.properties" ); // Pruefe die wichtigsten Properties: String dbDrv = parms.getProperty( "dbDrv" ); String dbUrl = parms.getProperty( "dbUrl" ); String dbUsr = parms.getProperty( "dbUsr" ); String sql1 = parms.getProperty( "sql1" ); String csvFile = parms.getProperty( "csvFile" ); String encoding = parms.getProperty( "encoding" ); String noTrimStr = parms.getProperty( "noTrim" ); boolean noTrim = noTrimStr != null && noTrimStr.trim().length() > 0 && noTrimStr.trim().equalsIgnoreCase( "true" ); if( null == csvFile || 0 == csvFile.trim().length() ) { csvFile = "MeineCsvDatei"; } if( null == encoding || 0 == encoding.trim().length() ) { encoding = "UTF-8"; } System.out.println( "\npropFile: " + parms.getProperty( "propFile" ) + "\ndbDrv: " + dbDrv + "\ndbUrl: " + dbUrl + "\ndbUsr: " + dbUsr + "\nencoding: " + encoding ); 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 MeineTabelle" ); } if( dbDrv == null || dbUrl == null || sql1 == null ) { System.exit( 1 ); } // Lies Datenbanktabelle und schreibe in CSV-Datei: Connection cn = null; PreparedStatement st = null; ResultSet rs = null; try { // Datenbank-Connection: Class.forName( dbDrv ); cn = DriverManager.getConnection( dbUrl, dbUsr, parms.getProperty( "dbPwd" ) ); int idxSql = 0; while( true ) { // SQL-Kommando und PrepareStatement: String sql = parms.getProperty( "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 = parms.getProperty( "sql" + idxSql + ".parm" + ++idxParm ); if( null == parm || 0 >= parm.trim().length() ) { break; } System.out.println( "sql" + idxSql + ".parm" + idxParm + ": " + parm ); st.setObject( idxParm, parm ); } // CSV-Datei: String csvFileN = csvFile + idxSql + ".csv"; BufferedWriter out = new BufferedWriter( new OutputStreamWriter( new FileOutputStream( csvFileN ), encoding ) ); try { // ResultSet: rs = st.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int i, n = rsmd.getColumnCount(); for( i = 0; i < n; i++ ) { out.write( correctStringForCsv( rsmd.getColumnName( i + 1 ), noTrim ) + ";" ); } out.newLine(); while( rs.next() ) { for( i = 0; i < n; i++ ) { Object obj = rs.getObject( i + 1 ); if( null != obj && obj instanceof java.sql.Date ) { out.write( correctStringForCsv( YYYY_MM_DD_HH_MM_SS.format( (java.sql.Date) obj ), noTrim ) + ";" ); } else { out.write( correctStringForCsv( rs.getString( i + 1 ), noTrim ) + ";" ); } } out.newLine(); } } finally { out.close(); } System.out.println( "\n" + csvFileN + " erzeugt." ); rs.close(); rs = null; st.close(); st = null; } } catch( Exception ex ) { System.out.println( "\nFehler beim Lesen der Datenbank oder beim Erzeugen der CSV-Datei '" + csvFile + "': " + ex ); ex.printStackTrace(); } finally { try { if( rs != null ) { rs.close(); } } catch( Exception ex ) {/* nothing to do */} try { if( st != null ) { st.close(); } } catch( Exception ex ) {/* nothing to do */} try { if( cn != null ) { cn.close(); } } catch( Exception ex ) {/* nothing to do */} } } /** Ermittle uebergebene Parameter aus Properties-Datei und aus Kommandozeile */ private static final Properties getParms( String[] args, String propFileDefault ) { // Lies 'Key=Value'-Paare aus Properties-Datei fuer Voreinstellungen: String propFile = ( args.length > 0 && args[0].startsWith( "prop=" ) ) ? args[0].substring( 5 ) : propFileDefault; Properties parms = new Properties(); InputStream in = null; try { in = new FileInputStream( propFile ); parms.load( in ); parms.setProperty( "propFile", propFile ); } catch( FileNotFoundException ex ) { System.out.println( "\nWarnung: Keine Properties-Datei '" + propFile + "' fuer Voreinstellungen gefunden." ); } catch( IOException ex ) { System.out.println( "\nFehler beim Lesen der Datei '" + propFile + "': " + ex.getMessage() ); } finally { try { if( in != null ) { in.close(); } } catch( IOException e ) {/* nothing to do */} } // Lies 'Key=Value'-Paare aus Kommandozeilenparametern // (koennen Parameter aus obiger Properties-Datei ueberschreiben): for( int i = 0; i < args.length; i++ ) { int delim = args[i].indexOf( '=' ); if( delim > 0 && delim <= args[i].length() - 2 ) { parms.put( args[i].substring( 0, delim ), args[i].substring( delim + 1 ) ); } } return parms; } /** Ersetze Semikolons und bestimmte Sonderzeichen */ private static final String correctStringForCsv( String s, boolean noTrim ) { final String[] replStrings = { ";", ",", "\n", ". ", "&", "&", "€", "\u20AC", "§", "§", "®", "®", "²", "²", "°", "°", "¿", "¿" }; String si = ( s == null ) ? "" : ( noTrim ) ? s : s.trim(); for( int i = 0; i < replStrings.length - 1; i += 2 ) { si = si.replace( replStrings[i], replStrings[i + 1] ); } return si; } }
Die Kompilation und Ausführung erfolgt analog wie beim letzten Beispiel:
cd \MeinWorkspace\DbZuCsvOderHtml
javac -cp .;bin;lib/* -d bin src/dbcsvhtml/*.java
java -cp .;bin;lib/* dbcsvhtml.DbZuCsv
dir