0

我已经开始创建一个 toDoList,我喜欢创建一个“DataMapper”来触发对我的数据库的查询。

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

例如我有这个:

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。但我觉得我有点卡住了。有人可以通过示例或其他方式引导我走向正确的道路吗?

4

3 回答 3

0

好的,在这种情况下,你可以做的是,首先创建一个 hashmap 的 ArrayList。其中包含键、值作为列名和列值。之后,您可以创建模型。

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;
}
于 2013-04-19T16:27:00.093 回答
0

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

如果您只有较大间隔的单个查询,您可以这样做。

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

于 2013-04-19T09:02:24.907 回答
0

如果我正确理解您的问题!,您需要使用insertItem方法传递 ToDoListModel 对象列表以插入数据库。

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

因此,您可以在连接创建中添加同步块并使 DataMapper 类单例。

于 2013-04-19T09:02:51.267 回答