在Java中,最好避免显式使用数据库列名,数据类型等吗?

时间:2016-03-19 03:33:35

标签: java jdbc

从数据库表中获取结果时,避免显式使用(硬编码)数据库列标题,数据类型等是否是更好的做法?我得到的是 - 假装我更好地了解数据库的结构方式并让程序解决(从而使其更长更复杂),或者只是使用它是完美的它直接在代码中(或者可能将大多数信息列为类顶部的常量)?

例如,有两种从表中检索数据的方法。

简单的方法是:

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));
         }
    }
}

第一种方式是短暂而甜蜜的,但另一种方式感觉......更聪明(?)。

是否有合理的理由以艰难的方式做事,或者我只是过于复杂化了事情?

2 个答案:

答案 0 :(得分:-1)

我想没有关于哪种方法更好的固定规则,因情况而异。如果你有一个只有两列的表,那么对列名称进行硬编码是有意义的,而不必经历遍历循环的麻烦。

但是如果你有一个假设有40列的表,那么代码就会变得丑陋/难以读取硬编码值,在这种情况下你可以选择加入迭代方法

答案 1 :(得分:-1)

除非你正在编写一个通用中间件,否则你无法避免它。在任何应用程序中的某个时刻,您必须将数据库列值存储到语言变量中,或者反之亦然,此时您需要知道列名并将其写入代码中。