将Java类成员列表保存为字符串的正确方法

时间:2015-04-09 12:42:20

标签: java

执行此操作的唯一方法可能是保留静态最终字符串列表,但如果有人有任何想法,欢迎它。

我有一个POJO和一个数据库表。列(属性)与POJO的类成员相同。我想避免(这是一个相当大的程序)编写 getColumn("username") ,而是编写类似 getColumn(UserPOJO.getUsername().getActualMemberNameInAString())

的内容

我能想到的唯一方法是让UserPOJO类只包含静态变量,并在我在类中添加成员时更新它。第二个选项是将所有属性都作为枚举,但我认为这在很多层次上都很糟糕。

我想要的是获取与getter方法对应的成员名称的方法。某种反思?

要解决的问题是巨大的代码库中的拼写错误。我在这里过分强调,因为我收到了不是我要求的评论和答案。

请注意,我没有使用任何框架或ORM工具。我正在使用Graph数据库将所有列映射到Vertex,然后您需要执行.getProperty(string s)来获取Object。我在代码中很多

2 个答案:

答案 0 :(得分:0)

您有多种选择:

如果你只需要一次名字,我就不会为他们创造常数了。

在你的一条评论中,你曾经说过你会在很多地方使用它,你可以创建一个将所有字符串存储为常量的类。至少你会避免拼写错误,你的代码也不会乱七八糟。

你可以使用反射,但这会使事情过于复杂(在我看来)。

我不会排除使用枚举作为选项。 This SO answer解释得更好,然后我就可以做到......

答案 1 :(得分:0)

我对这个问题的理解是,当你的底层数据库表发生变化时,你想要最少的代码更改。

所以让我把它作为,说我有一个表格信息

CREATE TABLE Info (
field1 INTEGER ,
field2 VARCHAR(1)
);

我希望将来可以添加field3然后我需要一个解决方案 我不需要添加额外的代码来获取field3的信息。

请确认理解是否正确?如果是,那么你可以使用以下策略

/**
 * generic Method for executing Any RAW SQL Query.
 * for e.g. sql = "select * from Info"; 
 */


 public List<Map<String,String>> executeQuery(String sql) throws Exception {
        logger.info("executing SQL  = "+sql);
        List<Map<String,String>> resultList = new ArrayList<Map<String, String>>();
        Statement statement=null;
        ResultSet resultSet=null;
        ResultSetMetaData metaData = null;
        try{
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            metaData = resultSet.getMetaData();
            int noOfColumns = metaData.getColumnCount();
            while(resultSet.next()){
                Map<String,String> row = new HashMap<String, String>();
                for(int i =1;i<=noOfColumns;i++){
                    row.put(metaData.getColumnName(i), resultSet.getString(metaData.getColumnName(i)));
                }
                resultList.add(row);
            }
        } catch (SQLException e) {
            throw new Exception(" Exception while executing query on database. Reason  "+e.getMessage());
        }
        finally {
            closeResources(statement, resultSet);
        }
        return resultList;
    }

输入String sql = "select * from Info";在这里,您将获得Info表的所有记录,其中包含键值对,其中key建议columnNamevalue建议{{1 }}

这和动态一样好,即使我们添加额外的列,我们也会在Map中获取该信息,也不需要使用任何框架