Один базовый метод executeQuery или один для каждого запроса

Я начал создавать 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, Но я чувствую, что застрял немного. Может ли кто-нибудь привести меня на правильный путь с примером или чем-то?

3 ответа

Если я правильно понимаю вашу проблему!, вам нужно передать список объектов ToDoListModel для вставки в БД, используя метод insertItem.

То, как вы передаете свой объект для вставки элементов, на самом деле не имеет значения, но вы должны учитывать, насколько одновременно работает этот DataMapper. Если к нему одновременно могут обращаться несколько потоков, вы в конечном итоге создадите несколько соединений БД, что не так дорого. Ваш код на самом деле работает без каких-либо проблем в последовательном доступе.

Таким образом, вы можете добавить синхронизированный блок к созданию соединения и сделать синглтон класса DataMapper.

Это зависит от того, как работает приложение. Если за короткое время у вас будет много обращений к базам данных, было бы лучше объединить их и использовать одно и то же соединение с базой данных для всех запросов, чтобы уменьшить накладные расходы на установление и очистку соединения.

Если у вас есть только одиночные запросы с большими интервалами, вы можете сделать это таким образом.

Вам также следует подумать, хотите ли вы разделить слой базы данных и пользовательский интерфейс (если есть). В этом случае вы не должны сдавать ResultSet до пользовательского интерфейса, но оберните данные в независимый контейнер и передайте это через ваше приложение.

Хорошо, в этом случае, что вы можете сделать, это сначала создать ArrayList hashmap. который содержит ключ, значение в качестве имени столбца и значение столбца. После этого вы можете создать свою модель.

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;
}
Другие вопросы по тегам