1

我正在执行一个查询并将结果放入 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;
}
4

2 回答 2

2

您需要在代码中考虑的几件事:

  1. 您正在通过 JDBCHelper 关闭连接,这意味着 JDBCHelper 中应该有一个方法来抽象出获取连接的细节。

  2. 由于您不是动态创建查询,因此不需要使用 StringBuffer/StringBuilder。常规字符串对您的情况很有效。

  3. sbjson变量被初始化两次,一次在顶部,然后再次在 try 块中。只需在顶部声明这些变量并在使用它们的位置初始化它们。

  4. 您应该在 while 循环之前降低jsonjsArray的初始化,并在循环之后降低数据的初始化。

于 2013-06-19T23:06:54.550 回答
1

没有上下文,基于两个假设对我来说看起来不错:

1) 连接是从连接池中获得的。使用模式似乎表明情况如此。但是您需要阅读 DBConnect 的文档并进行验证。

2) 查询是参数化的。您希望将值直接连接到 SQL 中。那是低效和不安全的。您的查询已设置为参数化。

一些小评论:

1)看起来'conn','rs','ps'都是类的字段。我看不出有必要。如果您将它们设置为局部变量,您的类将变得无状态 - 更易于阅读和维护。最好按照其他人的建议声明使用它们的变量。

2)这里的StringBuffer(或StringBuilder)是矫枉过正的。

于 2013-06-19T23:31:37.667 回答