Java e DB impostazioni base

di il
3 risposte

Java e DB impostazioni base

Ciao a tutti
Premessa :Sono agli inizi sia con java che con SQL
Sono riuscito a collegare il mio primo programma java ad un DB creato con MariaDB. Ho fatto la mia prima select e alcuni inserti... Però vorrei impostare ben fin da subito il mio programmino di prova e capire come sia negli organizzare java.
Non vi chiedo il codice, ma proprio la migliore pianificazione ed organizzazione.
Per esempio...
Volendo avere un solo punto dove inserire i dati di connessione al DB, in modo che se devo modificarle lo possa fare una volta sola e non dimentico qua e la altre modifiche, cime mi conviene impostare ? Creo una classe ad hoc ?

Inizialmente pensavo di creare una classe generica per l'inserimento dei dati, ma avendo ogni tabella un numero diverso di colonne la cosa diventa ardua. Avete indicazioni da darmi ?

Grazie
Andrea

3 Risposte

  • Re: Java e DB impostazioni base

    Ciao!

    molti usano una classe ad hoc con proprietà statiche.
    ad esempio:
    
    public class Config {
    
        public static String HOST = "...";
        public static String USERNAME = "...";
        public static String PASSWORD = "...";
    }
    
    ho visto che questa modalità è molto usata nelle app per android.

    sennò potresti usare un file di properties, stando attento a non mettere i dati in chiaro dentro al file.
    salvi solo l'hash.
    in questo modo non hai le password in chiaro salvate da nessuna parte (neanche dentro al codice).
  • Re: Java e DB impostazioni base

    Grazie
    quindi ero sulla strada giusta.
    per quanto riguarda hash... dovrò capire come crearla e gestirla

    per l'inserimento dei dati in una tabella, devo crearne una per ogni tabella, c'è qualche "trucco" per crearne una che si adegui alle dimensioni della tabella di destinazione ?
    nel senso... se devo inserire un dato nella colonna "colonna1" in una tabella "PIPPO" che ha solo ID e Colonna1 posso creare una cosa del tipo :
    
    ...
    public class InserisciDB {
    
    	// va a prendere i parametri di configurazione da Config.java
    	private static final String DB_DRIVER = Config.DB_DRIVER;
    	private static final String DB_CONNECTION = Config.DB_CONNECTION;
    	private static final String DB_USER = Config.DB_USER;
    	private static final String DB_PASSWORD = Config.DB_PASSWORD;
    
    public void insert(String newIns, String colonna){			
    		
    	try {
    			insertRecordIntoTable(newIns, colonna);
    
    		} catch (SQLException e) {
    
    			System.out.println(e.getMessage());
    
    		}
    	}
    
    private static void insertRecordIntoTable(String newIns, String colonna) throws SQLException {
    
    		Connection dbConnection = null;
    		PreparedStatement preparedStatement = null;
    		String insertTableSQL = "INSERT INTO `PIPPO`(`" + colonna + "`) VALUES ('" + newIns + "')";
    		
    		try {
    			dbConnection = getDBConnection();
    			preparedStatement = dbConnection.prepareStatement(insertTableSQL);
    			// execute insert SQL stetement
    			preparedStatement.executeUpdate();
    ...		
    
    quindi con il seguente codice posso utilizzare il metodo insert per inserire ciò che volgio
    
    ...
    public class TestIns {
    	private String nome;
    	static final String COLONNA = "ingrediente";
    
    
    	public void setNome(String nome){
    		InserisciDB ins = new InserisciDB();
    		ins.insert(nome, COLONNA);
    ...
    
    ma se avessi un altra tabella con 3 colonne ?
    devo fare una classe o un metodo ad hoc o c'è modo appunto di creare qualcosa di più dinamico ?

    grazie mille
    Andrea
  • Re: Java e DB impostazioni base

    Secondo me ti stai complicando la vita.

    io nel mio progetto ho fatto così
    Fare una boundary con tutti i metodi che ti servono per aggiungere, rimuovere, selezionare o aggiornare dati nella tua base dati.

    Molti puristi del java mi daranno addosso perché no ho usato i PreparedStatement, ma io mi trovo bene così e il mio progetto funziona correttamente.

    Ovviamente ho usato molti oggetti e la connessione la realizzo con i dati provenienti da un file INI cosìcché quando devo cambiare parametri non ho bisogno di toccare codice sorgente.
    
    public class LinkDB {
    	private Connection c;
    	...
    	...
    	public LinkDB(){
    		Parameters p=ReadIni.getParameter();
    		c=DriverManager.getConnection(p.getUrl2()+System.getProperty("user.dir")+p.getPath());
    		logger.debug("Connessione al DB - ["+ c.hashCode()+"]...");	
    	}
    
    
    	public int AggiornaScoresMan(int idPartita, int idPlayer, int idSquadra, String minuto, int autogol, int rigore, String comments) {
    		int res=-1;
    		try{
    			Statement  s = c.createStatement();
    			String insertMarcatori="INSERT INTO Segnature(partita, giocatore, squadra, minuto, autogol, rigore, commenti)values("+idPartita+","+idPlayer+", "+idSquadra+", '"+minuto+"',"+autogol+", "+rigore+", '"+comments+"')";
    			res = s.executeUpdate(insertMarcatori);
    			s.close();
    		}
    
    		catch(SQLException e){
    			System.err.println(e);
    		}
    		return res;
    	}
    
    
    
    
    	public LinkedList<PenalizedTeam> getAllPenalizedTeam(){	
    		LinkedList<PenalizedTeam> list=new LinkedList<PenalizedTeam>();
    		try{
    			Statement  s = c.createStatement();
    
    			String sql="";
    			sql+=" SELECT B.idsquadra, B.nome, B.logo, A.decurtazione, A.commenti";
    			sql+=" FROM Penalizzazioni A, Squadre B";
    			sql+=" WHERE B.idSquadra=A.idSquadra";
    			sql+=" ORDER BY B.idSquadra";
    
    
    			ResultSet  r = s.executeQuery(sql);
    
    			while(r.next())
    			{
    				list.add(new PenalizedTeam(r.getInt("idsquadra"), r.getString("nome"), r.getString("logo"), r.getInt("decurtazione") , r.getString("commenti")));
    			}
    
    			r.close();
    			s.close();
    
    		}
    
    		catch(SQLException e){
    			e.printStackTrace();
    		}
    
    		return list;
    	}
    
    
    
    
    	public int setFinalResult(Risultato partita){
    		int res=-1;
    		try{
    			Statement  s = c.createStatement();
    			String result = "UPDATE Partite set RisultatoA="+partita.getGol1()+" , RisultatoB="+partita.getGol2()+", disputata=1 where ID="+partita.getIdPartita();
    			res = s.executeUpdate(result);
    			s.close();
    		}
    		catch(SQLException e) {
    			System.err.println(e);
    		}
    
    		return res;
    	}
    
    	public int deleteHTMLPageIntoDB(int id) {
    		int ret =-1;
    		try{
    			Statement  s = c.createStatement();
    			String query="";
    			query += " DELETE FROM HTMLContents";
    			query += " WHERE idpartita="+id;
    
    			ret = s.executeUpdate(query);
    		}
    
    		catch(SQLException e){
    			e.printStackTrace();
    		}
    		catch(Exception ex){
    			ex.printStackTrace();
    		}
    
    		return ret;	
    
    
    	}
    
    	public void closeConnection(){
    		try{
    			c.close();
    			logger.debug("Chiusura connessione al DB - ["+c.hashCode()+"]");
    		}
    		catch(SQLException sqlex){
    			sqlex.printStackTrace();
    			logger.debug("Errore chiusura connessione al DB - ["+c.hashCode()+"]");
    		}
    	}
    
    
    ....
    ...
    ...
    
    
    }
    	
    

    e poi da un qualunque classe richiamo la boundary del DB
    
    LinkDB db=new LinkDB();
    db.deleteHTMLPageIntoDB(1);
    db.close
    
    Non capisco perché devi mettere anche la colonna quando sai come è costruita la tua base dati e le colonne che compongono una tabella.
    Ciao
Devi accedere o registrarti per scrivere nel forum
3 risposte