Comment puis-je écrire une table entière dans un fichier plat (fichier texte) à l'aide de jdbc? Jusqu'à présent, j'ai tenté ce qui suit:
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("SELECT * FROM tablename");
BufferedInputStream buffer;
FileOutputStream out = new FileOutputStream("flatfile.txt");
while(result.next() )
{
buffer = new BufferedInputStream(result.getBinaryStream("????") );
byte[] buf = new byte[4 * 1024]; //4K buffer
int len;
while( (len = buffer.read(buf, 0, buf.length) ) != -1 )
{
out.write(buf, 0, len );
}
}
out.close();
"????" est juste mon espace réservé. Je suis coincé sur ce qu'il faut transmettre comme argument.
Vous pouvez obtenir tous les noms de colonne et toutes les données de votre table en utilisant le code ci-dessous . La méthode writeToFile contiendra la logique pour écrire dans un fichier (si cela n'était pas assez évident :))
ResultSetMetaData metadata = rs.getMetaData();
int columnCount = metadata.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
writeToFile(metadata.getColumnName(i) + ", ");
}
System.out.println();
while (rs.next()) {
String row = "";
for (int i = 1; i <= columnCount; i++) {
row += rs.getString(i) + ", ";
}
System.out.println();
writeToFile(row);
}
Voici comment je vider une table d'une connexion JDBC, très utile pour le débogage si vous souhaitez voir toutes les lignes qui se trouvent dans une base de données en mémoire (ex: HSQL), par exemple:
public static void spitOutAllTableRows(String tableName, Connection conn) {
try {
System.out.println("current " + tableName + " is:");
try (PreparedStatement selectStmt = conn.prepareStatement(
"SELECT * from " + tableName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = selectStmt.executeQuery()) {
if (!rs.isBeforeFirst()) {
System.out.println("no rows found");
}
else {
while (rs.next()) {
for (int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++) {
System.out.print(" " + rs.getMetaData().getColumnName(i) + "=" + rs.getObject(i));
}
System.out.println("");
}
}
}
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
la sortie est comme
current <yourtablename> is:
ID=1 COLUMN1=abc COLUMN2=null
ID=2 COLUMN1=def COLUMN2=ghi
...
result.getBinaryStream("????")
ne renverra que la valeur de cette colonne lorsque vous aurez placé un paramètre fictif.
Si vous voulez obtenir toute la colonne, vous devez utiliser ResultSetMetaData
à partir de ResultSet
ResultSetMetaData metadata = resultSet.getMetaData();
int columnCount = metadata.getColumnCount();
for (int i=1; i<=columnCount; i++)
{
String columnName = metadata.getColumnName(i);
System.out.println(columnName);
}