2017-09-18 11 views
1

J'ai une application de test JavaFX et le code a beaucoup de parties similaires concernant la base de données. Juste par exemple:Paramètres dans la méthode abstraite (Java 7)

Class.forName("com.mysql.jdbc.Driver"); 
    try (Connection connection = DriverManager.getConnection(Person.getURL(), Person.getDBUSERNAME(), Person.getDBPASSWORD())) { 
       String sqlQuery = "INSERT INTO users (users.user_name," + 
         "users.current_balance) VALUES (?, ?)"; 

       PreparedStatement preparedStatement = connection.prepareStatement(sqlQuery); 
       preparedStatement.setString(1, newUserName); 
       preparedStatement.setBigDecimal(2, new BigDecimal(newBalance)); 

       preparedStatement.executeUpdate(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

Je veux faire une SqlWorkClass de classe abstraite avec une méthode abstraite updateDatabaseInfo.

public abstract class SqlWorkClass { 
    public abstract void updateDatabaseInfo() throws ClassNotFoundException; 

et 3 classes héritées de SqlWorkClass - DatabaseInsertClass, DatabaseUpdateClass et DatabaseSelectClass. Mais le problème est que je dois utiliser différents paramètres pour la méthode updateDatabaseInfo pour chaque classe.

public class DatabaseInsertClass extends SqlWorkClass { 

    @Override 
    public void updateDatabaseInfo(String newUserName, String newBalance) throws ClassNotFoundException{ 
      //some actions with code above 
} 

public class DatabaseUpdateClass extends SqlWorkClass { 

    @Override 
    public void updateDatabaseInfo(String param1, String param2, String param3) throws ClassNotFoundException{ 
      //some actions with code above 
} 

public class DatabaseSelectClass extends SqlWorkClass { 

     @Override 
     public void updateDatabaseInfo(String param1) throws ClassNotFoundException{ 
       //some actions with code above 
    } 

Il est évident que je ne peux pas le faire. Alors, comment puis-je résoudre ce problème? Peut-être que je devrais utiliser l'interface ou quelque chose d'autre au lieu de la classe abstraite? J'espère pour vos conseils les gars! p.s. J'utilise Java 7.

+0

vous pouvez utiliser un objet '[]' tableau en tant que paramètre super typer et vous pouvez appeler le supermethod dans vos sous-classes comme celle-ci: 'super.updateDatabaseInfo (nouvel objet [] {param1, param2, ...})'. si la méthode doit faire la même chose pour les 3 sous-classes, pourquoi a-t-elle besoin d'un paramètre différent? – XtremeBaumer

Répondre

0

Utilisez un objet paramètre au lieu d'une liste de paramètres. Votre super classe définit la classe d'objet de paramètre et l'utilise comme paramètre pour la méthode. Les sous-classes, puis mettre en œuvre des classes spécifiques:

public abstract class SqlWorkClass<I extends Input> 
{ 
    public abstract void updateDatabaseInfo(I input) 
     throws ClassNotFoundException; 
} 
public abstract class Input {} 

public class DatabaseInsertClass 
    extends SqlWorkClass<InsertInput> 
{ 
    @Override 
    public void updateDatabaseInfo(InsertInput input) 
     throws ClassNotFoundException 
    { 
     String param1 = input.newUserName; 
     String param2 = input.newBalance; 
    } 
} 
public abstract class InsertInput 
    extends Input 
{ 
    public final String newUserName, newBalance; 

    public InsertInput(String newUserName, String newBalance) 
    { 
     this.newUserName = newUserName; 
     this.newBalance = newBalance; 
    } 
} 

L'avantage ici est que vous ne devez pas compter sur la convention pour obtenir les types de paramètres et les noms droite. Vous avez des entrées bien définies de types spécifiques.


Vous pouvez ensuite utiliser vos classes comme ceci:

new DatabaseInsertClass().updateDatabaseInfo(new InsertInput(param1, param2)); 
+0

Pourriez-vous m'expliquer un peu plus, s'il vous plaît? J'utilise l'exemple que vous me donnez, mais quel type de paramètres dois-je utiliser, quand j'appelle la méthode 'updateDatabaseInfo'? Je veux dire que j'essaie d'appeler la méthode de l'autre classe - 'DatabaseInsertClass(). UpdateDatabaseInfo (param1, param2);'. Quel type de 'param1' et' param2' devrais-je utiliser maintenant? On dirait que je ne peux pas utiliser 'String', mais que je dois utiliser le type' InsertInput'. Comment puis-je faire 'String' à' InsertInput'. – oiDistortion

+0

@oiDistortion J'ai ajouté un petit exemple de comment l'utiliser.Comme je l'ai dit, l'utilisation de ces types d'objets de paramètres vous indique exactement ce que vous devez transmettre: une insertion de base de données nécessite une entrée d'insertion. Vous créez une entrée d'insertion en appelant le constructeur avec 2 paramètres de chaîne. Utiliser de bons noms pour vos paramètres et/ou les documenter dans JavaDoc vous aidera à comprendre le code si vous y revenez dans un moment. –

0

Si vous êtes désireux de mettre à jour un enregistrement à la fois, vous pouvez utiliser un HashMap pour stocker vos valeurs mises à jour comme ceci:

Map<String, String> data = new HashMap<>(); 
data.put('id', '112342'); 
data.put('name', 'CaveJohnson'); 
data.put('address', 'ApertureSciencesRoad'); 

Et puis votre méthode classes abstraites serait :

public void updateDatabaseInfo(Map<String, String> updateData) throws ClassNotFoundException; 

cours de mise en œuvre ne même pas besoin de connaître le nom des en-têtes de données:

public void updateDatabaseInfo(Map<String, String> updateData) throws ClassNotFoundException{ 
    for(String key:updateData.keys()){ 
     //Use Prepared Statements to generate a query with `key` being your field 
     //name and `updateData.get(key)` being the value to place in that field 
    } 

} 
1

Vous pouvez transmettre ces paramètres dans les constructeurs DatabaseInsertClass, DatabaseUpdateClass et DatabaseSelectClass. De cette façon, vous pouvez utiliser updateDatabaseInfo() sans paramètres.
Pour chaque opération, vous devrez créer une nouvelle instance de vos classes.