我正在执行查询并将结果放入JSONObject以将其返回到EXTJS页面。代码有效,但我不确定这是否是最好或最有效的方法。我会发布我的代码,看看我是否需要改进它以及在哪里。我是新鲜的程序员,所以借口明显的错误。提前谢谢。
public JSONObject execQuery(String invoice, String id){
StringBuffer sb = new StringBuffer();
JSONObject json = new JSONObject();
JSONObject data = new JSONObject();
JSONArray jsArray = new JSONArray();
try{
// get conn
conn = DBConnect.getInstance().dbOracleConnect();
// create query
sb = new StringBuffer("SELECT * FROM table ");
sb.append("WHERE rtrim(invoice) = ? AND ");
sb.append("id = ? ");
ps = conn.prepareStatement(sb.toString());
ps.setString(1, invoice);
ps.setString(2, id);
rs = ps.executeQuery();
while(rs.next()){
json = new JSONObject();
json.put("invoice", rs.getString("invoice"));
json.put("id", rs.getString("id"));
json.put("name", rs.getString("name"));
json.put("gender", rs.getString("gender"));
jsArray.put(json);
// out put will be like [{"invoice":"111", "id":"123", "name":"sam", "gender":"male"}, {...}]
}
data.put("data", jsArray);
// out put will be like {"data":[{"invoice":"111", "id":"123", "name":"sam", "gender":"male"}, {...}]}
}
catch(Exception e){
System.out.println("Error: " + e.toString());
}
finally {
JDBCHelper.close(rs);
JDBCHelper.close(ps);
JDBCHelper.close(conn);
}
return data;
}
答案 0 :(得分:2)
您需要在代码中考虑以下几点:
您正在通过JDBCHelper关闭连接,这意味着JDBCHelper中应该有一个方法来抽象出获取连接的细节。
由于您没有动态创建查询,因此不需要使用StringBuffer / StringBuilder。常规字符串对您的情况有效。
sb和json变量被启动两次,一次在顶部,然后再次在try块中。只需在顶部声明这些变量并在使用它们的地方初始化它们。
答案 1 :(得分:1)
没有上下文,基于两个假设看起来很好:
1)连接是从连接池中获得的。使用模式似乎表明情况就是这样。但您需要阅读DBConnect的文档并验证。
2)查询参数化。您 NOT 希望将值直接连接到SQL中。这是低效和不安全的。您的查询已设置为参数化。
一些小评论:
1)看起来'conn','rs','ps'都是该类的所有字段。我没有看到需要。如果将它们设置为局部变量,则您的类将变为无状态 - 更易于阅读和维护。甚至可以更好地声明其他人建议使用的变量。
2)StringBuffer(或StringBuilder)这里有点矫枉过正。