Temat: Pobranie danych z bazy PSQL
Tabela w bazie:
CREATE TABLE raport(
c1 INT,
c2 INT,
c3 INT,
);
insert into raport values (1,1,1);
insert into raport values (1,2,3);
insert into raport values (3,6,7);
Klasa:
package wsb;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import wsb.core.sql.pgDbParams;
import wsb.core.sql.pgQuery;
import wsb.core.sql.pgSQL;
import wsb.core.sql.pgSQLConnectionType;
import wsb.core.sql.pgSQLException;
/**
* @author Marcin Mackiewicz / mmackiew@wsb.poznan.pl
*/
public class Dane extends JFrame {
private JTable tbl;
private ResultSet result;
/**
* Konstruktor klasy
*/
public Dane() {
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
przygotujTabele();
pobierzDane();
wykonajObliczeniaIZapiszDane();
zapiszDoPliku("/home/mmackiew/Pulpit/result.csv");
pack();
setLocationRelativeTo(null);
}
/**
* Przygotowanie modelu danych oraz ich prezentacji dla użytkownika
*/
private void przygotujTabele() {
// Model danych - przykładowo 3 kolumny + wynik z operacji na nich
DefaultTableModel model = new DefaultTableModel(
new Object[] {"Kolumna 1", "Kolumna 2", "Kolumna 3", "Wynik"},
0
);
// Tworzymy obiekt widoku danych dla uzytkownika
tbl = new JTable(model);
// Dodajemy go do okna
JScrollPane scroll = new JScrollPane(tbl);
tbl.setFillsViewportHeight(true);
getContentPane().add(scroll);
}
// Pobieranie danych z bazy
private void pobierzDane() {
// Nastawy do bazy danych/
pgDbParams param = new pgDbParams();
param.setHostname("localhost");
param.setPort(5432);
param.setDatabase("gl");
param.setEncoding("UTF-8");
param.setConnectionType(pgSQLConnectionType.PASSWORD);
param.setSchema("public");
param.setUsername("postgres");
param.setPassword("TWOJE TAJNE HASLO");
// Nawiazanie połączenia z bazą danych
pgSQL dbh = pgSQL.getInstance();
dbh.setParams(param);
try {
dbh.Connect();
} catch (pgSQLException ex) {
Logger.getLogger(Dane.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Błąd połączenia z bazą danych!");
}
// Zapytanie SQL
String sql = "SELECT c1, c2, c3 FROM raport";
// Wykonanie zapytania i przekazanie do resultset
try {
pgQuery sth = new pgQuery(sql);
sth.Execute();
result = sth.getResult();
} catch (SQLException ex) {
Logger.getLogger(Dane.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Błąd zapytania SQL\n\n" + ex.getMessage());
}
}
/**
* Wykonuje obliczenia na danych z resultset i zapisuje je w modelu danych
*/
private void wykonajObliczeniaIZapiszDane() {
try {
// Pobranie modelu z widoku dla użytkownika
DefaultTableModel model = (DefaultTableModel) tbl.getModel();
// Ustawiam kursor przed pierwszym wierszem
result.beforeFirst();
// Iteracja po wierszach
while (result.next()) {
/*
* Wykonywanie obliczeń na podstawie danych z kolumny (tu akurat dodawanie). Wynik zapisany
* do zmiennej
*/
int wynik = result.getInt("c1") + result.getInt("c2") + result.getInt("c3");
// Dodanie wiersza do modelu danych (kolumny z bazy + wynik operacji na nich
model.addRow(new Object[]{
result.getInt("c1"),
result.getInt("c2"),
result.getInt("c3"),
wynik
});
}
} catch (SQLException ex) {
Logger.getLogger(Dane.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Błąd przetwarzania danych SQL\n\n" + ex.getMessage());
}
}
/**
* Zapisanie danych do pliku. Każdy wiersz w modelu danych to oddzielna linia. Separatorem kolumy
* jest średnik. W pliku nie ma nagłówków kolumn.
* @param plik Ścieżka wraz z nazwą pliku do którego zapisać dane
*/
private void zapiszDoPliku(String plik) {
try {
// Tworzę uchwyt do pliku (ewentualnie nowy plik)
File f = new File(plik);
// Tworzę obiekt do zapisu danych
FileWriter fw = new FileWriter(f);
// Pobieram model z danymi z widoku dla użytkownika
DefaultTableModel model = (DefaultTableModel) tbl.getModel();
// Iteruję i tworzę linię w postaci string'a
for (int i = 0; i < model.getRowCount(); i++) {
String buffer = model.getValueAt(i, 0).toString() + ";" +
model.getValueAt(i, 1).toString() + ";" +
model.getValueAt(i, 2).toString() + ";" +
model.getValueAt(i, 3).toString() + "\n";
// Zapisuję danę
fw.write(buffer);
}
// Pamiętam aby rozłączyć się z plikiem po wykonaniu zapisu danych.
fw.close();
} catch (IOException ex) {
Logger.getLogger(Dane.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Tworzę JFrame dla potrzeb prezentacji danych - możesz pominąć.
JTable robi za warstę widoku danych - możesz pominąć.
Stworzyłem model danych odzwierciedlający tabelę rozszerzony o kolumnę wynik (DefaultTableModel model).
Pobrałem dane z bazy i przechowuję w ResultSet
Potem iteruję po ResultSet. W tej pętli wykonuję obliczenia i dodaję dane z bazy poszerzone o wynik.
Całość podzieliłem na metody wykonywane kolejno z konstrukora.
Dodałem też metodę zapisującą danę do pliku.
Klasy pgSQL, pgQuery itp to moje obiekty do łączenia się z PostgreSQL - nie znajdziesz ich nigdzie a ten kod musisz zastąpić własnym.