执行此操作的唯一方法可能是保留静态最终字符串列表,但如果有人有任何想法,欢迎它。
我有一个POJO和一个数据库表。列(属性)与POJO的类成员相同。我想避免(这是一个相当大的程序)编写 getColumn("username")
,而是编写类似 getColumn(UserPOJO.getUsername().getActualMemberNameInAString())
我能想到的唯一方法是让UserPOJO类只包含静态变量,并在我在类中添加成员时更新它。第二个选项是将所有属性都作为枚举,但我认为这在很多层次上都很糟糕。
我想要的是获取与getter方法对应的成员名称的方法。某种反思?
要解决的问题是巨大的代码库中的拼写错误。我在这里过分强调,因为我收到了不是我要求的评论和答案。
请注意,我没有使用任何框架或ORM工具。我正在使用Graph数据库将所有列映射到Vertex,然后您需要执行.getProperty(string s)来获取Object。我在代码中很多次
答案 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
建议columnName
和value
建议{{1 }}
这和动态一样好,即使我们添加额外的列,我们也会在Map中获取该信息,也不需要使用任何框架