一个基本的executeQuery方法或每个查询一个

时间:2013-04-19 08:33:28

标签: java database-connection datamapper

我已经开始创建一个toDoList,我想创建一个“DataMapper”来向我的数据库发送查询。

我创建了这个Datamapper来为我处理事情,但我不知道在这种情况下我的思维方式是否正确。在我的Datamapper中,我只创建了一个必须执行查询的方法和几个知道要触发的查询的方法(以最小化打开和关闭方法)。

例如我有这个:

public Object insertItem(String value) {

    this.value = value;

    String insertQuery = "INSERT INTO toDoList(item,datum) " + "VALUES ('" + value + "', CURDATE())";

    return this.executeQuery(insertQuery);
}

public Object removeItem(int id) {

    this.itemId = id;
    String deleteQuery = "DELETE FROM test WHERE id ='" + itemId + "'";

    return this.executeQuery(deleteQuery);

}

private ResultSet executeQuery(String query) {

    this.query = query;
    Connection con = null;
    Statement st = null;
    ResultSet rs = null;
    try {

        con = db.connectToAndQueryDatabase(database, user, password);

        st = con.createStatement();
        st.executeUpdate(query);
    } 
    catch (SQLException e1) {
        e1.printStackTrace();
    }
    finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e2) { /* ignored */}
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e2) { /* ignored */}
            }                       
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e2) { /* ignored */}
            }
            System.out.println("connection closed");
     }
    return rs;
}

所以现在我不知道返回这样的ResultSet是否正确。我想做像

这样的事情
public ArrayList<ToDoListModel> getModel() {    
    return null;
}

插入ArrayList中返回的每条记录。但我觉得我有点陷入困境。有人可以用一个例子或其他东西引导我走正确的方式吗?

3 个答案:

答案 0 :(得分:0)

这取决于应用程序的工作方式。如果您在短时间内有大量数据库命中,最好将它们捆绑在一起并为所有查询使用相同的数据库连接,以减少连接建立和清理的开销。

如果你只有较大的单一查询,你就可以这样做。

您还应该考虑是否要分离数据库层和用户界面(如果存在)。 在这种情况下,您不应将ResultSet传递给用户界面,而是将数据包装在一个独立的容器中,并将其传递给您的应用程序。

答案 1 :(得分:0)

如果我理解你的问题!你需要传递一个ToDoListModel对象列表 使用 insertItem 方法插入到数据库中。

如何传递对象以插入项目实际上并不重要,但您需要考虑的是此DataMapper的并发工作方式,如果一次可以由多个线程访问,您将最终创建多个数据库连接是有点贵。你的代码实际上在顺序访问中没有任何问题。

因此,您可以为连接创建添加一个synchronized块,并使DataMapper类成为单例。

答案 2 :(得分:0)

好的,在这种情况下你可以做的是,首先创建一个hashmap的ArrayList。其中包含Key,Value as Column name和Column value。之后,您可以创建模型。

public List convertResultSetToArrayList(ResultSet rs) throws SQLException{
ResultSetMetaData mdata = rs.getMetaData();
int columns = mdata.getColumnCount();
ArrayList list = new ArrayList();
while (rs.next()){
    HashMap row = new HashMap(columns);
    for(int i=1; i<=columns; ++i){           
   row.put(md.getColumnName(i),rs.getObject(i));
}
   list.add(row);
}

return list;
}