从数据库表中获取结果时,避免显式使用(硬编码)数据库列标题,数据类型等是否是更好的做法?我得到的是 - 假装我更好地了解数据库的结构方式并让程序解决(从而使其更长更复杂),或者只是使用它是完美的它直接在代码中(或者可能将大多数信息列为类顶部的常量)?
例如,有两种从表中检索数据的方法。
简单的方法是:
ArrayList<String> userNames = new ArrayList<>();
ArrayList<Blob> profilePictures = new ArrayList<>();
// this method presumes that there are columns named user_name and
// profile_picture and that they hold string and blob values
// respectively
while(resultSet.next()) {
userNames.add(resultSet.getString("user_name"));
profilePictures.add(resultSet.getBlob("profile_picture"));
}
......而另一种方式是:
ResultSetMetaData meta = resultSet.getMetaData();
ArrayList<String> columnHeaders = new ArrayList<>();
// doesn't know what the column headers are
for (int i = 1; i <= meta.getColumnCount(); i++) {
columnHeaders.add(meta.getColumnName(i));
}
ArrayList<ArrayList<Object>> data = new ArrayList<>();
for(int i=0; i<columnHeaders.size(); i++) {
data.add(new ArrayList<Object>());
}
for(int i=0; resultSet.next(); i++) {
for (String header : columnHeaders) {
// no presuming what the data type will be
int type = meta.getColumnType(i);
if(type == Types.VARCHAR) {
data.get(i).add(resultSet.getString(header));
} else if(type == Types.BLOB) {
data.get(i).add(resultSet.getBlob(header));
}
}
}
第一种方式是短暂而甜蜜的,但另一种方式感觉......更聪明(?)。
是否有合理的理由以艰难的方式做事,或者我只是过于复杂化了事情?
答案 0 :(得分:-1)
我想没有关于哪种方法更好的固定规则,因情况而异。如果你有一个只有两列的表,那么对列名称进行硬编码是有意义的,而不必经历遍历循环的麻烦。
但是如果你有一个假设有40列的表,那么代码就会变得丑陋/难以读取硬编码值,在这种情况下你可以选择加入迭代方法
答案 1 :(得分:-1)
除非你正在编写一个通用中间件,否则你无法避免它。在任何应用程序中的某个时刻,您必须将数据库列值存储到语言变量中,或者反之亦然,此时您需要知道列名并将其写入代码中。