我有几种方法可以做同样的事情,当与MySQL数据库连接时,保存或加载不同类型的参数.目前,我对每种类型都有不同的方法.如何组合这些方法以便它们支持不同类型?
下面是两个非常相似但使用不同类型的方法的示例:
public static void saveLongArray(Connection con, int playerID, String tableName, String fieldName, long[] array, long[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setLong(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving a long array!", ex);
}
}
public static void saveIntArray(Connection con, int playerID, String tableName, String fieldName, int[] array, int[] originalArray) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
updateQuery.setInt(3, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving an int array!", ex);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,在该示例中,类型都是数字.在类型完全不同的情况下(例如int和String),我可以做些什么来避免接近重复的方法?
kor*_*fey 13
您可以在此处应用策略模式.
interface TypeDependentBehavior<T> {
void setFieldValue(PreparedStatement st, T value);
}
interface StringBehavior extends TypeDependentBehavior<String> {
void setFieldValue(PreparedStatement st, String value) {
st.setString(3, value);
}
}
interface IntBehavior extends TypeDependentBehavior<Integer> {
void setFieldValue(PreparedStatement st, Integer value) {
st.setInt(3, value);
}
}
Run Code Online (Sandbox Code Playgroud)
.....
public static void saveArray<T>(Connection con, int playerID, String tableName, String fieldName, T[] array, T[] originalArray, TypeDependentBehavior<T> behavior) {
try {
for (int i = 0; i < array.length; i++) {
// Check for change before running query
if (array[i] != originalArray[i]) {
if (array[i] != 0 && array[i] != -1) {
PreparedStatement updateQuery = con.prepareStatement("REPLACE INTO `" + tableName + "` (`player_id`, `index`, `" + fieldName + "`) VALUES(?, ?, ?)");
updateQuery.setInt(1, playerID);
updateQuery.setInt(2, i);
behavior.setFieldValue(updateQuery, array[i]);
updateQuery.execute();
} else {
PreparedStatement deleteQuery = con.prepareStatement("DELETE FROM `" + tableName + "` WHERE `player_id` = ? AND `index` = ?");
deleteQuery.setInt(1, playerID);
deleteQuery.setInt(2, i);
deleteQuery.execute();
}
originalArray[i] = array[i];
}
}
} catch (SQLException ex) {
Logger.getLogger(PlayerSaveHandler.class.getName()).log(Level.SEVERE, "SQL Exception while saving an int array!", ex);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6411 次 |
| 最近记录: |