Один базовый метод 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;
}