Come Connettersi a Mysql con le Servlet Java, Database e JDBC
Posted by Santarelli Luca | Filed under Java Servlet

Oggi andremo a costruire una servlet che ci garantisce la connessione al database MYSQL(”cambiando la jdbc,a qualsiasi altro dbms”)per tutte le altre servlets, ovvero una libreria di connessione che ci permetta di interfacciarci con lo strato jdbc per l’accesso al database.Normalmente, ovvero la prima cosa che ci verrebbe da fare è creare una connessione per ogni servlet, ovvero ripetere con molta ridondanza le specifiche di connessione, SBAGLIATO, o meglio, è un metodo molto grezzo che appesantisce soltanto il codice, ma iniziamo per passi. Per prima cosa dobbiamo accertarci di avere la libreria jdbc(in questo caso per mysql) installta, quindi andiamo nel nostro progetto e alla voce libraries vediamo se è presente la libreria mysql jdbc driver caricata, nel caso non ci fosse netbeans dalla versione 6 ci offre questa libreria già nel bundle di installazione, per questo basterà richiamarla cliccando su libraries->add library e scegliendola dal elenco la avremo inclusa nel progetto.Per adesso senza fronzoli passiamo alla creazione della servlet di connessione.
Creazione della Servlet per la connessione al Database
Creiamo una nuova servlet:Source Package->left click->new Servlet e chiamiamola come vogliamo es: DataAccess. Creata la servlet cancelliamo tutto il codice al suo interno, e sostituiamolo con questo:
package project;
import com.mysql.jdbc.Connection;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
*
* @author katone
*/public class DataAccess {
//Creazione singleton
private static DataAccess connessione = null;public synchronized static DataAccess newDataAccess() throws ServletException {
if (connessione == null) connessione = new DataAccess();
return connessione;
}
private Connection c = null;//costruttore privato della classe DataAccess
private DataAccess() throws ServletException {
try {
Class.forName(”com.mysql.jdbc.Driver”);
c = (Connection) DriverManager.getConnection(”jdbc:mysql://<[host]>/<[db_name]>”,”<[db_user]>”,”<[db_user_pass]>”);
}catch(ClassNotFoundException e) {
e.printStackTrace();
throw new ServletException(”Errore di caricamento driver database”,e);
} catch(SQLException e) {
e.printStackTrace();
throw new ServletException(”Errore di connessione al database”,e);
}
}//Chiusura della connesione col db
protected void finalize() throws Throwable {
super.finalize();
if (c!=null) c.close();
}}
Ovviamente dovrete sostituire a
- <[host]>: Il nome del Host sul quale gira il server mysql(”es:localhost”)
- <[db_name]>Nome del database al quale connettersi
- <[db_user]><[db_pass]>:L’utente che è abilitato all’accesso su tale macchina
La Classe di connessione è abbastanza chiara, basta leggerla attentamente, che si capisce cosa si è fatto, abbiamo solo aperto un canale di comunicazione tra la servlet e il database, da questo momento potremo fare tutte le query che vogliamo, ovviamente adesso voi direte, ma come?
Come richiamare la connessione a Mysql nelle altre servlet!
Supponiamo di avere un altra servlet e di voler abilitare la connessione al database, allora dobbiamo richiamare il costruttore per preparare la connessione nella nuova servlet:
public void init() throws ServletException {
super.init();
connection=DataAccess.newDataAccess();
}
In questo modo la variabile connection funzionerà da resource di connessione, ovvero sarà il nostro canale di comunicazione verso il database dalla quale faremo passare le interazioni che vogliamo fare, esempio:
String sql = “select * from users WHERE username=’” + username + “‘ and password=MD5(’” + password + “‘)”;
ResultSet rs = connection.GenericQuery(sql);
while (rs.next()) {
if (rs.getString(”username”) != null) {
session.setAttribute(”username”, rs.getString(”username”));
session.setAttribute(”diritti”, rs.getString(”diritti”));
}
}
Ma cos’è il metodo GenericQuery?
Come avete visto ho applicato un metodo alla variabile connection di tipo DataAccess, infatti Ho fatto una cosa in più che ancora vi ho detto, ovvero ho creato anche delle query generiche dentro la servlet di connessione, quindi per non avere errori dovrete inserire questo metodo nella Servlet di connessione
public ResultSet GenericQuery(String _sql){
Statement s = null;
ResultSet r;
try{
s = (Statement) c.createStatement();
r = s.executeQuery(_sql);
return r;
}catch (SQLException e) {
e.printStackTrace();
return null;
}
}
Con questo metodo evito di costruirmi e gestirmi ogni volta la query, obbligatorio in java, w le eccezzioni, avendo come risultato del metodo il riferimento nel buffer della query, ovvero il ResultSet, che andrò a manipolare dalla parte dell’altra servlet, ovviamente potrete gestire metodi molto più complicati che restituicono liste oggetti….cosa che dirò nei prossimi articoli .Provate a crearvi questa connessione e gestirla per problemi postate ciò che volete…
No related posts.
Articoli correlati elaborati dal plugin Yet Another Related Posts.
Tags: Java, Programmare
Scritto da Santarelli Luca lunedì, 2nd febbraio , 2009 19:25 Letture:« Leggere un File XML con PHP | Guida all’uso dei template con Freemarker e java servlets »
4 Responses to “Come Connettersi a Mysql con le Servlet Java, Database e JDBC”
-
duffimc Says:
dicembre 11th, 2009 at 10:58Ciao, ottima guida ho solo un problema, dopo aver realizzato e compilato la classe DataAccess e messa insieme alle altre mie servlet (sono tutte nello stesso package) quando in una delle mie servlet inserisco il metodo init() per richiamare la connessione alla linea
connection = DataAccess.newDataAccess();
il compilatore mi dice:
cannot find symbol
symbol : variable DataAccess
location: class servlet.SessionServlet
connection=DataAccess.newDataAccess();
^
Quale potrebbe essere il problema??
Grazie per l’aiuto.
ciao
duffimc -
admin Says:
gennaio 8th, 2010 at 01:25Hai dichiarato la variabile Globalmente?
-
Riccardo Says:
maggio 2nd, 2010 at 15:53Un suggerimento: non converrebbe creare una servlet ABSTRACT che si occupa di creare la connessione (e di definire il metodo accessorio per le query) attraverso il metodo da te descritto e di richimarlo nel metodo init. In questo modo tutte le Servlet che estenderanno quest’ultima munita di connessione avranno al loro interno l’attributo connessione statico e potranno utilizzarlo direttamente.
-
admin Says:
maggio 13th, 2010 at 21:56Certo, è un bel appunto sicuramente più pratico dell’attuale metodo, se vuoi posta direttamente l’esempio per gli altri! un altra strategia starebbe anche nell’includere tale connessione in un listner. grazie ciao
blogflux