Ho letto una breve dispensa su PostgreSQL e ho provato ad aggiungere una classe al mio progetto per fare una semplice query:
SELECT * FROM utenti WHERE id = 1
Il mio database è questo:
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
);
INSERT INTO utenti (id, nome, password) VALUES
(1, 'Topolino', '...'),
(2, 'Pippo', '...'),
(3, 'Pluto', '...'),
(4, 'Paperino', '...');
Sono riuscito a connettermi al database ma non a leggere i dati che volevo:
package web1;
import java.sql.*;
// Questa classe serve per gestire PostgreSQL
public class PostgreSQL {
// PASSO 1
// Si inizializza il driver JDBC per gestire PostgreSQL (1 volta sola).
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";
// PASSO 2
// Si crea un oggetto per la creazione di una connessione.
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;
}
// PASSO 3
// Scrivo una query nel database
public void doQuery(Connection conn, String p1) throws SQLException {
PreparedStatement ps = null;
try {
String query = "SELECT * FROM utenti";
if (p1 != null) {
query = query + " WHERE id = ?";
ps = conn.prepareStatement(query);
// setString() accetta 2 parametri:
// Il primo indica la posizione del "?" nella query;
// Se ci sono 2 "?" ci sono due setString(), il primo è setString(1,...) e il secondo setString(2,...);
// Il secondo parametro indica la stringa da sostituire a "?";
ps.setString(1, p1);
} else {
ps = conn.prepareStatement(query);
}
readAndProcessData(ps.executeQuery());
} finally {
try {
if (ps != null) ps.close();
} catch (Exception e) {
// Si genera questa eccezione quando la classe perde la connessione al database.
// Cosa scrivo qui dentro ????!!!!!?????!!!!?????
}
}
}
// Si leggono i dati ottenuti dal database
public void readAndProcessData(ResultSet rs) throws SQLException {
try {
while (rs.next()) {
System.out.println(
rs.getString("id") + " " +
rs.getString("nome") + " " +
rs.getString("password") + "\n"
);
}
} finally {
try {
// Si chiude la connessione dopo ogni operazione per non sovraccaricare la memoria del server.
rs.close();
} catch (Exception e) {
// Si genera questa eccezione quando la classe perde la connessione al database.
// ????
}
}
}
}
Nella Servlet ho scritto questo:
<%@ page import="web1.PostgreSQL" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%
PostgreSQL PostgreSQL = new PostgreSQL();
Connection connessione = PostgreSQL.connect();
try {
PostgreSQL.doQuery(connessione, "1");
} catch (SQLException e) {
e.printStackTrace();
}
%>
Questo è l'errore:
Suggerimento: No operator matches the given name and argument type(s). You might need to add explicit type casts.