2017-03-08 1 views
-1

Hallo Leute Ich habe eine App mit mehreren Profilen ("Admin", "Delegate"), und in meiner Datenbank habe ich die gleichen Benutzer, um Operationen zu machen. Ich möchte den Datenbankbenutzer mit einer ComboBox festlegen, wo sich Benutzer anmelden und diese Daten über alle meine Datenbankaufrufe gemäß dem Benutzerprofil verwenden.Einstellung mehrerer Benutzer/Passwort für Verbindungsklasse

Meine Verbindungsdaten werden in einer Verbindungsklasse SQL hartcodiert wie:

public class SQL { 

private PreparedStatement PStatement; 
private Connection connection; 
private String user; 
private String pass; 


public String getUser() { 
    return user; 
} 

public void setUser(String user) { 
    this.user = user; 
} 

public String getPass() { 
    return pass; 
} 

public void setPass(String pass) { 
    this.pass = pass; 
} 

public Connection dbConection() { 

    String loggedUser = "root" ; 
    String loggedUserPass = ""; 

    try { 
     Class.forName(cf.DB_DRIVER); 
     connection = DriverManager.getConnection(cf.SERVER_URL + cf.SERVER_DB, loggedUser, loggedUserPass); 

     if (connection == null) { 
      throw new SQLException("Connection no established"); 
     }    
     return connection; 

    } catch (ClassNotFoundException | SQLException e) { 

     JOptionPane.showMessageDialog(null, e.getMessage(), cf.WINDOW_TITLE, JOptionPane.ERROR_MESSAGE);    
    } 
    return connection; 
} 

Jedes Mal, wenn ich meine DAOs benutzte ich die SQL-Klasse aufrufen müssen:

public int insert(Users user) throws SQLException { 
    SQL sql = new SQL(); 
    query = sql.createPStatement(cf.INSERT_USER_DATA); 
    query.setInt(1, user.getUserId()); 
    query.setInt(2, user.getUserCencos()); 
    query.setInt(3, user.getUserProfile()); 
    query.setString(4, user.getUserPassword()); 
    query.setString(5, user.getUserName()); 
    query.setString(6, user.getUserPosition()); 
    query.setString(7, user.getUserOffice()); 
    try { 
     result = query.executeUpdate(); 
    } catch (SQLException | NumberFormatException e) { 
     throw e; 
    } finally { 
     SQLUtils.closeQuietly(sql.dbConection()); 
     SQLUtils.closeQuietly(query); 
    } 
    return result; 
} 

Aber jedes Mal instanziiert ich, es Nimmt die Hardcoded-Werte.

Wie kann ich die Connect-Daten user und password überschreiben die "gebrannte" Verbindung Strings in der SQL-Klasse ?.

Vielen Dank für Ihre Hilfe zu diesem Neuling Kollegen Programmierer.

+0

Entfernen Sie 'String loggedUser =" root ";' und 'String loggedUserPass =" ";', ersetzen Sie sie stattdessen mit 'user' und' pass' – MadProgrammer

Antwort

0

Ich habe eine Klasse cf mit öffentlichen statischen Variablen.

public class cf {  

public static String DB_USER; 
public static String DB_PASSWORD; 
public static String INV_DEL="delegado"; 
public static String INV_DELXXX="123"; 
public static String A_="root"; 
public static String A_XXX=""; 
getter and setter... 

public static void setLogin(String profile){ 

    switch(profile){    
     case "Admin": 
      cf.setDB_USER(cf.A_); 
      cf.setDB_PASSWORD(cf.A_XXX); 
     break;  

     case "Delegado": 
      cf.setDB_USER(cf.INV_DEL); 
      cf.setDB_PASSWORD(cf.INV_DELXXX); 
     break;   
    } 

} 

Also in meiner SQL-Klasse verwende ich die statischen Variablen anstelle der Instanzvariablen. So

public Connection dbConection() { 

try { 
     Class.forName(cf.DB_DRIVER); 
     connection = DriverManager.getConnection(cf.SERVER_URL + cf.SERVER_DB, cf.getDB_USER(), cf.getDB_PASSWORD()); 
    more SQL stuff... 
} 

, wenn der Benutzer Login mit dem Knopf im comboBox, so dass ich die statischen Variablen,

private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) {   

profile = profileComBoBox.getSelectedItem().toString();   
    setLogin(profile); 
do login stuff...  
} 

Ist das nicht elegant, aber ist irgendwann zu starten.

Verwandte Themen