这是在java中执行查询的好方法吗?

时间:2013-06-19 23:01:25

标签: java database json connection

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

2 个答案:

答案 0 :(得分:2)

您需要在代码中考虑以下几点:

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

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

  3. sb和json变量被启动两次,一次在顶部,然后再次在try块中。只需在顶部声明这些变量并在使用它们的地方初始化它们。

答案 1 :(得分:1)

没有上下文,基于两个假设看起来很好:

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

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

一些小评论:

1)看起来'conn','rs','ps'都是该类的所有字段。我没有看到需要。如果将它们设置为局部变量,则您的类将变为无状态 - 更易于阅读和维护。甚至可以更好地声明其他人建议使用的变量。

2)StringBuffer(或StringBuilder)这里有点矫枉过正。