Exporting SQL query result to csv or Excel - java

I want to write the result of a SQL query to a csv or Excel file and save it in a particular folder. I have following requests:
I would like to know, if this can be achieved using a Java program which can be reused for any SQL query result.
I would also like to know, if this can be used for different databases (Oracle, MySQL, SQL Server, etc.).
I plan to attach the saved file to an email. Is it possible to export SQL query results to an email directly?.

With use of openCSV API, you can export your data in csv file.
CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
Boolean includeHeaders = true;
java.sql.ResultSet myResultSet = .... //your resultset logic here
writer.writeAll(myResultSet, includeHeaders);
writer.close();

Simplest solution.
Main Method
private List<String> resultSetArray=new ArrayList<>();
private String username =""; // Enter DB Username
private String password = ""; // Enter DB password
private String url = ""; // Enter DB URL
Connection connection=DriverManager.getConnection(url,user,pwd);
public static void main(String args[]) throws Exception{
fetchDataFromDatabase("SQL queries", connection);
printToCsv(resultArray);
}
fetchDataFromDatabase
The code below count the number of columns in a table, and store in a result array.
private void fetchDataFromDatabase(String selectQuery,Connection connection) throws Exception{
try {
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(selectQuery);
int numCols = rs.getMetaData().getColumnCount();
while(rs.next()) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= numCols; i++) {
sb.append(String.format(String.valueOf(rs.getString(i))) + " ");
}
resultSetArray.add(sb.toString());
}
} catch (SQLException e) {
LOGGER.error("Sql exception " + e.getMessage());
}
}
printToCsv
public static void printToCsv(List<String> resultArray) throws Exception{
File csvOutputFile = new File(file_name);
FileWriter fileWriter = new FileWriter(csvOutputFile, false);
for(String mapping : resultArray) {
fileWriter.write(mapping + "\n");
}
fileWriter.close();
}

It's difficult to export result set data from any tool.
ex: while exporting result set data to .csv file it does not export properly when data contains (,)
please refer below java code :
it works perfectly with any any query input and all type of data in result set
package com.demo.export;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class dataExportService {
public void getDefendants(Connection con , String db) throws Exception {
#SuppressWarnings("unused")
Workbook readWorkbook = WorkbookFactory.create(new FileInputStream(".xls file path(C:\\Users\\CEPL\\Desktop\\test.xls)") );
#SuppressWarnings("resource")
Workbook writeWorkbook = new HSSFWorkbook();
Sheet desSheet = writeWorkbook.createSheet("new sheet");
Statement stmt = null;
ResultSet rs = null;
try{
String query ="QUERY";
stmt = con.createStatement();
rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();
Row desRow1 = desSheet.createRow(0);
for(int col=0 ;col < columnsNumber;col++) {
Cell newpath = desRow1.createCell(col);
newpath.setCellValue(rsmd.getColumnLabel(col+1));
}
while(rs.next()) {
System.out.println("Row number" + rs.getRow() );
Row desRow = desSheet.createRow(rs.getRow());
for(int col=0 ;col < columnsNumber;col++) {
Cell newpath = desRow.createCell(col);
newpath.setCellValue(rs.getString(col+1));
}
FileOutputStream fileOut = new FileOutputStream(".xls file path(C:\\Users\\CEPL\\Desktop\\test.xls)");
writeWorkbook.write(fileOut);
fileOut.close();
}
}
catch (SQLException e) {
System.out.println("Failed to get data from database");
}
}
}

Here is an example:
import java.io.*;
import java.sql.*;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class ExcelFile {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "root");
PreparedStatement psmnt = null;
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("Select * from student");
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow((short) 0);
rowhead.createCell((short) 0).setCellValue("Roll No");
rowhead.createCell((short) 1).setCellValue("Name");
rowhead.createCell((short) 2).setCellValue("Class");
rowhead.createCell((short) 3).setCellValue("Marks");
rowhead.createCell((short) 4).setCellValue("Grade");
int index = 1;
while (rs.next()) {
HSSFRow row = sheet.createRow((short) index);
row.createCell((short) 0).setCellValue(rs.getInt(1));
row.createCell((short) 1).setCellValue(rs.getString(2));
row.createCell((short) 2).setCellValue(rs.getString(3));
row.createCell((short) 3).setCellValue(rs.getInt(4));
row.createCell((short) 4).setCellValue(rs.getString(5));
index++;
}
FileOutputStream fileOut = new FileOutputStream("c:\\excelFile.xls");
wb.write(fileOut);
fileOut.close();
System.out.println("Data is saved in excel file.");
rs.close();
connection.close();
} catch (Exception e) {
}
}
}
Reference

