DATABASE
Hai ragione è sbagliato usare SERIAL e poi scrivere gli indici. Così è molto meglio:
INSERT INTO utenti (id, nome, password) VALUES
(DEFAULT, 'Topolino', '...'),
(DEFAULT, 'Pippo', '...'),
(DEFAULT, 'Pluto', '...'),
(DEFAULT, 'Paperino', '...');
E' tutto scritto qui:
http://www.postgresqltutorial.com/postgresql-serial. Ti ringrazio moltissimo.
Ho letto qualcosa su FOREIGN KEY e mi sembra di capire che mi stai consigliando di valutare questa opzione:
CREATE TABLE utenti (
id SERIAL PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
UNIQUE (nome)
);
CREATE TABLE spostamenti (
id SERIAL PRIMARY KEY,
id_utente INT NOT NULL,
latitudine DOUBLE PRECISION NOT NULL,
longitudine DOUBLE PRECISION NOT NULL,
tempo TIMESTAMP NOT NULL,
velocita DOUBLE PRECISION,
FOREIGN KEY (id_utente) REFERENCES utenti (id)
);
Se ho capito bene, correggimi se sbaglio, la riga seguente:
FOREIGN KEY (id_utente) REFERENCES utenti (id)
ricorda al database che id_utente ed id sono legate.
A questa pagina:
leggo questo:
1.nella tabella secondaria (nel mio caso spostamenti), inserisco una nuova riga o modifico la chiave esterna. Si noti che la cancellazione di una riga dalla tabella secondaria non viola mai il vincolo di chiave esterna;
2.nella tabella principale, cancello una riga o modifico la chiave riferita. Si noti che l'inserimento di una nuova riga dalla tabella principale non viola mai il vincolo di chiave esterna.
e la cosa mi scoraggia per questi motivi:
a.Un utente può avere più posizioni diverse ovvero ad un id possono corrispondere diverse righe nella tabella spostamenti.
b.Potrei decidere di eliminare un utente e tutte le sue posizioni dal database.
Quesiti:
alfa.Ho compreso a fondo il quesito?
beta.
Mi consigli di usare oppure no FOREIGN KEY?
CODICE JAVA
Ho notato che il processo di lettura, modifica, inserimento e cancellazione di informazioni dal DB è simile così mi stavo chiedendo se era possibile creare un unico metodo per fare tutto. Ovviamente non proprio tutto quanto ma almeno il 90% delle query.
Stavo pensando ad un metodo di questo tipo:
public void queryGenerica(Connection connessione, String query, String… valoriQuery, String... leggiColonne) throws SQLException {}
query potrebbe essere la semplice query con i punti interrogativi (esempio:
"SELECT * FROM utenti WHERE id = ?;") mentre
valoriQuery le stringhe da sostituire ai relativi "?" e da verificare con i vari setQualchecosa() (perdona il linguaggio poco ortodosso...).
leggiColonne le colonne da leggere e da fornire a
next().
Inoltre sarebbe bello inserire in un unico file non annegato in una valanga di codice i dati di accesso al DB.
Altra cosa antipatica è creare ogni volta l'oggetto connessione.
Ecco il mio codice:
import java.sql.*;
public class Main {
static {
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
private final String url = "jdbc:postgresql://192.168.99.103:5432/gis";
private final String user = "eb";
private final String password = "password";
public Connection connect() {
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
System.out.println("Connesso al server PostgreSQL con successo.");
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return conn;
}
public void doQuery(Connection conn, Integer p1) throws SQLException {
PreparedStatement ps = null;
try {
String query = "SELECT * FROM utenti";
if (p1 != null) {
query = query + " WHERE id = ?";
ps = conn.prepareStatement(query);
ps.setInt(1, p1);
} else {
ps = conn.prepareStatement(query);
}
readAndProcessData(ps.executeQuery());
} catch (Exception e){
System.out.println("Impossibile connettersi al database oppure preparare la query.");
} finally {
try {
if (ps != null) ps.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public void readAndProcessData(ResultSet rs) throws SQLException {
try {
String id, nome, password;
while (rs.next()) {
id = rs.getString("id");
nome = rs.getString("nome");
password = rs.getString("password");
System.out.println(id + " " + nome + " " + " " + password);
}
} finally {
try {
rs.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
System.out.println("Studio di PostgreSQL");
Main Main = new Main();
Connection connessione = Main.connect();
try {
Main.doQuery(connessione, 1);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Quesiti:
gamma.Dovrei lavorare con i generic?
delta.Potrebbe essere una cosa fattibile?
epsilon.
C'è già qualcosa di pronto da qualche parte?
Grazie