PDA

Visualizza versione completa : [JDBC] problemi con createStatement


Alhazred
14-07-2008, 19.11.47
Ho dei problemi con l'istruzione "Statement stmt = conn.createStatement();" presente nel seguente codice, mi ritorna sempre una nullpointerexception e non capisco il perché, ho già usato lo stesso codice in passato su un altro progetto ed ha sempre funzionato, ho anche provato a tirarlo fuori di nuovo per vedere se magari non fosse un problema di mysql o tomacat sul pc visto che li ho reinstallati e potevo aver sbagliato qualcosa, invece il vecchio progetto funziona correttamente.
Sapreste darmi una mano?

public class AccountDAO {
public static boolean login(String username, String password)
{
try
{
ConnectionManager connection = ConnectionManager.getInstance();
Connection conn = connection.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = null;
rs = stmt.executeQuery("SELECT username, password FROM account WHERE username='"+username+"' AND password='"+password+"';");
if(rs.next() == false)
return false;
return true;
}
catch (SQLException ex)
{
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
return false;
}
}

Questo è il ConnectionManager, lo uso su un altro progetto, cambia solo il nome del database nell'istruzione
conn = DriverManager.getConnection("jdbc:mysql://localhost/ricettelastminute?user=root&password=root");
bookshop al posto di ricettelastminute.

bookshop funziona senza problemi.

import java.sql.*;

public class ConnectionManager
{
/**
* La singola istanza del ConnectionManager.
*/
private static ConnectionManager instance = null;

/**
* La connessione al database.
*/
private static Connection conn = null;

/**
* Consente di ottenere l'unica istanza della classe.
*
* Il metodo è sincronizzato per gestire chiamate concorrenti da più thread.
*
* @return l'unica istanza del ConnectionManager
*/
public static synchronized ConnectionManager getInstance()
{
if (instance == null)
instance = new ConnectionManager();

return instance;
}

/**
* Invocato al momento della distruzione dell'oggetto.
*
* Rilascia la connessione creata nel momento di creazione dell'istanza dell'oggetto.
*/
protected void finalize()
{
try
{
if (conn != null)
conn.close();
}
catch (SQLException ex)
{
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}

/**
* Restituisce la connessione al database.
*
* @return la connessione al database
*/
public Connection getConnection()
{
return conn;
}

/**
* Costruttore della classe.
*
* Il costruttore è reso privato in accordo al pattern Singleton
*/
private ConnectionManager()
{
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost/ricettelastminute?user=root&password=root");
}
catch (SQLException ex)
{
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
catch (Exception ex)
{
System.out.println("Exception: " + ex.getMessage());
}
}
}

shadowDK
15-07-2008, 09.00.39
In questa riga, dove crei la connessione:
conn = DriverManager.getConnection("jdbc:mysql://localhost/ricettelastminute?user=root&password=root");
non bisogna inserire anche la porta su cui "gira" il database? di solito è 3306, ma potendo anche essere un'altra non è obbligatorio specificarla? intendo, loclhost:3306...

Alhazred
15-07-2008, 09.58.24
Grazie per la risposta.
No, il problema non era la porta non specificata, ma il fatto che mysql-connector...ecc. non era stato importato in web-inf\lib, quindi DriverManager non riusciva a stabilire una connessione con il db e ritornava null al ConnectionManager.