This is my solution. Code to insert in the main class:
import java.io.*;
import java.sql.*;
import com.company.*;
/**
* Created by MAXNIGELNEGRO
*/
String[] filePath = new String[] {"C:\\Users\\Documents\\MyFile.csv"};
String[] driverDB = new String[] {"oracle.jdbc.driver.OracleDriver"};
String[] stringConnDB = new String[] {"jdbc:oracle:thin:#//127.0.0.1:1881/mydb"};
String[] userDB = new String[] {"pippo"};
String[] passDB = new String[] {"pluto"};
String[] charSep = new String[] {";"};
Boolean column= new Boolean (true);
String[] queryDB = new String[] {"select * FROM MYQUERY"};
try{
System.out.println("---------------File exist?------------" + filePath[0]);
File fileTemp = new File(filePath[0].toString());
if (fileTemp.exists()){
fileTemp.delete();
System.out.println("---------------DELETE FILE------------" + filePath[0] );
}
System.out.println("QUERY: ---->"+ queryDB[0].toString());
exportQueryToCsv exp = new exportQueryToCsv();
exp.exportQueryToCsv(filePath, driverDB, stringConnDB, userDB, passDB, queryDB, column, charSep);
if (fileTemp.exists()){
System.out.println("---File created---" + filePath[0]);
}
}
catch(Exception e){
e.printStackTrace();
}
The core class:
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Created by MAXNIGELNEGRO
*/
public class exportQueryToCsv {
public exportQueryToCsv(){}
public static void exportQueryToCsv (String[] filename, String[] driverDB, String[] connDB
, String[] userDB, String[] passDB, String[] queryDB, Boolean intestaFile
, String[] charSep) throws SQLException, IOException {
Statement stmt=null;
ResultSet rset=null;
Connection conn=null;
try { DBConn connessione = new DBConn();
conn=connessione.connect(driverDB[0],connDB[0],userDB[0],passDB[0]);
conn.setAutoCommit(false);
stmt = conn.createStatement();
rset = stmt.executeQuery(queryDB[0]);
ExportData2CSV csv = new ExportData2CSV();
csv.ExportData2CSV(rset,filename[0],intestaFile,charSep[0]);
csv.createFileCsv();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (stmt != null) {stmt.close();}
if (conn != null) {conn.close();}
if (rset != null) {rset.close();}
}
}
}
This is the class DBConn for the connection to the database:
import java.sql.*;
/**
* Created by MAXNIGELNEGRO
*/
public class DBConn {
public DBConn() {
}
public Connection connect(String driverDB, String db_connect_str, String db_userid, String db_password) {
Connection conn;
try {
Class.forName(driverDB).newInstance();
conn = DriverManager.getConnection(db_connect_str, db_userid, db_password);
} catch (Exception e) {
e.printStackTrace();
conn = null;
}
return conn;
}
}
This is the class for retrieves data from table to resultset and writes to csv file:
package com.company;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* Created by MAXNIGELNEGRO
*/
public class ExportData2CSV {
public ResultSet rset;
public String filename;
public Boolean columnName;
public String charSep;
public void ExportData2CSV(ResultSet rset, String filename, Boolean columnName, String charSep) {
this.rset = rset;
this.filename = filename;
this.columnName = columnName;
this.charSep = charSep;
}
public void createFileCsv() throws SQLException, IOException {
FileWriter cname = null;
try {
// WRITE COLUMN NAME
ResultSetMetaData rsmd = rset.getMetaData();
cname = new FileWriter(filename);
if (columnName) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
cname.append(rsmd.getColumnName(i));
cname.append(charSep);
cname.flush();
}
cname.append(System.getProperty("line.separator"));
}
// WRITE DATA
while (rset.next()) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
if (rset.getObject(i) != null) {
String data = rset.getObject(i).toString().replaceAll(charSep, "");
cname.append(data);
cname.append(charSep);
} else {
String data = "null";
cname.append(data);
cname.append(charSep);
}
}
//new line entered after each row
cname.append(System.getProperty("line.separator"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cname != null) {
cname.flush();
cname.close();
}
if (rset != null) {
rset.close();
}
}
}
}

This is the excel data sheet
input excel file containing records
Hi this is the solution you need 3 files 1.input thread 2.output thread 3.data structure 4.main
1.input thread to read the excel and output thread to write the sql out put
2.data structure is to hold and transfer the data
(InputThread.java)
import java.io.*;
public class InputThread extends Thread{
String fp;
InputString is;
String tableName="emp";
String outFile;
InputThread(String FilePath,String nameOfTheTable,String outFileName){
fp=FilePath;
outFile=outFileName;
tableName=nameOfTheTable;
}
public void run(){
File file = new File(fp);
String line;
try{
BufferedReader br = new BufferedReader(new FileReader(file));
if( (line=br.readLine()) != null)
is = new InputString(line);
//transform(is);
InputString tmp = new InputString(createTable(line));
//tmp.next = is;
is = tmp;
//tmp = tmp.next;
for(; (line = br.readLine()) != null; ) {
tmp.next = new InputString(line);
tmp = tmp.next;
transform(tmp);
}
}catch(Exception e){ System.out.println("Error is :"+e); }
//traverse();
new OutputThread(is,outFile).start();
}
void transform(InputString x){
String[] arr = x.getLine().split(",");
String sql = "insert into "+tableName+" values(";
for(int i=0;i<arr.length;i++){
sql+="'"+arr[i]+"'";
if( (i+1) < arr.length) sql+=",";
}
sql+=");";
x.setLine(sql);
}
String createTable(String x){
String[] arr = x.split(",");
String sql = "create database vamsidb "+ "use vamsidb "+"create table "+tableName+"(";
for(int i=0;i<arr.length;i++){
sql+=arr[i]+" varchar(50)";
if( (i+1) < arr.length) sql+=",";
}
sql+=");";
return sql;
}
/*public void traverse(){
InputString tmp = is;
while(is != null){
System.out.println(is.getLine());
is=is.next;
}
}*/
}
(OutputThread.java)
import java.io.*;
public class OutputThread extends Thread{
InputString is;
String outFile;
OutputThread(InputString linkedList,String outFileName){
is=linkedList;
outFile = outFileName;
}
public void run(){
try{
FileOutputStream fos = new FileOutputStream(outFile);
while(is != null){
fos.write(is.getLine().getBytes());
is=is.next;
}
fos.close();
}catch(Exception e){
System.out.println("Error is :"+e);
}
}
}
(Main.java)
public class Main{
public static void main(String[] args){
InputThread it = new InputThread("sasken.csv","emp","output.sql");
it.start();
}
}
(DataStructure.java)
//This class represents the data structure to hold and transform input
//data as a linked list of sql statements
class InputString{
String line;
InputString next;
InputString(String x){
line = x;
}
String getLine(){
return line;
}
void setLine(String x){
line = x;
}
}
output result

You can use JDBC to fetch the records from DB in java and then use Apache POI for exporting the data to CSV/Excel.
Additionally, you can use the desktop API of java to send email using your default email client.

For this to work you need to work write a small code that can take up any query and any driver . The first input should be the driver name as the input to the software that you are writing. Then the software you are writing should be in a position to execute any SQL given to it and give out only rows and columns.
The next task comes to parse the ResultSet that comes from the JDBC of java application. Either you want to write the results into CSV file or EXCEL is based on how good you have the java api to do that.
Writing the output into the CVS is easy and not trival. I have not worked on exporting the data into Excel. I am sure you find jars for that.

