我有一些测试JavaFX应用程序,代码有很多类似于数据库的部分。 仅举例:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
let dateAsString = dateFormatter.string(from: datePickerView.date)
dateFormatter.dateFormat = "yyyy-MM-dd h:mm a"
let date = dateFormatter.date(from: dateAsString)
let DateIn12 = dateFormatter.string(from: date!)
print("12 hour formatted Date:", DateIn12)
所以我想用抽象方法updateDatabaseInfo创建一个抽象类SqlWorkClass。
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();
}
继承了SqlWorkClass的3个类 - DatabaseInsertClass,DatabaseUpdateClass和DatabaseSelectClass。 但问题是我必须为每个类使用不同的方法updateDatabaseInfo参数。
public abstract class SqlWorkClass {
public abstract void updateDatabaseInfo() throws ClassNotFoundException;
显然我无法做到这一点。那么我该如何解决这个问题呢?也许我应该使用接口或其他东西而不是抽象类?希望你的建议! 附:我使用Java 7。
答案 0 :(得分:1)
您可以在DatabaseInsertClass
,DatabaseUpdateClass
和DatabaseSelectClass
的构造函数中传递这些参数。这样您就可以使用没有参数的updateDatabaseInfo()
对于每个操作,您都必须创建一个新的类实例。
答案 1 :(得分:0)
如果您只想一次更新一条记录,可以使用HashMap
存储更新后的值,如下所示:
Map<String, String> data = new HashMap<>();
data.put('id', '112342');
data.put('name', 'CaveJohnson');
data.put('address', 'ApertureSciencesRoad');
然后你的抽象类方法将是:
public void updateDatabaseInfo(Map<String, String> updateData) throws ClassNotFoundException;
实现类甚至不需要知道数据头的名称:
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
}
}
答案 2 :(得分:0)
使用参数对象而不是参数列表。您的超类定义参数对象类,并将其用作方法的参数。然后子类实现特定的类:
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;
}
}
这里的优点是您不必依赖约定来获取参数类型和名称。您可以很好地定义特定类型的输入。
然后你会使用这样的类:
new DatabaseInsertClass().updateDatabaseInfo(new InsertInput(param1, param2));