The solution is based on a properties file.
Where this options are configured:
The parameters of the database.
Optional extra SQL Where clause.
The parameters of the output files.
The process can start bis 4 threads to download 4 tables at the same time.
If you want to run again, the generated files must be deleted.
A text file (logs.txt) with the process data is also created.
---- PROP FILE : ExportProperties.prop ---------
The solution will write a draft cinfiguration version in:
C:\tmp\test\ExportProperties.prop
## configuration properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:#ldap://localhost
username=user
password=pass
fileExtension=_20200623.csv
columSeparator=;
charsetName=CP1252
## export only 10 rows change to false
only10Rows=true
##tables
tableName.1=USER
tableName.1.sqlWhere= user.name IS NOT NULL
tableName.2=ROLL
tableName.3=FIRMA
--------- The main file --------
public class ExportTable2CSVMain implements Runnable {
static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss SSS|");
static final String folder = "C:\\tmp\\test\\";
static final Properties prop = getProperties();
public static void main(String[] args) {
for (int x = 1; x < 6; x++) {
try {
writieLog(0, "Start thread " + x);
new ExportTable2CSVMain();
Thread.sleep(1000);
} catch (final Exception e) {
e.printStackTrace();
}
}
}
public ExportTable2CSVMain() {
final Thread t = new Thread(this);
t.start(); // start the thread -> run
}
#Override
public void run() {
int pos = 1;
String tableName = prop.getProperty("tableName." + pos);
while (tableName != null) {
try {
export(tableName, pos++);
} catch (final Exception e) {
e.printStackTrace();
}
tableName = prop.getProperty("tableName." + pos);
}
}
private void export(String tableName, int filePos) throws Exception {
final boolean only10Rows = prop.getProperty("only10Rows", "false").equals("true");
String extraWhere = prop.getProperty("tableName."+filePos+".sqlWhere");
if(extraWhere ==null)
extraWhere = prop.getProperty("sqlWhere");
if(extraWhere ==null)
extraWhere = "";
final String sql = "select * from " + tableName + extraWhere
+ (only10Rows ? " FETCH NEXT 10 ROWS ONLY" : "");
final String fileName = folder + tableName + prop.getProperty("fileExtension");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ExportTable2CSV data2csv = null;
try {
data2csv = new ExportTable2CSV(fileName, tableName, filePos);
if (data2csv.toDo()) {
conn = getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
data2csv.createFileCsv(rs);
}
} catch (final Exception e) {
final int row = data2csv == null ? -1 : data2csv.row;
writieLog(filePos, "SQL", "Error", "rows:" + row, tableName, e.getMessage());
e.printStackTrace();
} finally {
try {
rs.close();
} catch (final Exception e) {
}
try {
stmt.close();
} catch (final Exception e) {
}
try {
conn.close();
} catch (final Exception e) {
}
}
}
public Connection getConnection() throws Exception {
Class.forName(prop.getProperty("driver"));
return DriverManager.getConnection(//
prop.getProperty("url"),
prop.getProperty("username"),
prop.getProperty("password"));
}
static private Properties getProperties() {
File file = new File(folder);
if (!file.exists()) { // if the folder do not exist create it
file.mkdirs();
}
file = new File(folder + "ExportProperties.prop");
if (!file.exists()) {
try {
final PrintWriter out = new PrintWriter(
new BufferedWriter(new FileWriter(folder + "ExportProperties.prop", true)));
out.println(//
"## configuration properties\n" +
"driver=oracle.jdbc.driver.OracleDriver\n" +
"url=jdbc:oracle:thin:#ldap://localhost\n"+
"username=USER\n" +
"password=PASSWORD\n" +
"sqlWhere=\n" +
"fileExtension=_20200619.csv\n" +
"columSeparator=;\n" +
"charsetName=CP1252\n" +
"##tables\n" +
"tableName.1=USER\n" + //
"tableName.2=ROLL\n"
);
out.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
final Properties prop = new Properties();
try {
prop.load(new FileInputStream(folder + "ExportProperties.prop"));
} catch (final IOException e) {
e.printStackTrace();
}
return prop;
}
public static void writieLog(int filePos, String... txt) throws Exception {
final PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(folder + "logs.txt", true)));
String sb = "";
sb += formatter.format(new Date()) + "\t";
sb += filePos == 0 ? "" : "F-" + filePos + "\t";
for (final String s : txt) {
sb += s + "\t";
}
System.out.println(sb);
out.println(sb);
out.close();
}
}
---------------- the ExportTable2CSV file -------
/**
* Created by Jose Manuel Davila (Mel) kailas.mel#gmail.com
*/
public class ExportTable2CSV {
final String fileName;
final String table;
final String columSeparator;
final Boolean columnName = true;
final int filePos;
int row = 0;
int column = 0;
public ExportTable2CSV(String fileName, String table, int filePos) {
this.filePos = filePos;
this.fileName = fileName;
this.table = table;
columSeparator = ExportTable2CSVMain.prop.getProperty("columSeparator", ";");
}
public boolean toDo() throws Exception {
if (new File(fileName).exists()) {// the file exist jet return
return false;
}
writeLine("");
return true;
}
public void createFileCsv(ResultSet rs) throws Exception {
String sb = "";
try {
ExportTable2CSVMain.writieLog(filePos, "FILE", "INI ", table, fileName);
// WRITE COLUMN NAME
final ResultSetMetaData rsmd = rs.getMetaData();
sb = "";
final List<String> list = new ArrayList<String>();
if (columnName) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
sb += rsmd.getColumnName(i) + columSeparator;
list.add(rsmd.getColumnName(i));
}
writeLine(sb.toString());
}
// WRITE DATA
while (rs.next()) {
sb = "";
column = 0;
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
final Object obj = rs.getObject(i);
String data = "";
if (obj != null) {
if (obj instanceof String) {
data = obj.toString();
if (data.indexOf(columSeparator) != -1) {
if (data.indexOf("\"") != -1) {
data = data.replaceAll("\"", "'");
ExportTable2CSVMain.writieLog(filePos, "FILE", "WITH comm and ; ", "row:" + row,
"Column:" + list.get(column), table, fileName);
}
data = "\"" + data + "\"";
}
} else {
data = obj.toString();
}
}
sb += data + columSeparator;
column++;
}
writeLine(sb.toString());
row++;
}
ExportTable2CSVMain.writieLog(filePos, "FILE", "END ", "rows:" + row, table, fileName);
} catch (final Exception e) {
ExportTable2CSVMain.writieLog(filePos, "FILE", "Error ", "rows:" + row, table, fileName, e.getMessage());
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
}
}
void writeLine(String line) throws Exception {
if (row > 0 && row % 1000 == 0) {
System.out.println(filePos + " " + row + " working ...");
}
final PrintWriter cname = new PrintWriter(new BufferedWriter((new OutputStreamWriter(
new FileOutputStream(fileName, true), ExportTable2CSVMain.prop.getProperty("charsetName", "CP1252")))));
if (line.equals("")) {
cname.print(line);
} else {
cname.println(line);
}
cname.close();
}
}
--------- POM file pom.xml ----------------
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ExportTable2CSV</groupId>
<artifactId>ExportTable2CSV</artifactId>
<version>1.1.0</version>
<name>ExportTable2CSV</name>
<properties>
<ojdbc8.version>18.3.0.0.0</ojdbc8.version>
</properties>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>${ojdbc8.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
To export to a column separated with tab.
change this prop in properties file :
fileExtension=_mel.txt
columSeparator=\t

This works perfectly fine:
PreparedStatement statement = famuat.prepareStatement(sql query);
ResultSet result = statement.executeQuery();
ResultSetMetaData md = result.getMetaData();
FileWriter fw = new FileWriter(filepath);
int columnCount = md.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
columnheader = md.getColumnName(i);
// System.out.println(columnheader);
if (i > 1) System.out.print(" | ");
if (i > 1) System.out.print(", ");
if (i > 1) System.out.print("\t");
fw.append(columnheader.toUpperCase());
fw.append(",");
System.out.println(columnheader);
}
while (result.next()) {
fw.append("\r\n");
for (int i = 1; i <= columnCount; i++) {
if (i > 1) System.out.print(" | ");
if (i > 1) System.out.print(", ");
if (i > 1) System.out.print("\t");
fw.append(result.getString(i));
fw.append(",");
row = result.getString(i);
System.out.println(row);
}
}

this work for exort to csv and txt
public void ExportTxt(){
FileWriter texto = null;
ResultSet rs2 = null;
ResultSet rs = null;
try {
texto = new FileWriter("texto.txt");
PrintWriter pw = new PrintWriter(texto);
Statement consulta = conn.createStatement();
Statement consulta2 = conn.createStatement();
String query = "SELECT * FROM coches";
rs = consulta.executeQuery(query);
int i=1;
pw.println("----------------");
while (rs.next()) {
pw.println(i + ",Coche: Matricula:" + rs.getString("matricula") + ", Marca:" + rs.getString("marca") + ", Modelo:" + rs.getString("modelo"));
String query2 = "SELECT * FROM reparaciones WHERE coche = '" + rs.getString("matricula") + "'";
rs2 = consulta2.executeQuery(query2);
pw.println("----------------");
while(rs2.next()){
pw.println(rs2.getRow() + ",Reparacion: Fecha entrada:" + rs2.getString("fecha_entrada") + ", Fecha salida:" + rs2.getString("fecha_salida"));
}
i++;
}
rs.close();
rs2.close();
consulta.close();
} catch (IOException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
texto.close();
} catch (IOException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void ExportCSV(){
PrintWriter pw = null;
try {
File archivo = new File("excel.csv");
pw = new PrintWriter((new FileWriter(archivo)));
Statement consulta = conn.createStatement();
String query = "SELECT * FROM clientes";
ResultSet rs = consulta.executeQuery(query);
pw.println("id;nombre;apellidos;direccion;nif;telefono");
while(rs.next()){
pw.println(rs.getInt("id") + ";" + rs.getString("nombre") + ";" + rs.getString("Apellidos") + ";" + rs.getString("direccion") + ";" + rs.getString("nif") + ";" + rs.getString("telefono"));
}
} catch (IOException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
} finally {
pw.close();
}
}

Tried some of the other answers and they didn't really work and/or ask to add libraries, which I like to avoid, especially for a format as dead simple as CSV.
So here's my own take. No special library requirements (other than your SQL driver) so (mostly) vanilla Java 8 or later should work. Also works with beanshell (hence try/finally rather than try-with-resources.) All fields should be escaped correctly, assuming the junit test I created (posted) is correct, so any RFC 4180 compliant CSV reader should be able to parse it without errors and/or getting it wrong, and for the purpose of this code, that includes Microsoft Excel.
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
import java.util.List;
import java.util.ArrayList;
import java.io.FileWriter;
// Replace this with your own SQLServerDriver class
import com.microsoft.sqlserver.jdbc.SQLServerDriver;
public class Sandbox {
/**
* Replaces null with an empty string, surrounds values that have commas or
* newlines with quotes, and if a value begins with a quote it escapes any
* quotes with another quote
*
* #param value
* #return
*/
public String csvEscape(String value) {
if (value == null) {
value = "";
} else if (value.contains(",") || value.contains("\n") || value.startsWith("\"")) {
value = "\"" + value.replace("\"", "\"\"") + "\"";
}
return value;
}
/**
* Run an SQL query and dump the output into a CSV file as we receive it
*
* #param url URL to your server in a format that the driver expects, i.e.
* "jdbc:sqlserver://server.com:1433;IntegratedSecurity=true;databaseName=foo"
* #param statement SQL statement, i.e. "SELECT foo FROM bar". Do NOT pass user
* generated strings!
* #param csvPath File path to the csv file, i.e. /foo/bar.csv
* #throws SQLException
* #throws IOException
*/
public void sqlToCsv(String url, String statement, String csvPath) throws SQLException, IOException {
Connection connection = DriverManager.getConnection(url);
Driver driverSelect = new SQLServerDriver();
DriverManager.registerDriver(driverSelect);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(statement);
ResultSetMetaData md = rs.getMetaData();
int colCount = md.getColumnCount();
List<String> cols = new ArrayList<String>();
for (int i = 1; i <= colCount; i++) {
String value = csvEscape(md.getColumnName(i));
cols.add(value);
}
List<String> row = new ArrayList<String>();
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(csvPath, false);
fileWriter.write(String.join(",", cols) + "\n");
while (rs.next()) {
row.clear();
for (int i = 1; i <= colCount; i++) {
String value = csvEscape(rs.getString(i));
row.add(value);
}
fileWriter.write(String.join(",", row) + "\n");
}
} finally {
fileWriter.close();
}
}
#Test
public void testCsvEscape() {
assertEquals("say \"cheese!\"", csvEscape("say \"cheese!\""));
assertEquals("\"\"\"say cheese\"\"!\"", csvEscape("\"say cheese\"!"));
assertEquals("\"cheese\nplease\"", csvEscape("cheese\nplease"));
assertEquals("\"cheese, please\"", csvEscape("cheese, please"));
assertEquals("\"say \"\"cheese,\n please!\"\"\"", csvEscape("say \"cheese,\n please!\""));
assertEquals("\"\"\"say \"\"cheese,\n please!\"\"\"\"\"", csvEscape("\"say \"cheese,\n please!\"\""));
}
}

Yes!
You can connect to the different database types using jdbc and then create an Excel with the results (Seen here).
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class TestAccessExcel {
public static Connection getConnection() throws Exception {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
String url = "jdbc:odbc:excelDB";
String username = "username";
String password = "pass";
Class.forName(driver);
return DriverManager.getConnection(url, username, password);
}
public static void main(String args[]) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.createStatement();
String excelQuery = "select * from [Sheet1$]";
rs = stmt.executeQuery(excelQuery);
while (rs.next()) {
System.out.println(rs.getString("BadgeNumber") + " " + rs.getString("FirstName") + " "
+ rs.getString("LastName"));
}
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
try {
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

Related

How to write data in excel sheet in specific cell using servlet?

I'm New to Servlet please help me out. I have created a Servlet file in which one excel file contains some data from the user. data is printed through the string. Now, most of the data is printed as per the expectation but now I want to print array stored data in a specific cell of the excel sheet and in a specific format. please refer the provided photo for the format that what I'm expecting. and also refer my code for the more better understanding. the main goal is to print array stored data in the specific cell of excel sheet. Please help me with the code because I'm really new to the Servlets. refer this link
testExcel
#WebServlet("/testExcel")
public class testExcel extends HttpServlet {
private static final long serialVersionUID = 1L;
String emails = "xyz#gmail.com";
#Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req, resp);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
OutputStream writer = response.getOutputStream();
// FileWriter writer =null;
ResultSet rs = null;
ResultSet rs1 = null;
Connection con = null;
ArrayList data_ar = new ArrayList();
String str = "";
PreparedStatement ps = null;
PreparedStatement ps1 = null;
try {
String fileName = emails + "data.csv";
System.out.println(fileName);
ServletContext context = getServletContext();
String mimeType = context.getMimeType(fileName);
if (mimeType == null) {
mimeType = "application/octet-stream";
}
response.setContentType(mimeType);
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", fileName);
response.setHeader(headerKey, headerValue);
ConnectionClass cn = new ConnectionClass();
con = cn.connectDb();
System.out.println("fileName" + fileName);
//Write the CSV file header
CSVUtil.writeLine(writer, Arrays.asList("NAME", "email", " ", " ", " ", "NAME AND EMAIL"));
ps = con.prepareStatement("select name,email from user");
rs = ps.executeQuery();
ps1 = con.prepareStatement("select name,email from user");
rs1 = ps1.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("name"));
CSVUtil.writeLine(writer, Arrays.asList(rs.getString("name"), rs.getString("email")));
}
while (rs1.next()) {
data_ar.add(rs1.getString("name") + " " + rs1.getString("email") + "\n");
}
str = String.join(" ", data_ar);
CSVUtil.writeLine(writer, Arrays.asList(" ", " ", " ", " ", " ", str));
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
con.close();
} catch (Exception e) {
}
}
}
}
csvutil.java
public class CSVUtil {
private static final char DEFAULT_SEPARATOR = ',';
public static void writeLine(OutputStream w, List<String> values) throws IOException {
writeLine(w, values, DEFAULT_SEPARATOR, ' ');
}
public static void writeLine(OutputStream w, List<String> values, char separators) throws IOException {
writeLine(w, values, separators, ' ');
}
// https://tools.ietf.org/html/rfc4180
private static String followCVSformat(String value) {
String result = value;
if (result.contains("\"")) {
result = result.replace("\"", "\"\"");
}
return result;
}
public static void writeLine(OutputStream w, List<String> values, char separators, char customQuote) throws IOException {
boolean first = true;
// default customQuote is empty
if (separators == ' ') {
separators = DEFAULT_SEPARATOR;
}
StringBuilder sb = new StringBuilder();
for (String value : values) {
if (!first) {
sb.append(separators);
}
if (customQuote == ' ') {
sb.append(followCVSformat(value));
} else {
sb.append(customQuote).append(followCVSformat(value)).append(customQuote);
}
first = false;
}
sb.append("\n");
String str = sb.toString();
byte[] bytes = str.getBytes(Charset.forName("UTF-8"));
w.write(bytes);
}
}
Simple and Quick answer:
You should try to use Apache POI :
Maven dependancy :
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
Simple class to write a list in excel file :
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ApachePOIExcelWrite {
private static final String FILE_NAME = "/tmp/MyFirstExcel.xlsx";
public static void main(String[] args) {
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Datatypes in Java");
Object[][] datatypes = {
{"Datatype", "Type", "Size(in bytes)"},
{"int", "Primitive", 2},
{"float", "Primitive", 4},
{"double", "Primitive", 8},
{"char", "Primitive", 1},
{"String", "Non-Primitive", "No fixed size"}
};
int rowNum = 0;
System.out.println("Creating excel");
for (Object[] datatype : datatypes) {
Row row = sheet.createRow(rowNum++);
int colNum = 0;
for (Object field : datatype) {
Cell cell = row.createCell(colNum++);
if (field instanceof String) {
cell.setCellValue((String) field);
} else if (field instanceof Integer) {
cell.setCellValue((Integer) field);
}
}
}
try {
FileOutputStream outputStream = new FileOutputStream(FILE_NAME);
workbook.write(outputStream);
workbook.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Done");
}
}

Append String to file with Callback

I'm reading data from a DB and like to appended each row of data from the DB using a Callback. I've managed to get the Callback working but I don't know how I will get it append the data to file. Here is my code.
Main
public class Main {
public static void main(String[] args) {
FileIO fileIO = new FileIO();
fileIO.writeRStoFile();
}
}
FileIO
public class FileIO implements DBAccess.CallBack {
public void writeRStoFile() {
DBAccess dbAccess = new DBAccess(this);
String fileName = "/result.csv";
try (FileWriter fw = new FileWriter(fileName)) {
System.out.println("Starting data download from DB...");
dbAccess.readDB();
// HERE I LIKE TO APPEND EACH ROW TO THE FILE
fw.append('\n');
System.out.println("Finished data download from DB...");
} catch (IOException e) {
e.printStackTrace();
}
}
#Override
public void iAmDone(String row) {
System.out.println("Row: " + row);
}
}
DBAccess
public class DBAccess {
public interface CallBack {
public void iAmDone(String row);
}
private final CallBack callBack;
public DBAccess(CallBack callBack) {
this.callBack = callBack;
}
public void readDB() {
String url = "jdbc:Cobol:////Dev/Project Files/DatAndCpyFiles";
try (Connection con = DriverManager.getConnection(url, "", "");
Statement stmt = con.createStatement())
{
stmt.setFetchSize(10);
Class.forName("com.hxtt.sql.cobol.CobolDriver").newInstance();
String sql = "select * from PROFS";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int iNumCols = resultSetMetaData.getColumnCount();
for (int i = 1; i <= iNumCols; i++) {
callBack.iAmDone(resultSetMetaData.getColumnLabel(i) + ";");
}
String field;
while (rs.next()) {
String row = "";
for (int i = 1; i <= iNumCols; i++) {
field = rs.getString(i);
field = field.trim() + ";";
row = row + field;
}
callBack.iAmDone(row);
}
rs.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
I'm not sure how I get the data from iAmDone() into the writeRStoFile() method. I'm able to print the data to the console.
One way that I can think of is to declare fw as a member variable in FileIO. That way you can call fw.append(...) in iAmDone. (You might have to change the try-with-resources then.)

Continuously getting content from table database

I have a code here:
package testcode;
import java.sql.*;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ProducerClear2 {
public static String vardbserver;
public static String vardbuser;
public static String vardbpassword;
public static String vardbname;
public static void main(String[] args) {
vardbserver = "TestDBtoMQ";
vardbuser = "postgresql";
vardbpassword = "admin";
ConnectionFactory factory = null;
javax.jms.Connection connection = null;
Session session = null;
Destination destination = null;
MessageProducer producer = null;
try {
factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_BROKER_URL);
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("TestQueue");
producer = session.createProducer(destination);
Class.forName("org.postgresql.Driver");
System.out.println("----------------------------");
try (Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/" + vardbserver, vardbuser, vardbpassword);
PreparedStatement stmt = c.prepareStatement("SELECT * FROM MESSAGES where xmin::varchar::bigint > ? and xmin::varchar::bigint < ? ");
PreparedStatement max = c.prepareStatement("select max(xmin::varchar::bigint) as txid from messages")
) {
c.setAutoCommit(false);
Long previousTxId = 0L;
Long nextTxId = 0L;
while (true) {
stmt.clearParameters();
try (ResultSet rs = max.executeQuery()) {
if (rs.next()) {
nextTxId = rs.getLong(1);
}
}
stmt.setLong(1, previousTxId);
stmt.setLong(2, nextTxId + 1);
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String message = rs.getString("MESSAGE");
System.out.println("Message = " + message);
TextMessage mssg = session.createTextMessage(message);
System.out.println("Sent: " + mssg.getText());
producer.send(mssg);
}
previousTxId = nextTxId;
}
Thread.sleep(5000);
}
}
} catch (JMSException e) {
e.printStackTrace();
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
} finally {
if (session != null) {
try {
session.close();
} catch (JMSException ex) {
// ignore
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
// ignore
}
}
}
System.out.println("----------------------------");
System.out.println("Message sent successfully");
}
}
Basically, the app works to get contents inside a database's table and sent it to ActiveMQ. And when the table updated, it will sent the content that just updated (not sending the past that was sent). But this code only works on PostgreSQL
Then i'm planning to create an "if" function. So i can use another database to getting the data (Oracle and MySQL).
Is the xmin still works for Oracle and MySQL? So i just need to change the server URL? Or i need to change the code for Oracle and MySQL?
Simply found the answer, using limit, save it's every limit row to a file and use a date for every daily file....
if(vardbtype.equals("MYSQL")){
Class.forName("com.mysql.jdbc.Driver");
System.out.println("----------------------------");
int limitrowmysql = 0;
LocalDate now = LocalDate.now();
Path path = FileSystems.getDefault().getPath("C:\\Users\\NN\\Documents\\Test\\RowMYSQL\\RowIDMYSQL_" + now.format(DateTimeFormatter.ISO_LOCAL_DATE) + ".txt");
if (Files.exists(path)) {
String latestRowIdFromFile = Files.lines(path).max((e1, e2) -> {
if (((String)e1).isEmpty() || ((String)e2).isEmpty()) {
return -1;
}
return new Long(e1).compareTo(new Long(e2));
}).get(); // read latestRowId from file
if (latestRowIdFromFile != null && !latestRowIdFromFile.isEmpty()) {
limitrowmysql = Integer.valueOf(latestRowIdFromFile);
}
} else {
limitrowmysql = 0;
}
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/"+ vardbserver, vardbuser, vardbpassword);
while(true) {
Statement stmts = c.createStatement();
int countrowmysql = 0;
String sql = ("SELECT * FROM "+ vardbname +" LIMIT "+ limitrowmysql +", 18446744073709551615");
ResultSet rss = stmts.executeQuery(sql);
while(rss.next()) {
String message = rss.getString("MESSAGE");
System.out.println("Message = " + message);
TextMessage mssg = session.createTextMessage(message);
System.out.println("Sent: " + mssg.getText());
producer.send(mssg);
countrowmysql = countrowmysql + 1;
}
rss.close();
stmts.close();
Thread.sleep(batchperiod2);
limitrowmysql = limitrowmysql + countrowmysql;
Files.write(path, ("\n" + limitrowmysql).getBytes()); // write latestRowId to file
}
}

Write Time In MySQL

I'm using Java code to randomly create pins for 6000 entries. Currently its taking 3 min 27 sec to write to the database. I would like to know if you can decrease the write time to the database
Database has an auto_increment field as well as a pin field which is a string.
public class DonkeyInsert {
/**
* #param args the command line arguments
* #throws java.sql.SQLException
*/
public static void main(String[] args) throws SQLException {
// TODO code application logic here
Connection conn = new DBConnection().connect();
for (int i = 1; i <= 6000; i++) {
Random rand = new Random();
// create a Statement from the connection
Statement statement = conn.createStatement();
// insert the data
int k = rand.nextInt(Integer.SIZE - 1);
k = (k + 1) * 9999;
String pin = Integer.toString(k);
try {
String sql = "INSERT INTO login (login_id,pin) VALUES (" + i + "," + pin + ");";
statement.executeUpdate(sql);
} catch (SQLException se) {
System.out.println(se);
}
}
}
}
Try this and see if it's faster. The changes I've made should help:
package persistence;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
/**
* DonkeyInsert changes
* #author Michael
* #link https://stackoverflow.com/questions/32551895/write-time-in-mysql?noredirect=1#comment52959887_32551895
* #since 9/13/2015 12:49 PM
*/
public class DonkeyInsert {
public static final int DEFAULT__RECORD_COUNT = 6000;
private Random random;
public DonkeyInsert() {
this.random = new Random();
}
public DonkeyInsert(long seed) {
this.random = new Random(seed);
}
public static void main(String[] args) {
// I'd externalize these so I could change the database without recompiling.
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://hostname:3306/dbname";
String username = "username";
String password = "password";
Connection connection = null;
try {
DonkeyInsert donkeyInsert = new DonkeyInsert();
connection = createConnection(driver, url, username, password);
int numRowsInserted = donkeyInsert.insertPins(connection, DEFAULT__RECORD_COUNT);
System.out.println(String.format("# pins inserted: %d", numRowsInserted));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(connection);
}
}
private static final String INSERT_SQL = "INSERT INTO login(pin) VALUES(?) ";
public int insertPins(Connection connection, int count) {
int numInserted = 0;
if (count > 0) {
PreparedStatement ps = null;
try {
ps = connection.prepareStatement(INSERT_SQL);
for (int i = 0; i < count; ++i) {
ps.setString(1, this.createRandomPin());
ps.addBatch();
}
int [] counts = ps.executeBatch();
for (int rowCount : counts) {
numInserted += rowCount;
}
} catch (SQLException e) {
throw new RuntimeException("SQL exception caught while inserting pins", e);
} finally {
close(ps);
}
}
return numInserted;
}
public String createRandomPin() {
// Changed it a bit. Didn't understand your requirement.
int k = this.random.nextInt(Integer.MAX_VALUE);
return Integer.toString(k);
}
public static Connection createConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException {
Class.forName(driver);
if ((username == null) || (password == null) || (username.trim().length() == 0) || (password.trim().length() == 0)) {
return DriverManager.getConnection(url);
} else {
return DriverManager.getConnection(url, username, password);
}
}
public static void close(Connection connection) {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Statement st) {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

Display Records From MySQL Database using JTable in Java

I want to connect a JTable to a ResultSet from a MySQL database so I can view the data.
I am looking for some links or code snippets describing this task. I'm using the Netbeans IDE..
Below is a class which will accomplish the very basics of what you want to do when reading data from a MySQL database into a JTable in Java.
import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableFromMySqlDatabase extends JFrame
{
public TableFromMySqlDatabase()
{
ArrayList columnNames = new ArrayList();
ArrayList data = new ArrayList();
// Connect to an MySQL Database, run query, get result set
String url = "jdbc:mysql://localhost:3306/yourdb";
String userid = "root";
String password = "sesame";
String sql = "SELECT * FROM animals";
// Java SE 7 has try-with-resources
// This will ensure that the sql objects are closed when the program
// is finished with them
try (Connection connection = DriverManager.getConnection( url, userid, password );
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery( sql ))
{
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
// Get column names
for (int i = 1; i <= columns; i++)
{
columnNames.add( md.getColumnName(i) );
}
// Get row data
while (rs.next())
{
ArrayList row = new ArrayList(columns);
for (int i = 1; i <= columns; i++)
{
row.add( rs.getObject(i) );
}
data.add( row );
}
}
catch (SQLException e)
{
System.out.println( e.getMessage() );
}
// Create Vectors and copy over elements from ArrayLists to them
// Vector is deprecated but I am using them in this example to keep
// things simple - the best practice would be to create a custom defined
// class which inherits from the AbstractTableModel class
Vector columnNamesVector = new Vector();
Vector dataVector = new Vector();
for (int i = 0; i < data.size(); i++)
{
ArrayList subArray = (ArrayList)data.get(i);
Vector subVector = new Vector();
for (int j = 0; j < subArray.size(); j++)
{
subVector.add(subArray.get(j));
}
dataVector.add(subVector);
}
for (int i = 0; i < columnNames.size(); i++ )
columnNamesVector.add(columnNames.get(i));
// Create table with database data
JTable table = new JTable(dataVector, columnNamesVector)
{
public Class getColumnClass(int column)
{
for (int row = 0; row < getRowCount(); row++)
{
Object o = getValueAt(row, column);
if (o != null)
{
return o.getClass();
}
}
return Object.class;
}
};
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
JPanel buttonPanel = new JPanel();
getContentPane().add( buttonPanel, BorderLayout.SOUTH );
}
public static void main(String[] args)
{
TableFromMySqlDatabase frame = new TableFromMySqlDatabase();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
}
}
In the NetBeans IDE which you are using - you will need to add the MySQL JDBC Driver in Project Properties as I display here:
Otherwise the code will throw an SQLException stating that the driver cannot be found.
Now in my example, yourdb is the name of the database and animals is the name of the table that I am performing a query against.
Here is what will be output:
Parting note:
You stated that you were a novice and needed some help understanding some of the basic classes and concepts of Java. I will list a few here, but remember you can always browse the docs on Oracle's site.
ArrayList
Vector
Try-with-resources statement
this is the easy way to do that you just need to download the jar file "rs2xml.jar" add it to your project
and do that :
1- creat a connection
2- statment and resultset
3- creat a jtable
4- give the result set to DbUtils.resultSetToTableModel(rs)
as define in this methode you well get your jtable so easy.
public void afficherAll(String tableName){
String sql="select * from "+tableName;
try {
stmt=con.createStatement();
rs=stmt.executeQuery(sql);
tbContTable.setModel(DbUtils.resultSetToTableModel(rs));
} catch (SQLException e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, e);
}
}
If you need to work a lot with database in your code and you know the structure of your table, I suggest you do it as follow:
First of all you can define a class which will help you to make objects capable of keeping your table rows data. For example in my project I created a class named Document.java to keep data of a single document from my database and I made an array list of these objects to keep data of my table which is gain by a query.
package financialdocuments;
import java.lang.*;
import java.util.HashMap;
/**
*
* #author Administrator
*/
public class Document {
private int document_number;
private boolean document_type;
private boolean document_status;
private StringBuilder document_date;
private StringBuilder document_statement;
private int document_code_number;
private int document_employee_number;
private int document_client_number;
private String document_employee_name;
private String document_client_name;
private long document_amount;
private long document_payment_amount;
HashMap<Integer,Activity> document_activity_hashmap;
public Document(int dn,boolean dt,boolean ds,String dd,String dst,int dcon,int den,int dcln,long da,String dena,String dcna){
document_date = new StringBuilder(dd);
document_date.setLength(10);
document_date.setCharAt(4, '.');
document_date.setCharAt(7, '.');
document_statement = new StringBuilder(dst);
document_statement.setLength(50);
document_number = dn;
document_type = dt;
document_status = ds;
document_code_number = dcon;
document_employee_number = den;
document_client_number = dcln;
document_amount = da;
document_employee_name = dena;
document_client_name = dcna;
document_payment_amount = 0;
document_activity_hashmap = new HashMap<>();
}
public Document(int dn,boolean dt,boolean ds, long dpa){
document_number = dn;
document_type = dt;
document_status = ds;
document_payment_amount = dpa;
document_activity_hashmap = new HashMap<>();
}
// Print document information
public void printDocumentInformation (){
System.out.println("Document Number:" + document_number);
System.out.println("Document Date:" + document_date);
System.out.println("Document Type:" + document_type);
System.out.println("Document Status:" + document_status);
System.out.println("Document Statement:" + document_statement);
System.out.println("Document Code Number:" + document_code_number);
System.out.println("Document Client Number:" + document_client_number);
System.out.println("Document Employee Number:" + document_employee_number);
System.out.println("Document Amount:" + document_amount);
System.out.println("Document Payment Amount:" + document_payment_amount);
System.out.println("Document Employee Name:" + document_employee_name);
System.out.println("Document Client Name:" + document_client_name);
}
}
Second of all, you can define a class to handle your database needs. For example I defined a class named DataBase.java which handles my connections to the database and my needed queries. And I instantiated an objected of it in my main class.
package financialdocuments;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* #author Administrator
*/
public class DataBase {
/**
*
* Defining parameters and strings that are going to be used
*
*/
//Connection connect;
// Tables which their datas are extracted at the beginning
HashMap<Integer,String> code_table;
HashMap<Integer,String> activity_table;
HashMap<Integer,String> client_table;
HashMap<Integer,String> employee_table;
// Resultset Returned by queries
private ResultSet result;
// Strings needed to set connection
String url = "jdbc:mysql://localhost:3306/financial_documents?useUnicode=yes&characterEncoding=UTF-8";
String dbName = "financial_documents";
String driver = "com.mysql.jdbc.Driver";
String userName = "root";
String password = "";
public DataBase(){
code_table = new HashMap<>();
activity_table = new HashMap<>();
client_table = new HashMap<>();
employee_table = new HashMap<>();
Initialize();
}
/**
* Set variables and objects for this class.
*/
private void Initialize(){
System.out.println("Loading driver...");
try {
Class.forName(driver);
System.out.println("Driver loaded!");
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Cannot find the driver in the classpath!", e);
}
System.out.println("Connecting database...");
try (Connection connect = DriverManager.getConnection(url,userName,password)) {
System.out.println("Database connected!");
//Get tables' information
selectCodeTableQueryArray(connect);
// System.out.println("HshMap Print:");
// printCodeTableQueryArray();
selectActivityTableQueryArray(connect);
// System.out.println("HshMap Print:");
// printActivityTableQueryArray();
selectClientTableQueryArray(connect);
// System.out.println("HshMap Print:");
// printClientTableQueryArray();
selectEmployeeTableQueryArray(connect);
// System.out.println("HshMap Print:");
// printEmployeeTableQueryArray();
connect.close();
}catch (SQLException e) {
throw new IllegalStateException("Cannot connect the database!", e);
}
}
/**
* Write Queries
* #param s
* #return
*/
public boolean insertQuery(String s){
boolean ret = false;
System.out.println("Loading driver...");
try {
Class.forName(driver);
System.out.println("Driver loaded!");
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Cannot find the driver in the classpath!", e);
}
System.out.println("Connecting database...");
try (Connection connect = DriverManager.getConnection(url,userName,password)) {
System.out.println("Database connected!");
//Set tables' information
try {
Statement st = connect.createStatement();
int val = st.executeUpdate(s);
if(val==1){
System.out.print("Successfully inserted value");
ret = true;
}
else{
System.out.print("Unsuccessful insertion");
ret = false;
}
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
}
connect.close();
}catch (SQLException e) {
throw new IllegalStateException("Cannot connect the database!", e);
}
return ret;
}
/**
* Query needed to get code table's data
* #param c
* #return
*/
private void selectCodeTableQueryArray(Connection c) {
try {
Statement st = c.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM code;");
while (res.next()) {
int id = res.getInt("code_number");
String msg = res.getString("code_statement");
code_table.put(id, msg);
}
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void printCodeTableQueryArray() {
for (HashMap.Entry<Integer ,String> entry : code_table.entrySet()){
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
}
/**
* Query needed to get activity table's data
* #param c
* #return
*/
private void selectActivityTableQueryArray(Connection c) {
try {
Statement st = c.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM activity;");
while (res.next()) {
int id = res.getInt("activity_number");
String msg = res.getString("activity_statement");
activity_table.put(id, msg);
}
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void printActivityTableQueryArray() {
for (HashMap.Entry<Integer ,String> entry : activity_table.entrySet()){
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
}
/**
* Query needed to get client table's data
* #param c
* #return
*/
private void selectClientTableQueryArray(Connection c) {
try {
Statement st = c.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM client;");
while (res.next()) {
int id = res.getInt("client_number");
String msg = res.getString("client_full_name");
client_table.put(id, msg);
}
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void printClientTableQueryArray() {
for (HashMap.Entry<Integer ,String> entry : client_table.entrySet()){
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
}
/**
* Query needed to get activity table's data
* #param c
* #return
*/
private void selectEmployeeTableQueryArray(Connection c) {
try {
Statement st = c.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM employee;");
while (res.next()) {
int id = res.getInt("employee_number");
String msg = res.getString("employee_full_name");
employee_table.put(id, msg);
}
st.close();
} catch (SQLException ex) {
Logger.getLogger(DataBase.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void printEmployeeTableQueryArray() {
for (HashMap.Entry<Integer ,String> entry : employee_table.entrySet()){
System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}
}
}
I hope this could be a little help.

Categories